From eb51d5677e73cbe8c22c8a386ef6833dec3f8e87 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 16:13:06 +0100 Subject: [PATCH 001/183] snap, version update --- .nf-core.yml | 2 +- CHANGELOG.md | 6 +++++- README.md | 5 ++--- assets/multiqc_config.yml | 2 +- nextflow.config | 2 +- ro-crate-metadata.json | 18 +++++++++--------- tests/default.nf.test.snap | 4 ++-- 7 files changed, 21 insertions(+), 18 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 662ad88c..f15c6cf9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -39,4 +39,4 @@ template: outdir: . skip_features: - fastqc - version: 1.0.0 + version: 1.1.0dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f89d7ad..e1e04cb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ 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.0.0dev - [date] +## v1.1.0 - [date] + + + +## v1.0.0 - [28 Nov 2025] Initial release of IntGenomicsLab/lrsomatic, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index cc18d01b..3a577e73 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # IntGenomicsLab/lrsomatic [![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) -[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/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) +[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) @@ -159,8 +159,7 @@ If you would like to contribute to this pipeline, please see the [contributing g ## Citations - - +If you use IntGenomicsLab/lrsomatic for your analysis, please cite it using the following doi: [10.5281/zenodo.17751829](https://doi.org/10.5281/zenodo.17751829) An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 4705d98d..95c83b7c 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,5 +1,5 @@ report_comment: > - This report has been generated by the IntGenomicsLab/lrsomatic analysis pipeline. + This report has been generated by the IntGenomicsLab/lrsomatic analysis pipeline. report_section_order: "IntGenomicsLab-lrsomatic-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 8b7c724c..b604225b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -344,7 +344,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'main' nextflowVersion = '!>=25.04.0' - version = '1.0.0' + version = '1.1.0dev' doi = '' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 67aa24f4..184415cf 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,8 +21,8 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "Stable", - "datePublished": "2025-11-28T12:51:54+00:00", + "creativeWorkStatus": "InProgress", + "datePublished": "2025-11-28T14:50:58+00:00", "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/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[![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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\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": [ { @@ -96,7 +96,7 @@ }, "mentions": [ { - "@id": "#abec6cbc-500e-43f6-bc1f-0f2530f2956d" + "@id": "#1ab0baa8-fedd-4ff3-867b-bf19e43d77c6" } ], "name": "IntGenomicsLab/lrsomatic" @@ -124,7 +124,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-11-28T13:51:54Z", + "dateModified": "2025-11-28T15:50:58Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -144,10 +144,10 @@ }, "url": [ "https://github.com/IntGenomicsLab/lrsomatic", - "https://nf-co.re/IntGenomicsLab/lrsomatic/1.0.0/" + "https://nf-co.re/IntGenomicsLab/lrsomatic/dev/" ], "version": [ - "1.0.0" + "1.1.0dev" ] }, { @@ -163,11 +163,11 @@ "version": "!>=25.04.0" }, { - "@id": "#abec6cbc-500e-43f6-bc1f-0f2530f2956d", + "@id": "#1ab0baa8-fedd-4ff3-867b-bf19e43d77c6", "@type": "TestSuite", "instance": [ { - "@id": "#7f53c2d3-49e7-4c7c-bec5-7e617642b3b6" + "@id": "#e32a6c88-125c-436a-bfa8-ea405ea002d5" } ], "mainEntity": { @@ -176,7 +176,7 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#7f53c2d3-49e7-4c7c-bec5-7e617642b3b6", + "@id": "#e32a6c88-125c-436a-bfa8-ea405ea002d5", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index e8071e7c..1c8662ed 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -82,7 +82,7 @@ "wget": "1.21.4" }, "Workflow": { - "IntGenomicsLab/lrsomatic": "v1.0.0" + "IntGenomicsLab/lrsomatic": "v1.1.0dev" } }, [ @@ -369,6 +369,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.0" }, - "timestamp": "2025-11-28T14:26:44.508445086" + "timestamp": "2025-11-28T16:07:44.541483428" } } \ No newline at end of file From b5938f2355188292f7219b1855a5033679bb7d40 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 28 Nov 2025 16:14:18 +0100 Subject: [PATCH 002/183] prettier --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1e04cb4..9d4c1dab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v1.1.0 - [date] - - ## v1.0.0 - [28 Nov 2025] Initial release of IntGenomicsLab/lrsomatic, created with the [nf-core](https://nf-co.re/) template. From 5b24d2098474ee8f6f4b54398a1e40615e25bcad Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 2 Dec 2025 15:53:55 +0100 Subject: [PATCH 003/183] view --- subworkflows/local/tumor_normal_happhase.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 91c7014c..7c32f267 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -212,12 +212,15 @@ workflow TUMOR_NORMAL_HAPPHASE { ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) + mixed_bams_vcf.view() + // Add index to channel mixed_bams_vcf .join(mixed_hapbams) .join(SAMTOOLS_INDEX.out.bai) .set{ mixed_hapbams } + mixed_hapbams.view() // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: haplotagged aligned bams // bais: indexes for bam files @@ -246,7 +249,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(LONGPHASE_PHASE.out.vcf) .join(LONGPHASE_PHASE.out.tbi) .set{tumor_normal_severus} - + tumor_normal_severus.view() // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files From 19b15b42a666520d72452fbd83372414a7aba4de Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 2 Dec 2025 16:08:54 +0100 Subject: [PATCH 004/183] view --- subworkflows/local/tumor_normal_happhase.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 7c32f267..a10f843d 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -163,6 +163,9 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams and type information // mix with the normal bams + tumor_bams.view() + LONGPHASE_PHASE.out.vcf.view() + tumor_bams .join(LONGPHASE_PHASE.out.vcf) .map { meta, bam, bai, vcf -> @@ -212,15 +215,12 @@ workflow TUMOR_NORMAL_HAPPHASE { ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) - mixed_bams_vcf.view() - // Add index to channel mixed_bams_vcf .join(mixed_hapbams) .join(SAMTOOLS_INDEX.out.bai) .set{ mixed_hapbams } - mixed_hapbams.view() // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: haplotagged aligned bams // bais: indexes for bam files @@ -249,7 +249,6 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(LONGPHASE_PHASE.out.vcf) .join(LONGPHASE_PHASE.out.tbi) .set{tumor_normal_severus} - tumor_normal_severus.view() // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files From 77ae92fdbeab4232546c6b83afde5f5a398010a7 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 2 Dec 2025 16:28:30 +0100 Subject: [PATCH 005/183] view --- subworkflows/local/tumor_normal_happhase.nf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index a10f843d..8e9778cb 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -22,6 +22,8 @@ workflow TUMOR_NORMAL_HAPPHASE { somatic_vep = Channel.empty() germline_vep = Channel.empty() + mixed_bams.view() + // Branch input bams in normal and tumour mixed_bams .branch{ meta, bam, bai -> @@ -39,7 +41,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [basecall_model, meta, file] } .set{downloaded_model_files} - + downloaded_model_files.view() mixed_bams.normal .map{ meta, bam, bai -> def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model @@ -53,6 +55,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ basecall_model, new_meta, bam, bai ] } .set { normal_bams_model } + normal_bams_model.view() normal_bams_model .combine(downloaded_model_files,by:0) @@ -61,6 +64,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, bam, bai, model, platform] } .set{ normal_bams } + normal_bams.view() // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -83,6 +87,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return[new_meta, bam, bai] } .set{ tumor_bams } + tumor_bams.view() // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams From ada3e8f5d42b84805e46864bff9e2ce7eca2d608 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 2 Dec 2025 16:53:17 +0100 Subject: [PATCH 006/183] channel fix --- subworkflows/local/tumor_normal_happhase.nf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 8e9778cb..83c7f3b2 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -23,7 +23,7 @@ workflow TUMOR_NORMAL_HAPPHASE { germline_vep = Channel.empty() mixed_bams.view() - + // Branch input bams in normal and tumour mixed_bams .branch{ meta, bam, bai -> @@ -50,7 +50,7 @@ workflow TUMOR_NORMAL_HAPPHASE { platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - basecall_model: meta.basecall_model, + basecall_model: basecall_model, clairS_model: meta.clairS_model] return [ basecall_model, new_meta, bam, bai ] } @@ -77,12 +77,13 @@ workflow TUMOR_NORMAL_HAPPHASE { // remove type from so that information can be merged easier later mixed_bams.tumor .map{ meta, bam, bai -> + def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - basecall_model: meta.basecall_model, + basecall_model: basecall_model, clairS_model: meta.clairS_model] return[new_meta, bam, bai] } From 742f0ee695309378decb2118d66e2dcb927416c4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 4 Dec 2025 10:07:40 +0100 Subject: [PATCH 007/183] update ascat for pdf plotting --- conf/modules.config | 3 ++- modules/nf-core/ascat/main.nf | 11 ++++++----- nextflow.config | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index d82196bb..081c0892 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -278,7 +278,8 @@ process { "min_map_qual": params.ascat_min_map_qual, "longread_bins": params.ascat_longread_bins, "allele_counter_flags": params.ascat_allelecounter_flags, - "penalty": params.ascat_penalty + "penalty": params.ascat_penalty, + "pdf_plots": params.ascat_pdf_plots ] } publishDir = [ path: { "${params.outdir}/${meta.id}/ascat" }, diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 366a4ba4..366c9efe 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -42,6 +42,7 @@ process ASCAT { def penalty = args.penalty ? "$args.penalty" : "NULL" def gc_input = gc_file ? "$gc_file" : "NULL" def rt_input = rt_file ? "$rt_file" : "NULL" + def pdf_plots = args.pdf_plots ? "$args.pdf_plots" : "NULL" def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" @@ -56,7 +57,7 @@ process ASCAT { def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" - def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" + def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ #!/usr/bin/env Rscript library(RColorBrewer) @@ -153,13 +154,13 @@ process ASCAT { #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers #If psi and rho are manually set: if (!is.null($purity) && !is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = $pdf_plots) } else if(!is.null($purity) && is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = $pdf_plots) } else if(!is.null($ploidy) && is.null($purity)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = $pdf_plots) } else { - ascat.output <- ascat.runAscat(ascat.bc, gamma=1) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = $pdf_plots) } #Extract metrics from ASCAT profiles diff --git a/nextflow.config b/nextflow.config index b604225b..43a2a123 100644 --- a/nextflow.config +++ b/nextflow.config @@ -55,6 +55,7 @@ params { ascat_penalty = 150 ascat_purity = null ascat_longread_bins = 2000 + ascat_pdf_plots = false ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) From feeee9040366a03fac69920f3196cceccd30493f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 4 Dec 2025 10:43:08 +0100 Subject: [PATCH 008/183] change var --- modules/nf-core/ascat/main.nf | 8 ++++---- nextflow.config | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 366c9efe..1a809687 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -154,13 +154,13 @@ process ASCAT { #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers #If psi and rho are manually set: if (!is.null($purity) && !is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = $pdf_plots) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = "$pdf_plots") } else if(!is.null($purity) && is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = $pdf_plots) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = "$pdf_plots") } else if(!is.null($ploidy) && is.null($purity)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = $pdf_plots) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = "$pdf_plots") } else { - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = $pdf_plots) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = "$pdf_plots") } #Extract metrics from ASCAT profiles diff --git a/nextflow.config b/nextflow.config index 43a2a123..12a79dea 100644 --- a/nextflow.config +++ b/nextflow.config @@ -55,7 +55,7 @@ params { ascat_penalty = 150 ascat_purity = null ascat_longread_bins = 2000 - ascat_pdf_plots = false + ascat_pdf_plots = "False" ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) From 0e9e2569653737743206183c906f271290242c1d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 4 Dec 2025 18:01:36 +0100 Subject: [PATCH 009/183] prettier and linting --- ro-crate-metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 184415cf..f1344b13 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-11-28T14:50:58+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/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[![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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\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", + "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\nIf you use IntGenomicsLab/lrsomatic for your analysis, please cite it using the following doi: [10.5281/zenodo.17751829](https://doi.org/10.5281/zenodo.17751829)\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" From c2c0c155dc6507d562f88159a9675680d2ff1f11 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 8 Dec 2025 11:07:25 +0100 Subject: [PATCH 010/183] views --- workflows/lrsomatic.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 2b84c973..3614365d 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -580,11 +580,13 @@ workflow LRSOMATIC { } .join(SEVERUS.out.all_vcf) .set { wakhan_input } - + wakhan_input.view() + ch_fasta.view() WAKHAN ( wakhan_input, ch_fasta ) + ch_versions = ch_versions.mix(WAKHAN.out.versions) } From 623a21cb1a9f832c29844db1927cfd24e7162981 Mon Sep 17 00:00:00 2001 From: vsc36520 Date: Fri, 19 Dec 2025 10:52:06 +0100 Subject: [PATCH 011/183] added gc and rt loci files in igenomes --- conf/igenomes.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/igenomes.config b/conf/igenomes.config index 6e0a9349..f08e3de6 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -16,6 +16,8 @@ params { genome_name = "hg38" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_hg38.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_hg38.zip" + ascat_loci_gc = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/GC_G1000_hg38.zip" + ascat_loci_rt = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/RT_G1000_hg38.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/grch38.cen_coord.curated.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_hg38.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/human_GRCh38_no_alt_analysis_set.trf.bed" @@ -31,6 +33,7 @@ params { genome_name = "CHM13" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" + ascat_loci_gc = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/GCcontent_SNPloci.txt.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" From b8315336803df8613cef819ce39be4f7ee044431 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 19 Dec 2025 11:00:28 +0100 Subject: [PATCH 012/183] changed ascat params to include GC and RT file --- workflows/lrsomatic.nf | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 2b84c973..7c4576df 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -84,6 +84,8 @@ workflow LRSOMATIC { params.genome_name = getGenomeAttribute('genome_name') params.ascat_allele_files = getGenomeAttribute('ascat_alleles') params.ascat_loci_files = getGenomeAttribute('ascat_loci') + params.ascat_gc_file = getGenomeAttribute('ascat_loci_gc') + params.ascat_rt_file = getGenomeAttribute('ascat_loci_rt') params.centromere_bed = getGenomeAttribute('centromere_bed') params.pon_file = getGenomeAttribute('pon_file') params.bed_file = getGenomeAttribute('bed_file') @@ -560,8 +562,8 @@ workflow LRSOMATIC { loci_files, [], [], - [], - [] + gc_file, + rt_file ) ch_versions = ch_versions.mix(ASCAT.out.versions) From 741e9073a52d2a69c04679ce2401dae96ec0fff7 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 19 Dec 2025 11:19:51 +0100 Subject: [PATCH 013/183] linting --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 7c4576df..6169f83c 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -85,7 +85,7 @@ workflow LRSOMATIC { params.ascat_allele_files = getGenomeAttribute('ascat_alleles') params.ascat_loci_files = getGenomeAttribute('ascat_loci') params.ascat_gc_file = getGenomeAttribute('ascat_loci_gc') - params.ascat_rt_file = getGenomeAttribute('ascat_loci_rt') + params.ascat_rt_file = getGenomeAttribute('ascat_loci_rt') params.centromere_bed = getGenomeAttribute('centromere_bed') params.pon_file = getGenomeAttribute('pon_file') params.bed_file = getGenomeAttribute('bed_file') From 3479917ebe96f43ff7fccdb9eda94145ee95725d Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 19 Dec 2025 11:36:25 +0100 Subject: [PATCH 014/183] ASCAT GC and RT in documentation --- docs/output.md | 2 ++ docs/usage.md | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/docs/output.md b/docs/output.md index 29d1c7a3..8974a1e7 100644 --- a/docs/output.md +++ b/docs/output.md @@ -66,6 +66,8 @@ The directories listed below will be created in the results directory after the ├── ascat │ ├── sample.before_correction.sample.tumour.germline.png │ ├── sample.before_correction.sample.tumour.tumour.png +│ ├── sample.after_correction.sample.tumour.germline.png +│ ├── sample.after_correction.sample.tumour.tumour.png │ ├── sample.cnvs.txt │ ├── sample.metrics.txt │ ├── sample.normal_alleleFrequencies_chr(1-22,X).txt diff --git a/docs/usage.md b/docs/usage.md index 30fa00af..3fd5faeb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -149,6 +149,10 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c | `--ascat_longread_bins` | integer to specify the binsize for ascat long reads. Default = `2000` | | `--ascat_allelecounter_flags` | flags to pass to ascat's allele counter. Default = `"-f 0"` | | `--ascat_chroms` | string to enforce a subset of chromosomes on the sample, ie `"(c(1:21,'X','Y')). Default = `null` | +| `--ascat_allele_files` | A full path to a zipped folder containing allele files for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Must be zipped and have `.zip` format. Default = `null` | +| `--ascat_loci_files` | A full path to a zipped folder containing loci files for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Must be zipped and have `.zip` format. Default = `null` | +| `--ascat_gc_file` | A full path to a GC correction file for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | +| `--ascat_rt_file` | A full path to a replication timing correction file for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | ### Updating the pipeline From 2877f1d81b2a0899551b40f51cfe2eb273f059ae Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 19 Dec 2025 11:45:10 +0100 Subject: [PATCH 015/183] prettier --- docs/usage.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 3fd5faeb..891bc8e6 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -138,21 +138,21 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c #### ASCAT Options -| Parameter | Description | -| ----------------------------- | ------------------------------------------------------------------------------------------------- | -| `--ascat_ploidy` | integer to enforce a given ploidy value. Default = `null` | -| `--ascat_purity` | integer to enforce a given purity value. Default = `null` | -| `--ascat_min_base_qual` | integer to specify a minimum base quality for ascat's allele counter. Default = `20` | -| `--ascat_min_counts` | integer to specify a minimum number of counts for ascat's allele counter. Default = `10` | -| `--ascat_min_map_qual` | integer to specify a minimum mapping quality for ascat's allele counter. Default = `10` | -| `--ascat_penalty` | integer to specify a penalty value for ascat. Default = `150` | -| `--ascat_longread_bins` | integer to specify the binsize for ascat long reads. Default = `2000` | -| `--ascat_allelecounter_flags` | flags to pass to ascat's allele counter. Default = `"-f 0"` | -| `--ascat_chroms` | string to enforce a subset of chromosomes on the sample, ie `"(c(1:21,'X','Y')). Default = `null` | -| `--ascat_allele_files` | A full path to a zipped folder containing allele files for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Must be zipped and have `.zip` format. Default = `null` | -| `--ascat_loci_files` | A full path to a zipped folder containing loci files for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Must be zipped and have `.zip` format. Default = `null` | -| `--ascat_gc_file` | A full path to a GC correction file for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | -| `--ascat_rt_file` | A full path to a replication timing correction file for [ASCAT]( https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | +| Parameter | Description | +| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `--ascat_ploidy` | integer to enforce a given ploidy value. Default = `null` | +| `--ascat_purity` | integer to enforce a given purity value. Default = `null` | +| `--ascat_min_base_qual` | integer to specify a minimum base quality for ascat's allele counter. Default = `20` | +| `--ascat_min_counts` | integer to specify a minimum number of counts for ascat's allele counter. Default = `10` | +| `--ascat_min_map_qual` | integer to specify a minimum mapping quality for ascat's allele counter. Default = `10` | +| `--ascat_penalty` | integer to specify a penalty value for ascat. Default = `150` | +| `--ascat_longread_bins` | integer to specify the binsize for ascat long reads. Default = `2000` | +| `--ascat_allelecounter_flags` | flags to pass to ascat's allele counter. Default = `"-f 0"` | +| `--ascat_chroms` | string to enforce a subset of chromosomes on the sample, ie `"(c(1:21,'X','Y')). Default = `null` | +| `--ascat_allele_files` | A full path to a zipped folder containing allele files for [ASCAT](https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Must be zipped and have `.zip` format. Default = `null` | +| `--ascat_loci_files` | A full path to a zipped folder containing loci files for [ASCAT](https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Must be zipped and have `.zip` format. Default = `null` | +| `--ascat_gc_file` | A full path to a GC correction file for [ASCAT](https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | +| `--ascat_rt_file` | A full path to a replication timing correction file for [ASCAT](https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | ### Updating the pipeline From 06ff17db036720ac0e210b43e4d79adcb9a3af38 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 19 Dec 2025 12:37:52 +0100 Subject: [PATCH 016/183] quick fix --- subworkflows/local/tumor_normal_happhase.nf | 7 ------- workflows/lrsomatic.nf | 4 +--- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 83c7f3b2..8d983069 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -22,7 +22,6 @@ workflow TUMOR_NORMAL_HAPPHASE { somatic_vep = Channel.empty() germline_vep = Channel.empty() - mixed_bams.view() // Branch input bams in normal and tumour mixed_bams @@ -41,7 +40,6 @@ workflow TUMOR_NORMAL_HAPPHASE { return [basecall_model, meta, file] } .set{downloaded_model_files} - downloaded_model_files.view() mixed_bams.normal .map{ meta, bam, bai -> def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model @@ -55,7 +53,6 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ basecall_model, new_meta, bam, bai ] } .set { normal_bams_model } - normal_bams_model.view() normal_bams_model .combine(downloaded_model_files,by:0) @@ -64,7 +61,6 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, bam, bai, model, platform] } .set{ normal_bams } - normal_bams.view() // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -88,7 +84,6 @@ workflow TUMOR_NORMAL_HAPPHASE { return[new_meta, bam, bai] } .set{ tumor_bams } - tumor_bams.view() // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams @@ -169,8 +164,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams and type information // mix with the normal bams - tumor_bams.view() - LONGPHASE_PHASE.out.vcf.view() tumor_bams .join(LONGPHASE_PHASE.out.vcf) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 3614365d..be62661b 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -580,13 +580,11 @@ workflow LRSOMATIC { } .join(SEVERUS.out.all_vcf) .set { wakhan_input } - wakhan_input.view() - ch_fasta.view() WAKHAN ( wakhan_input, ch_fasta ) - + ch_versions = ch_versions.mix(WAKHAN.out.versions) } From b5bbce7355e679e1e189248cf8a2c086a0b43ecf Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 19 Dec 2025 16:57:02 +0100 Subject: [PATCH 017/183] minor formatting --- subworkflows/local/tumor_normal_happhase.nf | 4 ++-- workflows/lrsomatic.nf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 8d983069..9215495a 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -22,7 +22,6 @@ workflow TUMOR_NORMAL_HAPPHASE { somatic_vep = Channel.empty() germline_vep = Channel.empty() - // Branch input bams in normal and tumour mixed_bams .branch{ meta, bam, bai -> @@ -40,6 +39,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [basecall_model, meta, file] } .set{downloaded_model_files} + mixed_bams.normal .map{ meta, bam, bai -> def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model @@ -164,7 +164,6 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams and type information // mix with the normal bams - tumor_bams .join(LONGPHASE_PHASE.out.vcf) .map { meta, bam, bai, vcf -> @@ -248,6 +247,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(LONGPHASE_PHASE.out.vcf) .join(LONGPHASE_PHASE.out.tbi) .set{tumor_normal_severus} + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index be62661b..2b84c973 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -580,12 +580,12 @@ workflow LRSOMATIC { } .join(SEVERUS.out.all_vcf) .set { wakhan_input } + WAKHAN ( wakhan_input, ch_fasta ) - ch_versions = ch_versions.mix(WAKHAN.out.versions) } From 661f10a540a4e1a2afb3ab79c040cf60b6716227 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Mon, 22 Dec 2025 09:52:58 +0100 Subject: [PATCH 018/183] remove stupid s --- workflows/lrsomatic.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 6169f83c..2406913d 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -169,8 +169,8 @@ workflow LRSOMATIC { params.fasta, params.ascat_allele_files, params.ascat_loci_files, - params.ascat_gc_files, - params.ascat_rt_files, + params.ascat_gc_file, + params.ascat_rt_file, basecall_meta, clair3_modelMap ) From c07cf59f0386664ab997a3533307d45c7bc9ff52 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Mon, 22 Dec 2025 10:21:16 +0100 Subject: [PATCH 019/183] correct ref path ascat GC file T2T --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index f08e3de6..822e1c9e 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -33,7 +33,7 @@ params { genome_name = "CHM13" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" - ascat_loci_gc = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/GCcontent_SNPloci.txt.zip" + ascat_loci_gc = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/ASCAT_files/GCcontent_SNPloci_CHM13.txt.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" From 2c9e2e6e3f0ab4265da05b01a09e750f59b5fff7 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Mon, 22 Dec 2025 10:31:25 +0100 Subject: [PATCH 020/183] changed GC file link T2T to correct one 2.0 --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 822e1c9e..c7dc18ee 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -33,7 +33,7 @@ params { genome_name = "CHM13" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" - ascat_loci_gc = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/ASCAT_files/GCcontent_SNPloci_CHM13.txt.zip" + ascat_loci_gc = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ASCAT_files/GCcontent_SNPloci_CHM13.txt.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" From b567356c3f566d217368957bce603fe99a4a4a5b Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Mon, 22 Dec 2025 11:17:40 +0100 Subject: [PATCH 021/183] fix GC file ASCAT 3.0 --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index c7dc18ee..06bd28a4 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -33,7 +33,7 @@ params { genome_name = "CHM13" ascat_alleles = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_alleles_CHM13.zip" ascat_loci = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/ascat/G1000_loci_CHM13.zip" - ascat_loci_gc = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/ASCAT_files/GCcontent_SNPloci_CHM13.txt.zip" + ascat_loci_gc = "https://github.com/IntGenomicsLab/test-datasets/raw/refs/heads/main/references/ascat/GCcontent_SNPloci_CHM13.txt.zip" centromere_bed = "https://raw.githubusercontent.com/KolmogorovLab/Wakhan/refs/heads/main/src/annotations/chm13v2_cen_coord.bed" pon_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/pon/PoN_1000G_chm13.tsv.gz" bed_file = "https://raw.githubusercontent.com/KolmogorovLab/Severus/refs/heads/main/vntrs/chm13.bed" From af58b032c4e13ea4c66fb3452c73de04fd9b757d Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 22 Dec 2025 09:31:39 -0600 Subject: [PATCH 022/183] Fix case of ascat_pdf_plots value to 'FALSE' --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 12a79dea..e571a3c4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -55,7 +55,7 @@ params { ascat_penalty = 150 ascat_purity = null ascat_longread_bins = 2000 - ascat_pdf_plots = "False" + ascat_pdf_plots = "FALSE" ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) From dcc9e4afb801e3e2a628024ddd85a4e3fb49c457 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 23 Dec 2025 14:01:28 +0100 Subject: [PATCH 023/183] Template update for nf-core/tools version 3.5.1 --- .devcontainer/devcontainer.json | 28 +++++----- .devcontainer/setup.sh | 13 +++++ .github/actions/nf-test/action.yml | 6 +- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 8 +-- .github/workflows/fix_linting.yml | 16 +++--- .github/workflows/linting.yml | 16 +++--- .github/workflows/linting_comment.yml | 2 +- .github/workflows/nf-test.yml | 9 +-- .../workflows/template-version-comment.yml | 2 +- .gitpod.yml | 10 ---- .nf-core.yml | 16 +++--- .pre-commit-config.yaml | 2 +- .prettierignore | 3 + CHANGELOG.md | 2 +- README.md | 5 +- docs/usage.md | 2 +- main.nf | 5 +- modules.json | 8 +-- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- .../nf-core/multiqc/tests/main.nf.test.snap | 24 ++++---- modules/nf-core/multiqc/tests/tags.yml | 2 - nextflow.config | 43 +++++++------- nextflow_schema.json | 12 ++++ ro-crate-metadata.json | 18 +++--- .../utils_nfcore_lrsomatic_pipeline/main.nf | 18 +++++- .../utils_nextflow_pipeline/tests/tags.yml | 2 - .../nf-core/utils_nfcore_pipeline/main.nf | 2 +- .../utils_nfcore_pipeline/tests/tags.yml | 2 - .../nf-core/utils_nfschema_plugin/main.nf | 40 +++++++++++-- .../utils_nfschema_plugin/tests/main.nf.test | 56 +++++++++++++++++++ .../tests/nextflow.config | 4 +- tests/.nftignore | 3 +- tests/default.nf.test | 2 - workflows/lrsomatic.nf | 38 +++++++++---- 36 files changed, 277 insertions(+), 150 deletions(-) create mode 100755 .devcontainer/setup.sh delete mode 100644 .gitpod.yml delete mode 100644 modules/nf-core/multiqc/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml delete mode 100644 subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b290e090..97c8c97f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,20 +1,20 @@ { "name": "nfcore", - "image": "nfcore/gitpod:latest", - "remoteUser": "gitpod", - "runArgs": ["--privileged"], + "image": "nfcore/devcontainer:latest", - // Configure tool-specific properties. - "customizations": { - // Configure properties specific to VS Code. - "vscode": { - // Set *default* container specific settings.json values on container create. - "settings": { - "python.defaultInterpreterPath": "/opt/conda/bin/python" - }, + "remoteUser": "root", + "privileged": true, - // Add the IDs of extensions you want installed when the container is created. - "extensions": ["ms-python.python", "ms-python.vscode-pylance", "nf-core.nf-core-extensionpack"] - } + "remoteEnv": { + // Workspace path on the host for mounting with docker-outside-of-docker + "LOCAL_WORKSPACE_FOLDER": "${localWorkspaceFolder}" + }, + + "onCreateCommand": "./.devcontainer/setup.sh", + + "hostRequirements": { + "cpus": 4, + "memory": "16gb", + "storage": "32gb" } } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 00000000..1ab19682 --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# Customise the terminal command prompt +echo "export PROMPT_DIRTRIM=2" >> $HOME/.bashrc +echo "export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] '" >> $HOME/.bashrc +export PROMPT_DIRTRIM=2 +export PS1='\[\e[3;36m\]\w ->\[\e[0m\\] ' + +# Update Nextflow +nextflow self-update + +# Update welcome message +echo "Welcome to the IntGenomicsLab/lrsomatic devcontainer!" > /usr/local/etc/vscode-dev-containers/first-run-notice.txt diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index bf44d961..3b9724c7 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -25,9 +25,9 @@ runs: version: "${{ env.NXF_VERSION }}" - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install nf-test uses: nf-core/setup-nf-test@v1 @@ -52,6 +52,8 @@ runs: with: auto-update-conda: true conda-solver: libmamba + channels: conda-forge + channel-priority: strict conda-remove-defaults: true - name: Run nf-test diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index ac030fd5..6adb0fff 100644 --- a/.github/workflows/clean-up.yml +++ b/.github/workflows/clean-up.yml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 with: stale-issue-message: "This issue has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment otherwise this issue will be closed in 20 days." stale-pr-message: "This PR has been tagged as awaiting-changes or awaiting-feedback by an nf-core contributor. Remove stale label or add a comment if it is still useful." diff --git a/.github/workflows/download_pipeline.yml b/.github/workflows/download_pipeline.yml index 999bcc38..45884ff9 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -44,9 +44,9 @@ jobs: - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: Setup Apptainer @@ -57,7 +57,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git@dev + pip install git+https://github.com/nf-core/tools.git - name: Make a cache directory for the container images run: | @@ -127,7 +127,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index b0cd0ed7..b9b23241 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: token: ${{ secrets.nf_core_bot_auth_token }} # indication that the linting is being fixed - name: React on comment - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: eyes @@ -32,9 +32,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} # Install and run pre-commit - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -47,7 +47,7 @@ jobs: # indication that the linting has finished - name: react if linting finished succesfully if: steps.pre-commit.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: "+1" @@ -67,21 +67,21 @@ jobs: - name: react if linting errors were fixed id: react-if-fixed if: steps.commit-and-push.outcome == 'success' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: hooray - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} reactions: confused - name: react if linting errors were not fixed if: steps.commit-and-push.outcome == 'failure' - uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 + uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: issue-number: ${{ github.event.issue.number }} body: | diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 8b0f88c3..7a527a34 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,12 +11,12 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - - name: Set up Python 3.13 - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - name: Set up Python 3.14 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" - name: Install pre-commit run: pip install pre-commit @@ -28,14 +28,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 with: - python-version: "3.13" + python-version: "3.14" architecture: "x64" - name: read .nf-core.yml @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index d43797d9..e6e9bc26 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -21,7 +21,7 @@ jobs: run: echo "pr_number=$(cat linting-logs/PR_number.txt)" >> $GITHUB_OUTPUT - name: Post PR comment - uses: marocchino/sticky-pull-request-comment@52423e01640425a022ef5fd42c6fb5f633a02728 # v2 + uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index 593c9360..7fd88b52 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -18,7 +18,7 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.2" + NFT_VER: "0.9.3" NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity @@ -39,7 +39,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -76,14 +76,14 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.10.5" + - "25.04.0" - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: fetch-depth: 0 @@ -93,6 +93,7 @@ jobs: continue-on-error: ${{ matrix.NXF_VER == 'latest-everything' }} env: NFT_WORKDIR: ${{ env.NFT_WORKDIR }} + NXF_VERSION: ${{ matrix.NXF_VER }} with: profile: ${{ matrix.profile }} shard: ${{ matrix.shard }} diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index beb5c77f..e8560fc7 100644 --- a/.github/workflows/template-version-comment.yml +++ b/.github/workflows/template-version-comment.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: ref: ${{ github.event.pull_request.head.sha }} diff --git a/.gitpod.yml b/.gitpod.yml deleted file mode 100644 index 83599f63..00000000 --- a/.gitpod.yml +++ /dev/null @@ -1,10 +0,0 @@ -image: nfcore/gitpod:latest -tasks: - - name: Update Nextflow and setup pre-commit - command: | - pre-commit install --install-hooks - nextflow self-update - -vscode: - extensions: - - nf-core.nf-core-extensionpack # https://github.com/nf-core/vscode-extensionpack diff --git a/.nf-core.yml b/.nf-core.yml index bb1d31f6..f15c6cf9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,17 +1,17 @@ lint: files_exist: - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png - .github/ISSUE_TEMPLATE/config.yml - .github/workflows/awstest.yml - .github/workflows/awsfulltest.yml files_unchanged: - CODE_OF_CONDUCT.md - - assets/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_light.png - - docs/images/nf-core-lr_somatic_logo_dark.png + - assets/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_light.png + - docs/images/nf-core-lrsomatic_logo_dark.png - .github/ISSUE_TEMPLATE/bug_report.yml - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md @@ -27,7 +27,7 @@ lint: - validation.summary.beforeText - validation.summary.afterText schema_params: false -nf_core_version: 3.3.2 +nf_core_version: 3.5.1 repository_type: pipeline template: author: Jonas Demeulemeester @@ -39,4 +39,4 @@ template: outdir: . skip_features: - fastqc - version: 1.0.0dev + version: 1.1.0dev diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bb41beec..d06777a8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,7 +6,7 @@ repos: additional_dependencies: - prettier@3.6.2 - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace args: [--markdown-linebreak-ext=md] diff --git a/.prettierignore b/.prettierignore index edd29f01..dd749d43 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,4 +10,7 @@ testing/ testing* *.pyc bin/ +.nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b2733d3..600a7b1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ 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.0.0dev - [date] +## v1.1.0dev - [date] Initial release of IntGenomicsLab/lrsomatic, created with the [nf-core](https://nf-co.re/) template. diff --git a/README.md b/README.md index 936bef6b..7281c292 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ # IntGenomicsLab/lrsomatic +[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic) [![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml) [![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/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) [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) -[![Nextflow](https://img.shields.io/badge/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) -[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) diff --git a/docs/usage.md b/docs/usage.md index e0528582..190ad95f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -147,7 +147,7 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `shifter` - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) - `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) + - A generic configuration profile to be used with [Charliecloud](https://charliecloud.io/) - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `wave` diff --git a/main.nf b/main.nf index 21003825..14012f28 100644 --- a/main.nf +++ b/main.nf @@ -72,7 +72,10 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden ) // diff --git a/modules.json b/modules.json index d4b076ce..1abe8cc7 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "multiqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", "installed_by": ["modules"] } } @@ -16,17 +16,17 @@ "nf-core": { "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 812fc4c5..d02016a0 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.29 + - bioconda::multiqc=1.32 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 0ac3c369..c1158fb0 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,8 +3,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.29--pyhdfd78af_0' : - 'biocontainers/multiqc:1.29--pyhdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : + 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" input: path multiqc_files, stageAs: "?/*" diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 88e90571..a88bafd6 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -2,14 +2,14 @@ "multiqc_versions_single": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-05-22T11:50:41.182332996" + "timestamp": "2025-10-27T13:33:24.356715" }, "multiqc_stub": { "content": [ @@ -17,25 +17,25 @@ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-05-22T11:51:22.448739369" + "timestamp": "2025-10-27T13:34:11.103619" }, "multiqc_versions_config": { "content": [ [ - "versions.yml:md5,c1fe644a37468f6dae548d98bc72c2c1" + "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" + "nf-test": "0.9.3", + "nextflow": "24.10.4" }, - "timestamp": "2025-05-22T11:51:06.198928424" + "timestamp": "2025-10-27T13:34:04.615233" } } \ No newline at end of file diff --git a/modules/nf-core/multiqc/tests/tags.yml b/modules/nf-core/multiqc/tests/tags.yml deleted file mode 100644 index bea6c0d3..00000000 --- a/modules/nf-core/multiqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -multiqc: - - modules/nf-core/multiqc/** diff --git a/nextflow.config b/nextflow.config index 9022a87c..959835d1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,13 +32,15 @@ params { email_on_fail = null plaintext_email = false monochrome_logs = false - hook_url = null + hook_url = System.getenv('HOOK_URL') help = false help_full = false 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 + trace_report_suffix = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + + // Config options config_profile_name = null config_profile_description = null @@ -91,7 +93,18 @@ profiles { apptainer.enabled = false docker.runOptions = '-u $(id -u):$(id -g)' } - arm { + arm64 { + process.arch = 'arm64' + // TODO https://github.com/nf-core/modules/issues/6694 + // For now if you're using arm64 you have to use wave for the sake of the maintainers + // wave profile + apptainer.ociAutoPull = true + singularity.ociAutoPull = true + wave.enabled = true + wave.freeze = true + wave.strategy = 'conda,container' + } + emulate_amd64 { docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { @@ -148,18 +161,6 @@ profiles { wave.freeze = true wave.strategy = 'conda,container' } - gitpod { - executor.name = 'local' - executor.cpus = 4 - executor.memory = 8.GB - process { - resourceLimits = [ - memory: 8.GB, - cpus : 4, - time : 1.h - ] - } - } gpu { docker.runOptions = '-u $(id -u):$(id -g) --gpus all' apptainer.runOptions = '--nv' @@ -250,25 +251,19 @@ manifest { description = """Workflow for somatic variant calling of long read data""" mainScript = 'main.nf' defaultBranch = 'main' - nextflowVersion = '!>=24.10.5' - version = '1.0.0dev' + nextflowVersion = '!>=25.04.0' + version = '1.1.0dev' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.4.2' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs - help { - enabled = true - command = "nextflow run IntGenomicsLab/lrsomatic -profile --input samplesheet.csv --outdir " - fullParameter = "help_full" - showHiddenParameter = "show_hidden" - } } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index 5e11598c..cf7f1e5e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -224,6 +224,18 @@ "fa_icon": "far calendar", "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true + }, + "help": { + "type": ["boolean", "string"], + "description": "Display the help message." + }, + "help_full": { + "type": "boolean", + "description": "Display the full detailed help message." + }, + "show_hidden": { + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index b7daf6f6..3b1e1836 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2025-09-17T12:26:04+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/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[![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/version-%E2%89%A524.10.5-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.3.2-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.3.2)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\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\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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", + "datePublished": "2025-12-23T12:58:53+00:00", + "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/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[![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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\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\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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" @@ -93,7 +93,7 @@ }, "mentions": [ { - "@id": "#f4372c5c-a777-432b-87e8-dcf239c9c331" + "@id": "#37ea2685-1622-4ca2-a059-c12365c26c03" } ], "name": "IntGenomicsLab/lrsomatic" @@ -121,7 +121,7 @@ "ComputationalWorkflow" ], "dateCreated": "", - "dateModified": "2025-09-17T14:26:04Z", + "dateModified": "2025-12-23T13:58:53Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -144,7 +144,7 @@ "https://nf-co.re/IntGenomicsLab/lrsomatic/dev/" ], "version": [ - "1.0.0dev" + "1.1.0dev" ] }, { @@ -157,14 +157,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=24.10.5" + "version": "!>=25.04.0" }, { - "@id": "#f4372c5c-a777-432b-87e8-dcf239c9c331", + "@id": "#37ea2685-1622-4ca2-a059-c12365c26c03", "@type": "TestSuite", "instance": [ { - "@id": "#d45cd938-4370-4c70-8435-dca43e0a0a87" + "@id": "#3407ebf2-d870-42e0-a3c2-7be89cb69e2b" } ], "mainEntity": { @@ -173,7 +173,7 @@ "name": "Test suite for IntGenomicsLab/lrsomatic" }, { - "@id": "#d45cd938-4370-4c70-8435-dca43e0a0a87", + "@id": "#3407ebf2-d870-42e0-a3c2-7be89cb69e2b", "@type": "TestInstance", "name": "GitHub Actions workflow for testing IntGenomicsLab/lrsomatic", "resource": "repos/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml", diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 78e6d71f..0f35e34c 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -32,10 +33,13 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -50,10 +54,18 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + "", + "", + command ) // @@ -72,7 +84,7 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) .map { meta, fastq_1, fastq_2 -> diff --git a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml deleted file mode 100644 index f8476112..00000000 --- a/subworkflows/nf-core/utils_nextflow_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nextflow_pipeline: - - subworkflows/nf-core/utils_nextflow_pipeline/** diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd25876..2f30e9a4 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml b/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml deleted file mode 100644 index ac8523c9..00000000 --- a/subworkflows/nf-core/utils_nfcore_pipeline/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/utils_nfcore_pipeline: - - subworkflows/nf-core/utils_nfcore_pipeline/** diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303e..ee4738c8 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,29 +16,56 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + params.help instanceof String ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb30164..c977917a 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 09ef842a..8d8c7371 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,8 +1,8 @@ plugins { - id "nf-schema@2.4.2" + id "nf-schema@2.5.1" } validation { parametersSchema = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" monochromeLogs = true -} \ No newline at end of file +} diff --git a/tests/.nftignore b/tests/.nftignore index 16409f40..83f7a0a5 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -1,9 +1,10 @@ .DS_Store -multiqc/multiqc_data/BETA-multiqc.parquet +multiqc/multiqc_data/multiqc.parquet multiqc/multiqc_data/multiqc.log multiqc/multiqc_data/multiqc_data.json multiqc/multiqc_data/multiqc_sources.txt multiqc/multiqc_data/multiqc_software_versions.txt +multiqc/multiqc_data/llms-full.txt multiqc/multiqc_plots/{svg,pdf,png}/*.{svg,pdf,png} multiqc/multiqc_report.html pipeline_info/*.{html,json,txt,yml} diff --git a/tests/default.nf.test b/tests/default.nf.test index 1d3a963a..d4daad19 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -20,8 +20,6 @@ nextflow_pipeline { 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 test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), // All stable path name, with a relative path diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index f92e50c0..9748f8a2 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -21,13 +21,31 @@ workflow LRSOMATIC { ch_samplesheet // channel: samplesheet read in from --input main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // // Collate and save software versions // - softwareVersionsToYAML(ch_versions) + def topic_versions = Channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'lrsomatic_software_' + 'mqc_' + 'versions.yml', @@ -39,24 +57,24 @@ workflow LRSOMATIC { // // MODULE: MultiQC // - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) From e003997fcb4b842032239256dea35dc6d86d68b1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 11:06:27 +0100 Subject: [PATCH 024/183] change versioning output to topic for all local modules --- modules/local/clair3/main.nf | 14 +- modules/local/clair3/meta.yml | 114 +++--- modules/local/clairs/main.nf | 12 +- modules/local/clairs/meta.yml | 75 ++-- modules/local/clairsto/main.nf | 14 +- modules/local/clairsto/meta.yml | 153 +++++--- modules/local/cramino/main.nf | 21 +- modules/local/cramino/meta.yml | 80 ++-- modules/local/fibertoolsrs/fire/main.nf | 56 +-- modules/local/fibertoolsrs/fire/meta.yml | 78 ++-- .../local/fibertoolsrs/nucleosomes/main.nf | 55 +-- .../local/fibertoolsrs/nucleosomes/meta.yml | 90 ++--- modules/local/fibertoolsrs/predictm6a/main.nf | 56 +-- .../local/fibertoolsrs/predictm6a/meta.yml | 79 ++-- modules/local/fibertoolsrs/qc/main.nf | 55 +-- modules/local/fibertoolsrs/qc/meta.yml | 74 ++-- modules/local/metaextract/main.nf | 11 +- modules/local/metaextract/meta.yml | 88 +++-- modules/local/vcfsplit/main.nf | 11 +- modules/local/vcfsplit/meta.yml | 132 ++++--- modules/local/wakhan/main.nf | 21 +- modules/local/wakhan/meta.yml | 343 +++++++++++++++--- 22 files changed, 876 insertions(+), 756 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 85d793fa..37121522 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -8,7 +8,7 @@ process CLAIR3 { 'quay.io/biocontainers/clair3:1.2.0--py310h779eee5_0' }" input: - tuple val(meta), path(bam), path(bai), path(model), val(platform) + tuple val(meta) , path(bam), path(bai), path(model), val(platform) tuple val(meta2), path(reference) tuple val(meta3), path(index) @@ -17,7 +17,7 @@ process CLAIR3 { tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true - path "versions.yml", emit: versions + tuple val("${task.process}"), val('clair3'), eval("run_clair3.sh --version |& sed '1!d ; s/Clair3 v//'"), topic: versions, emit: versions_clair3 when: task.ext.when == null || task.ext.when @@ -35,11 +35,6 @@ process CLAIR3 { --platform=$platform \\ --model=$model \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') - END_VERSIONS """ stub: @@ -50,10 +45,5 @@ process CLAIR3 { touch ${prefix}.phased_merge_output.vcf.gz.tbi echo "" | gzip > ${prefix}.merge_output.vcf.gz touch ${prefix}.merge_output.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') - END_VERSIONS """ } diff --git a/modules/local/clair3/meta.yml b/modules/local/clair3/meta.yml index cecf7564..8f2e06f3 100644 --- a/modules/local/clair3/meta.yml +++ b/modules/local/clair3/meta.yml @@ -69,54 +69,72 @@ input: description: reference index file pattern: "*.fai" output: - - vcf: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - pattern: "*.{vcf,vcf.gz}" - - "*merge_output.vcf.gz": - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - pattern: "*.{vcf,vcf.gz}" - - tbi: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - "*merge_output.vcf.gz.tbi": - type: file - description: index for vcf files - pattern: "*.{vcf.tbi,vcf.tbi.gz}" - - phased_vcf: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - "*phased_merge_output.vcf.gz": - type: file - description: phased vcf - pattern: "*.{vcf,vcf.gz}" - - phased_tbi: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - "*phased_merge_output.vcf.gz.tbi": - type: file - description: index for vcf files - pattern: "*.{vcf.tbi,vcf.tbi.gz}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" + - "*merge_output.vcf.gz": + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + pattern: "*.{vcf,vcf.gz}" + tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*merge_output.vcf.gz.tbi": + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" + phased_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*phased_merge_output.vcf.gz": + type: file + description: phased vcf + pattern: "*.{vcf,vcf.gz}" + phased_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*phased_merge_output.vcf.gz.tbi": + type: file + description: index for vcf files + pattern: "*.{vcf.tbi,vcf.tbi.gz}" + versions_clair3: + - - ${task.process}: + type: string + description: The process the versions were collected from + - clair3: + type: string + description: The tool name + - "run_clair3.sh --version |& sed '1!d ; s/Clair3 v//'": + type: string + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - clair3: + type: string + description: The tool name + - "run_clair3.sh --version |& sed '1!d ; s/Clair3 v//'": + type: string + description: The command used to generate the version of the tool + authors: - "@robert-a-forsyth" maintainers: diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 29837fd9..af06180f 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -14,7 +14,7 @@ process CLAIRS { output: tuple val(meta), path("*.vcf.gz"), emit: vcfs tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi - path "versions.yml", emit: versions + tuple val("${task.process}"), val('clairs'), eval("/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //'"), topic: versions, emit: versions_clairs when: task.ext.when == null || task.ext.when @@ -38,11 +38,6 @@ process CLAIRS { rm snv.vcf.gz rm snv.vcf.gz.tbi fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - clairs: \$(/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //') - END_VERSIONS """ stub: @@ -55,10 +50,5 @@ process CLAIRS { echo "" | gzip > indel.vcf.gz touch indel.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - clairs: \$(/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //') - END_VERSIONS """ } diff --git a/modules/local/clairs/meta.yml b/modules/local/clairs/meta.yml index 46c5b6ce..1c28ae45 100644 --- a/modules/local/clairs/meta.yml +++ b/modules/local/clairs/meta.yml @@ -1,20 +1,21 @@ # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "clairs" -description: write your description here +description: ClairS is a deep-learning method for long-read somatic small variant calling keywords: + - somatic - small - variant - SNV - indel + - long-read tools: - "clairs": - description: "" + description: "ClairS is a deep-learning method for long-read somatic small variant calling" homepage: "https://github.com/HKU-BAL/ClairS" documentation: "https://github.com/HKU-BAL/ClairS" tool_dev_url: "https://github.com/HKU-BAL/ClairS" - doi: "10.1101/2023.08.17.553778 " + doi: "10.1101/2023.08.17.553778" licence: ["BSD-3-clause"] - identifier: biotools:clairs input: - - meta: @@ -25,7 +26,7 @@ input: type: file description: | BAM file for tumor sample - pattern: "*.vcf.gz" + pattern: "*.bam" - tumor_bai: type: file description: | @@ -64,29 +65,47 @@ input: index file for the reference fasta file pattern: "*.fai" output: - - vcf: - - meta: - type: map - description: | - Groovy Map containing sample information - - "*.vcf.gz": - type: file - description: VCF file containing small somatic variants - pattern: "*.vcf.gz" - - tbi: - - meta: - type: map - description: | - Groovy Map containing sample information - - "*.vcf.gz.tbi": - type: file - description: VCF index file for small somatic variants - pattern: "*.vcf.gz.tbi" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + - "*.vcf.gz": + type: file + description: VCF file containing small somatic variants + pattern: "*.vcf.gz" + tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + - "*.vcf.gz.tbi": + type: file + description: VCF index file for small somatic variants + pattern: "*.vcf.gz.tbi" + versions_clairs: + - - ${task.process}: + type: string + description: The process the versions were collected from + - clairs: + type: string + description: The tool name + - "run_clairs --version |& sed '1!d ; s/run_clairs //'": + type: string + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "run_clairs --version |& sed '1!d ; s/run_clairs //'": + type: string + description: The command used to generate the version of the tool + authors: - "@robert-a-forsyth" maintainers: diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 130baebd..79424f39 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -21,7 +21,7 @@ process CLAIRSTO { tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi - path "versions.yml", emit: versions + tuple val("${task.process}"), val('clairsto'), eval("run_clairs_to --version |& sed '1!d ; s/run_clairs_to //'"), topic: versions, emit: versions_clairsto when: task.ext.when == null || task.ext.when @@ -47,13 +47,6 @@ process CLAIRSTO { --panel_of_normals_require_allele_matching 'True,True,False,False' \\ $conda_prefix \\ $args \\ - - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - clairsto: \$(/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //') - END_VERSIONS """ stub: @@ -66,10 +59,5 @@ process CLAIRSTO { touch snv.vcf.gz.tbi echo "" | gzip > indel.vcf.gz touch indel.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - clairsto: \$(/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //') - END_VERSIONS """ } diff --git a/modules/local/clairsto/meta.yml b/modules/local/clairsto/meta.yml index f283f56a..91f3b91c 100644 --- a/modules/local/clairsto/meta.yml +++ b/modules/local/clairsto/meta.yml @@ -1,21 +1,22 @@ # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "clairsto" -description: write your description here +description: ClairS-TO is a deep-learning method for long-read tumor-only somatic small variant calling keywords: + - somatic - small - variant - SNV - indel - tumor-only + - long-read tools: - - "clairs": - description: "" + - "clairsto": + description: "ClairS-TO is a deep-learning method for long-read tumor-only somatic small variant calling" homepage: "https://github.com/HKU-BAL/ClairS-TO" documentation: "https://github.com/HKU-BAL/ClairS-TO" tool_dev_url: "https://github.com/HKU-BAL/ClairS-TO" - doi: "10.1101/2023.08.17.553778 " + doi: "10.1038/s41467-025-64547-z" licence: ["BSD-3-clause"] - identifier: biotools:clairsto input: - - meta: @@ -26,7 +27,7 @@ input: type: file description: | BAM file for tumor sample - pattern: "*.vcf.gz" + pattern: "*.bam" - tumor_bai: type: file description: | @@ -35,70 +36,110 @@ input: - model: type: string description: | - Name for ClairS model + Name for ClairS-TO model (platform: ont or hifi) - - meta2: type: map description: | - Groovy Map containing sample information + Groovy Map containing reference information - reference: type: file description: | - A reference fasta file - pattern: "*.fasta" + Reference genome fasta file + pattern: "*.{fasta,fa,fna}" - - meta3: type: map description: | - Groovy Map containing sample information + Groovy Map containing reference index information - index: type: file description: | - index file for the reference fasta file + Reference genome fasta index file pattern: "*.fai" + - - dbSNP: + type: file + description: | + dbSNP VCF file for panel of normals + pattern: "*.vcf.gz" + - - colors: + type: file + description: | + COLORS panel of normals VCF file + pattern: "*.vcf.gz" + - - onekgenomes: + type: file + description: | + 1000 Genomes panel of normals VCF file + pattern: "*.vcf.gz" + - - gnomad: + type: file + description: | + gnomAD panel of normals VCF file + pattern: "*.vcf.gz" + output: - - indel_vcf: - - meta: - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz" - - "*/indel.vcf.gz": - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz" - - indel_tbi: - - meta: - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz.tbi" - - "*/indel.vcf.gz.tbi": - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz.tbi" - - snv_vcf: - - meta: - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz" - - "*/snv.vcf.gz": - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz" - - snv_tbi: - - meta: - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz.tbi" - - "*/snv.vcf.gz.tbi": - type: map - description: | - Groovy Map containing sample information - pattern: "*.vcf.gz.tbi" + indel_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "indel.vcf.gz": + type: file + description: Indel somatic variants VCF file + pattern: "indel.vcf.gz" + indel_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "indel.vcf.gz.tbi": + type: file + description: Indel VCF index file + pattern: "indel.vcf.gz.tbi" + snv_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "snv.vcf.gz": + type: file + description: SNV somatic variants VCF file + pattern: "snv.vcf.gz" + snv_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "snv.vcf.gz.tbi": + type: file + description: SNV VCF index file + pattern: "*.vcf.gz.tbi" + versions_clairsto: + - - ${task.process}: + type: string + description: The process the versions were collected from + - clairsto: + type: string + description: The tool name + - "/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //'": + type: string + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - clairsto: + type: string + description: The tool name + - "/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //'": + type: string + description: The command used to generate the version of the tool + authors: - "@robert-a-forsyth" maintainers: diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index ce64c8e7..41709e2c 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -12,7 +12,7 @@ process CRAMINO { output: tuple val(meta), path("*.txt"), emit: txt - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('cramino'), eval("cramino --version |& sed '1!d ; s/cramino //'"), topic: versions, emit: versions_cramino when: task.ext.when == null || task.ext.when @@ -21,33 +21,14 @@ process CRAMINO { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - - - - """ cramino $args $bam > ${prefix}_cramino.txt - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cramino: \$(cramino --version |& sed '1!d ; s/cramino //') - END_VERSIONS """ - - - - stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_cramino.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cramino: \$(cramino --version |& sed '1!d ; s/cramino //') - END_VERSIONS """ } diff --git a/modules/local/cramino/meta.yml b/modules/local/cramino/meta.yml index b63a18af..09e361e8 100644 --- a/modules/local/cramino/meta.yml +++ b/modules/local/cramino/meta.yml @@ -2,32 +2,29 @@ # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "cramino" ## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: A tool for quick quality assessment of cram and bam files, intended for long read sequencing. keywords: - - sort - - example - - genomics + - quality + - assessment + - cram + - bam + - long-read tools: - "cramino": - ## TODO nf-core: Add a description and other details for the software below description: "A tool for very fast quality assessment of long read cram/bam files." - homepage: "None" - documentation: "None" - tool_dev_url: "None" - doi: "" + homepage: "https://github.com/wdecoster/cramino" + documentation: "https://github.com/wdecoster/cramino" + tool_dev_url: "https://github.com/wdecoster/cramino" + doi: "10.1093/bioinformatics/btad311" licence: ["MIT"] - identifier: + identifier: biotools:cramino -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -37,30 +34,41 @@ input: - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + txt: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.txt": + type: file + description: Quality assessment text file + pattern: "*.txt" + versions_cramino: + - - ${task.process}: + type: string + description: The process the versions were collected from + - cramino: + type: string + description: The tool name + - "cramino --version |& sed '1!d ; s/cramino //'": + type: string + description: The command used to generate the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - cramino: + type: string + description: The tool name + - "cramino --version |& sed '1!d ; s/cramino //'": + type: string + description: The command used to generate the version of the tool - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" authors: - "@alexanRNA" diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 08d2dbaf..87c5b39f 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -1,48 +1,19 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process FIBERTOOLSRS_FIRE { tag "$meta.id" label 'process_very_high' label 'process_high_memory' - - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. tuple val(meta), path(bam) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when @@ -50,15 +21,6 @@ process FIBERTOOLSRS_FIRE { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ ft \\ fire \\ @@ -66,26 +28,12 @@ process FIBERTOOLSRS_FIRE { -t $task.cpus \\ $bam \\ ${prefix}_fire.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ touch ${prefix}_fire.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ } diff --git a/modules/local/fibertoolsrs/fire/meta.yml b/modules/local/fibertoolsrs/fire/meta.yml index 63f0a8b0..708c654e 100644 --- a/modules/local/fibertoolsrs/fire/meta.yml +++ b/modules/local/fibertoolsrs/fire/meta.yml @@ -1,33 +1,28 @@ --- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "fibertoolsrs_fire" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: Fibertools-rs FIRE (Fiber-seq Inferred Regulatory Elements) predicts regulatory elements from fiber-seq data keywords: - - sort - - example - - genomics + - fiberseq + - regulatory-elements + - FIRE + - long-read + - epigenetics tools: - "fibertoolsrs": - ## TODO nf-core: Add a description and other details for the software below - description: "Mitchell Vollger's rust tools for fiberseq data." + description: "DNA-m6A calling and integrated long-read epigenetic and genetic analysis with fibertools" homepage: "https://fiberseq.github.io/fibertools/fibertools.html" documentation: "https://fiberseq.github.io/fibertools/fibertools.html" tool_dev_url: "https://github.com/fiberseq/fibertools-rs" - doi: "" + doi: "10.1101/gr.279095.124" licence: ["MIT"] - identifier: -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -37,30 +32,43 @@ input: - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + bam: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + versions_fibertoolsrs: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool authors: - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 6722aab2..41bf341b 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -1,48 +1,19 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process FIBERTOOLSRS_NUCLEOSOMES { tag "$meta.id" label 'process_very_high' label 'process_high_memory' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. tuple val(meta), path(bam) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when @@ -50,15 +21,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ ft \\ add-nucleosomes \\ @@ -66,26 +29,12 @@ process FIBERTOOLSRS_NUCLEOSOMES { -t $task.cpus \\ $bam \\ ${prefix}_nuc.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ touch ${prefix}_nuc.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ } diff --git a/modules/local/fibertoolsrs/nucleosomes/meta.yml b/modules/local/fibertoolsrs/nucleosomes/meta.yml index 1863d9f1..120eea88 100644 --- a/modules/local/fibertoolsrs/nucleosomes/meta.yml +++ b/modules/local/fibertoolsrs/nucleosomes/meta.yml @@ -1,33 +1,29 @@ --- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json -name: "fibertoolssrs_nucleosomes" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +name: "fibertoolsrs_nucleosomes" +description: Fibertools-rs add-nucleosomes adds nucleosome positions to fiber-seq BAM files keywords: - - sort - - example - - genomics + - fiberseq + - nucleosomes + - long-read + - epigenetics + - chromatin tools: - - "fibertoolssrs": - ## TODO nf-core: Add a description and other details for the software below - description: "" - homepage: "" - documentation: "" - tool_dev_url: "" - doi: "" - licence: - identifier: + - "fibertoolsrs": + description: "DNA-m6A calling and integrated long-read epigenetic and genetic analysis with fibertools" + homepage: "https://fiberseq.github.io/fibertools/fibertools.html" + documentation: "https://fiberseq.github.io/fibertools/fibertools.html" + tool_dev_url: "https://github.com/fiberseq/fibertools-rs" + doi: "10.1101/gr.279095.124" + licence: ["MIT"] -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -36,31 +32,43 @@ input: - edam: "http://edamontology.org/format_25722" - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" - -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + bam: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + versions_fibertoolsrs: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool authors: - "@robert-a-forsyth" diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index e91572b9..7ea6db24 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -1,48 +1,19 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process FIBERTOOLSRS_PREDICTM6A { tag "$meta.id" label 'process_very_high' label 'process_high_memory' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. tuple val(meta), path(bam) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.bam"), emit: bam - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when @@ -50,15 +21,7 @@ process FIBERTOOLSRS_PREDICTM6A { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) + """ ft \\ predict-m6a \\ @@ -66,26 +29,13 @@ process FIBERTOOLSRS_PREDICTM6A { -t $task.cpus \\ $bam \\ ${prefix}_m6a.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ touch ${prefix}_m6a.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ } diff --git a/modules/local/fibertoolsrs/predictm6a/meta.yml b/modules/local/fibertoolsrs/predictm6a/meta.yml index f9b25d64..dfb5b2e1 100644 --- a/modules/local/fibertoolsrs/predictm6a/meta.yml +++ b/modules/local/fibertoolsrs/predictm6a/meta.yml @@ -1,33 +1,29 @@ --- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "fibertoolsrs_predictm6a" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: Fibertools-rs predict-m6a predicts m6A modifications from fiber-seq data keywords: - - sort - - example - - genomics + - fiberseq + - m6A + - methylation + - long-read + - epigenetics + - DNA-modification tools: - "fibertoolsrs": - ## TODO nf-core: Add a description and other details for the software below - description: "Mitchell Vollger's rust tools for fiberseq data." + description: "DNA-m6A calling and integrated long-read epigenetic and genetic analysis with fibertools" homepage: "https://fiberseq.github.io/fibertools/fibertools.html" documentation: "https://fiberseq.github.io/fibertools/fibertools.html" tool_dev_url: "https://github.com/fiberseq/fibertools-rs" - doi: "" + doi: "10.1101/gr.279095.124" licence: ["MIT"] - identifier: -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -37,30 +33,43 @@ input: - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + bam: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.bam": + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_25722" + - edam: "http://edamontology.org/format_2573" + - edam: "http://edamontology.org/format_3462" + versions_fibertoolsrs: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool authors: - "@MariosEft97" diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf index b99424d6..f89f121b 100644 --- a/modules/local/fibertoolsrs/qc/main.nf +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -1,47 +1,18 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process FIBERTOOLSRS_QC { tag "$meta.id" label 'process_very_high' - // TODO nf-core: List required Conda package(s). - // Software MUST be pinned to channel (i.e. "bioconda"), version (i.e. "1.10"). - // For Conda, the build (i.e. "h9402c20_2") must be EXCLUDED to support installation on different operating systems. - // TODO nf-core: See section in main README for further information regarding finding and adding container addresses to the section below. conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" input: - // TODO nf-core: Where applicable all sample-specific information e.g. "id", "single_end", "read_group" - // MUST be provided as an input via a Groovy Map called "meta". - // This information may not be required in some instances e.g. indexing reference genome files: - // https://github.com/nf-core/modules/blob/master/modules/nf-core/bwa/index/main.nf - // TODO nf-core: Where applicable please provide/convert compressed files as input/output - // e.g. "*.fastq.gz" and NOT "*.fastq", "*.bam" and NOT "*.sam" etc. tuple val(meta), path(bam) output: - // TODO nf-core: Named file extensions MUST be emitted for ALL output channels tuple val(meta), path("*.txt"), emit: qc_txt - // TODO nf-core: List additional required output channels/values here - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when @@ -49,15 +20,6 @@ process FIBERTOOLSRS_QC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: Where possible, a command MUST be provided to obtain the version number of the software e.g. 1.10 - // If the software is unable to output a version number on the command-line then it can be manually specified - // e.g. https://github.com/nf-core/modules/blob/master/modules/nf-core/homer/annotatepeaks/main.nf - // Each software used MUST provide the software name and version number in the YAML version file (versions.yml) - // TODO nf-core: It MUST be possible to pass additional parameters to the tool as a command-line string via the "task.ext.args" directive - // TODO nf-core: If the tool supports multi-threading then you MUST provide the appropriate parameter - // using the Nextflow "task" variable e.g. "--threads $task.cpus" - // TODO nf-core: Please replace the example samtools command below with your module's command - // TODO nf-core: Please indent the command appropriately (4 spaces!!) to help with readability ;) """ ft \\ qc \\ @@ -65,26 +27,13 @@ process FIBERTOOLSRS_QC { -t $task.cpus \\ $bam \\ ${prefix}_qc.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 + """ touch ${prefix}_qc.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fibertoolsrs: \$(ft --version |& sed '1!d ; s/ft //') - END_VERSIONS """ } diff --git a/modules/local/fibertoolsrs/qc/meta.yml b/modules/local/fibertoolsrs/qc/meta.yml index 3a15bee4..ffce7d2a 100644 --- a/modules/local/fibertoolsrs/qc/meta.yml +++ b/modules/local/fibertoolsrs/qc/meta.yml @@ -1,33 +1,28 @@ --- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "fibertoolsrs_qc" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: Fibertools-rs qc generates quality control statistics for fiber-seq BAM files keywords: - - sort - - example - - genomics + - fiberseq + - qc + - quality-control + - long-read + - epigenetics tools: - "fibertoolsrs": - ## TODO nf-core: Add a description and other details for the software below - description: "Mitchell Vollger's rust tools for fiberseq data." + description: "DNA-m6A calling and integrated long-read epigenetic and genetic analysis with fibertools" homepage: "https://fiberseq.github.io/fibertools/fibertools.html" documentation: "https://fiberseq.github.io/fibertools/fibertools.html" tool_dev_url: "https://github.com/fiberseq/fibertools-rs" - doi: "" + doi: "10.1101/gr.279095.124" licence: ["MIT"] - identifier: -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -37,30 +32,39 @@ input: - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + qc_txt: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*.txt": + type: file + description: QC text file + pattern: "*.txt" + versions_fibertoolsrs: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fibertoolsrs: + type: string + description: The tool name + - "ft --version |& sed '1!d ; s/ft //'": + type: string + description: The command used to generate the version of the tool authors: - "@MariosEft97" diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf index 7f032250..954449e7 100644 --- a/modules/local/metaextract/main.nf +++ b/modules/local/metaextract/main.nf @@ -12,7 +12,7 @@ process METAEXTRACT { output: tuple val(meta), env(basecall_model), env(kinetics) , emit: meta_ext - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -29,10 +29,6 @@ process METAEXTRACT { kinetics=\$(samtools view -H ${bam} | awk '/--keep-kinetics/ {found=1} END {print (found ? "true" : "false")}') basecall_model="hifi_revio" fi - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -40,10 +36,5 @@ process METAEXTRACT { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/local/metaextract/meta.yml b/modules/local/metaextract/meta.yml index 542861a6..7850791b 100644 --- a/modules/local/metaextract/meta.yml +++ b/modules/local/metaextract/meta.yml @@ -1,33 +1,30 @@ --- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "metaextract" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: Extract basecall model and kinetics metadata from BAM file headers keywords: - - sort - - example - - genomics + - metadata + - bam + - header + - basecall + - kinetics + - long-read tools: - - "metaextract": - ## TODO nf-core: Add a description and other details for the software below - description: "" - homepage: "" - documentation: "" - tool_dev_url: "" - doi: "" - licence: - identifier: + - "samtools": + description: "Tools for manipulating next-generation sequencing data" + homepage: "http://www.htslib.org/" + documentation: "http://www.htslib.org/doc/samtools.html" + tool_dev_url: "https://github.com/samtools/samtools" + doi: "10.1093/bioinformatics/btp352" + licence: ["MIT"] + identifier: biotools:samtools -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - bam: type: file description: Sorted BAM/CRAM/SAM file @@ -37,30 +34,41 @@ input: - edam: "http://edamontology.org/format_2573" - edam: "http://edamontology.org/format_3462" -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + meta_ext: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - env(basecall_model): + type: string + description: Basecall model extracted from BAM header + - env(kinetics): + type: string + description: Kinetics information extracted from BAM header + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool authors: - "@robert-a-forsyth" diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index ec69277d..ae84f17d 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -16,7 +16,7 @@ process VCFSPLIT { tuple val(meta), path("*germline.vcf.gz") , emit: germline_vcf tuple val(meta), path("*germline.vcf.gz.tbi") , emit: germline_tbi - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version |& sed '1!d ; s/bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -47,11 +47,6 @@ process VCFSPLIT { # Cleanup intermediate files rm indels_pass.vcf.gz snv_pass.vcf.gz rm indels_pass.vcf.gz.tbi snv_pass.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') - END_VERSIONS """ stub: @@ -62,9 +57,5 @@ process VCFSPLIT { echo "" | gzip > germline.vcf.gz echo "" | gzip > somatic.vcf.gz.tbi echo "" | gzip > germline.vcf.gz.tbi - cat <<-END_VERSIONS > versions.yml - "${task.process}": - vcfsplit: \$(bcftools --version |& sed '1!d ; s/bcftools //') - END_VERSIONS """ } diff --git a/modules/local/vcfsplit/meta.yml b/modules/local/vcfsplit/meta.yml index 8f115005..464141a2 100644 --- a/modules/local/vcfsplit/meta.yml +++ b/modules/local/vcfsplit/meta.yml @@ -1,66 +1,102 @@ --- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "vcfsplit" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: Split somatic VCF files into somatic and germline variants based on FILTER field keywords: - - sort - - example - - genomics + - vcf + - somatic + - germline + - variant-filtering + - split tools: - - "vcfsplit": - ## TODO nf-core: Add a description and other details for the software below - description: "" - homepage: "" - documentation: "" - tool_dev_url: "" - doi: "" - licence: - identifier: + - "bcftools": + description: "Tools for variant calling and manipulating VCFs and BCFs" + homepage: "http://samtools.github.io/bcftools/bcftools.html" + documentation: "http://www.htslib.org/doc/bcftools.html" + tool_dev_url: "https://github.com/samtools/bcftools" + doi: "10.1093/gigascience/giab008" + licence: ["MIT"] + identifier: biotools:bcftools -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - - bam: + e.g. `[ id:'sample1' ]` + - snv_vcf: + type: file + description: SNV VCF file from somatic caller + pattern: "*.vcf.gz" + - indel_vcf: type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + description: Indel VCF file from somatic caller + pattern: "*.vcf.gz" -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + somatic_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*somatic.vcf.gz": + type: file + description: Somatic variants VCF file + pattern: "*somatic.vcf.gz" + somatic_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*somatic.vcf.gz.tbi": + type: file + description: Somatic variants VCF index file + pattern: "*somatic.vcf.gz.tbi" + germline_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*germline.vcf.gz": + type: file + description: Germline variants VCF file + pattern: "*germline.vcf.gz" + germline_tbi: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*germline.vcf.gz.tbi": + type: file + description: Germline variants VCF index file + pattern: "*germline.vcf.gz.tbi" + + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version |& sed '1!d ; s/bcftools //'": + type: string + description: The command used to generate the version of the tool - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version |& sed '1!d ; s/bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@robert-a-forsyth" diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 8bd5d5b9..bb7d5974 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -52,7 +52,8 @@ process WAKHAN { tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks - path "versions.yml" , emit: versions + // WARN: Manually update version information as tool does not provide on CLI + tuple val("${task.process}"), val('wakhan'), val("0.2.0"), topic: versions, emit: versions_wakhan when: task.ext.when == null || task.ext.when @@ -61,8 +62,7 @@ process WAKHAN { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def phased_vcf = normal_input ? "--normal-phased-vcf $vcf" : "--tumor-phased-vcf $vcf" - // WARN: Version information not provided by tool on CLI. Please update this string when upgrading BLAZE code - def VERSION = "0.2.0" + """ wakhan \\ --target-bam ${tumor_input} \\ @@ -73,28 +73,13 @@ process WAKHAN { ${phased_vcf} \\ ${args} \\ --threads ${task.cpus} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - wakhan: $VERSION - END_VERSIONS """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = "0.2.0" - // TODO nf-core: A stub section should mimic the execution of the original module as best as possible - // Have a look at the following examples: - // Simple example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bcftools/annotate/main.nf#L47-L63 - // Complex example: https://github.com/nf-core/modules/blob/818474a292b4860ae8ff88e149fbcda68814114d/modules/nf-core/bedtools/split/main.nf#L38-L54 """ touch ${prefix}.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - wakhan: $VERSION - END_VERSIONS """ } diff --git a/modules/local/wakhan/meta.yml b/modules/local/wakhan/meta.yml index 6695af4a..ee0a90c1 100644 --- a/modules/local/wakhan/meta.yml +++ b/modules/local/wakhan/meta.yml @@ -1,66 +1,315 @@ --- # yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "wakhan" -## TODO nf-core: Add a description of the module and list keywords -description: write your description here +description: A tool to analyze haplotype-specific chromosome-scale somatic copy number aberrations and aneuploidy using long reads keywords: - - sort - - example - - genomics + - copy-number + - aneuploidy + - somatic + - haplotype-specific + - long-read + - structural-variation tools: - "wakhan": - ## TODO nf-core: Add a description and other details for the software below - description: "A tool to analyze haplotype-specific chromosome-scale somatic copy number aberrations and aneuploidy using long reads" - homepage: "None" - documentation: "None" - tool_dev_url: "None" - doi: "" + description: "A tool to analyze haplotype-specific chromosome-scale somatic copy number aberrations and aneuploidy using long reads (Oxford Nanopore, PacBio)" + homepage: "https://github.com/KolmogorovLab/Wakhan" + documentation: "https://github.com/KolmogorovLab/Wakhan" + tool_dev_url: "https://github.com/KolmogorovLab/Wakhan" + doi: "10.64898/2025.12.11.25342098v1" licence: ["MIT"] - identifier: -## TODO nf-core: Add a description of all of the variables used as input input: - # Only when we have meta - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ## TODO nf-core: Delete / customise this example input - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + e.g. `[ id:'sample1' ]` + - tumor_input: + type: file + description: Tumor BAM file + pattern: "*.bam" + - tumor_index: + type: file + description: Tumor BAM index file + pattern: "*.bai" + - normal_input: + type: file + description: Normal BAM file (optional) + pattern: "*.bam" + - normal_index: + type: file + description: Normal BAM index file (optional) + pattern: "*.bai" + - vcf: + type: file + description: Phased VCF file + pattern: "*.vcf.gz" + - breakpoints: + type: file + description: Breakpoints file from structural variant caller + pattern: "*.{bed,vcf}" + - - meta2: + type: map + description: | + Groovy Map containing reference information + - reference: + type: file + description: Reference genome fasta file + pattern: "*.{fasta,fa,fna}" -## TODO nf-core: Add a description of all of the variables used as output output: - - bam: - #Only when we have meta - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - ## TODO nf-core: Delete / customise this example output - - "*.bam": - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: - - edam: "http://edamontology.org/format_25722" - - edam: "http://edamontology.org/format_2573" - - edam: "http://edamontology.org/format_3462" + genes_genome_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genes_genome.html": + type: file + description: Genes genome HTML plot + pattern: "*/*_genes_genome.html" + genes_genome_pdf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genes_genome.pdf": + type: file + description: Genes genome PDF plot + pattern: "*/*_genes_genome.pdf" + breakpoints_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genome_copynumbers_breakpoints.html": + type: file + description: Genome copy numbers with breakpoints HTML plot + pattern: "*/*_genome_copynumbers_breakpoints.html" + breakpoints_pdf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genome_copynumbers_breakpoints.pdf": + type: file + description: Genome copy numbers with breakpoints PDF plot + pattern: "*/*_genome_copynumbers_breakpoints.pdf" + breakpoints_subclonal_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genome_copynumbers_breakpoints_subclonal.html": + type: file + description: Genome copy numbers with subclonal breakpoints HTML plot + pattern: "*/*_genome_copynumbers_breakpoints_subclonal.html" + breakpoints_subclonal_pdf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genome_copynumbers_breakpoints_subclonal.pdf": + type: file + description: Genome copy numbers with subclonal breakpoints PDF plot + pattern: "*/*_genome_copynumbers_breakpoints_subclonal.pdf" + copynumbers_details_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genome_copynumbers_details.html": + type: file + description: Genome copy numbers details HTML plot + pattern: "*/*_genome_copynumbers_details.html" + copynumbers_details_pdf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/*_genome_copynumbers_details.pdf": + type: file + description: Genome copy numbers details PDF plot + pattern: "*/*_genome_copynumbers_details.pdf" + bed_files: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/bed_output/*.bed": + type: file + description: BED output files + pattern: "*/bed_output/*.bed" + variation_plots: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/variation_plots/*.html": + type: file + description: Variation plots HTML files + pattern: "*/variation_plots/*.html" + vcf_files: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*/vcf_output/*_wakhan_cna_*.vcf": + type: file + description: Wakhan CNA VCF files + pattern: "*/vcf_output/*_wakhan_cna_*.vcf" + heatmap_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*_heatmap_ploidy_purity.html": + type: file + description: Heatmap ploidy purity HTML plot + pattern: "*_heatmap_ploidy_purity.html" + heatmap_pdf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*_heatmap_ploidy_purity.html.pdf": + type: file + description: Heatmap ploidy purity PDF plot + pattern: "*_heatmap_ploidy_purity.html.pdf" + optimized_peak_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "*_optimized_peak.html": + type: file + description: Optimized peak HTML plot + pattern: "*_optimized_peak.html" + coverage_csv: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "coverage_data/*.csv": + type: file + description: Coverage data CSV files + pattern: "coverage_data/*.csv" + coverage_plots_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "coverage_plots/*.html": + type: file + description: Coverage plots HTML files + pattern: "coverage_plots/*.html" + coverage_plots_pdf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "coverage_plots/*.pdf": + type: file + description: Coverage plots PDF files + pattern: "coverage_plots/*.pdf" + phasing_html: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "phasing_output/*.html": + type: file + description: Phasing output HTML plots + pattern: "phasing_output/*.html" + phasing_pdf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "phasing_output/*.pdf": + type: file + description: Phasing output PDF plots + pattern: "phasing_output/*.pdf" + rephased_vcf: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "phasing_output/*.rephased.vcf.gz": + type: file + description: Rephased VCF file + pattern: "phasing_output/*.rephased.vcf.gz" + rephased_vcf_index: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "phasing_output/*.rephased.vcf.gz.csi": + type: file + description: Rephased VCF index file + pattern: "phasing_output/*.rephased.vcf.gz.csi" + snps_loh_plot: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "snps_loh_plots/*_genome_snps_ratio_loh.html": + type: file + description: SNPs LOH plot HTML file + pattern: "snps_loh_plots/*_genome_snps_ratio_loh.html" + solutions_ranks: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "solutions_ranks.tsv": + type: file + description: Solutions ranks TSV file + pattern: "solutions_ranks.tsv" + versions_wakhan: + - - ${task.process}: + type: string + description: The process the versions were collected from + - wakhan: + type: string + description: The tool name + - "0.2.0": + type: string + description: The version of wakhan - - versions: - - "versions.yml": - type: file - description: File containing software versions - pattern: "versions.yml" +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - wakhan: + type: string + description: The tool name + - "0.2.0": + type: string + description: The version of wakhan authors: - "@ljwharbers" From d777e583bba8b7959ecfbc2519549491efd8c493 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 11:09:47 +0100 Subject: [PATCH 025/183] pre-commit --- modules/local/clairsto/meta.yml | 2 +- modules/local/cramino/meta.yml | 1 - modules/local/fibertoolsrs/fire/main.nf | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/local/clairsto/meta.yml b/modules/local/clairsto/meta.yml index 91f3b91c..39201688 100644 --- a/modules/local/clairsto/meta.yml +++ b/modules/local/clairsto/meta.yml @@ -139,7 +139,7 @@ topics: - "/opt/bin/run_clairs_to --version |& sed '1!d ; s/run_clairs_to //'": type: string description: The command used to generate the version of the tool - + authors: - "@robert-a-forsyth" maintainers: diff --git a/modules/local/cramino/meta.yml b/modules/local/cramino/meta.yml index 09e361e8..93fbea6c 100644 --- a/modules/local/cramino/meta.yml +++ b/modules/local/cramino/meta.yml @@ -69,7 +69,6 @@ topics: type: string description: The command used to generate the version of the tool - authors: - "@alexanRNA" maintainers: diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 87c5b39f..e65c623c 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -2,7 +2,7 @@ process FIBERTOOLSRS_FIRE { tag "$meta.id" label 'process_very_high' label 'process_high_memory' - + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': From cf01c780ef663d5c2a1aac8674f233252420dadf Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:14:30 +0100 Subject: [PATCH 026/183] mass updates of nf-core modules and subworkflows --- modules.json | 63 +-- modules/nf-core/ascat/ascat.diff | 197 ++++++++ .../bcftools/concat/tests/main.nf.test | 68 +-- .../bcftools/concat/tests/main.nf.test.snap | 44 +- .../bcftools/concat/tests/nextflow.config | 2 +- .../concat/tests/vcf_gz_index_csi.config | 2 +- .../ensemblvep/download/environment.yml | 3 +- modules/nf-core/ensemblvep/download/main.nf | 4 +- .../download/tests/main.nf.test.snap | 436 ++++++++--------- .../ensemblvep/download/tests/nextflow.config | 2 +- .../ensemblvep/vep/ensemblvep-vep.diff | 131 ------ .../longphase/haplotag/environment.yml | 4 +- modules/nf-core/longphase/haplotag/main.nf | 4 +- .../longphase/haplotag/tests/main.nf.test | 2 +- .../haplotag/tests/main.nf.test.snap | 52 +-- .../nf-core/longphase/phase/environment.yml | 4 +- modules/nf-core/longphase/phase/main.nf | 33 +- modules/nf-core/longphase/phase/meta.yml | 32 +- .../longphase/phase/tests/main.nf.test | 38 +- .../longphase/phase/tests/main.nf.test.snap | 183 ++++++-- .../minimap2/align/minimap2-align.diff | 18 + modules/nf-core/modkit/pileup/environment.yml | 2 +- modules/nf-core/modkit/pileup/main.nf | 16 +- modules/nf-core/modkit/pileup/meta.yml | 30 +- .../nf-core/modkit/pileup/tests/main.nf.test | 123 ++--- .../modkit/pileup/tests/main.nf.test.snap | 440 +++++------------- .../modkit/pileup/tests/nextflow.config | 5 + .../pileup/tests/nextflow.traditional.config | 5 - .../tests/nextflow.traditional_hp.config | 5 - .../nextflow.traditional_hp_bedgraph.config | 5 - modules/nf-core/mosdepth/environment.yml | 4 +- modules/nf-core/mosdepth/main.nf | 4 +- .../nf-core/mosdepth/tests/main.nf.test.snap | 116 ++--- .../nf-core/mosdepth/tests/quantized.config | 2 +- .../nf-core/mosdepth/tests/threshold.config | 2 +- modules/nf-core/mosdepth/tests/window.config | 2 +- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 44 +- modules/nf-core/multiqc/meta.yml | 43 +- .../multiqc/tests/custom_prefix.config | 5 + modules/nf-core/multiqc/tests/main.nf.test | 32 +- .../nf-core/multiqc/tests/main.nf.test.snap | 52 ++- .../pigz/uncompress/tests/main.nf.test | 8 +- modules/nf-core/samtools/cat/environment.yml | 6 +- modules/nf-core/samtools/cat/main.nf | 4 +- .../samtools/cat/tests/main.nf.test.snap | 16 +- .../nf-core/samtools/faidx/environment.yml | 6 +- modules/nf-core/samtools/faidx/main.nf | 17 +- modules/nf-core/samtools/faidx/meta.yml | 27 +- .../nf-core/samtools/faidx/tests/main.nf.test | 80 ++-- .../samtools/faidx/tests/main.nf.test.snap | 188 +++++--- .../samtools/faidx/tests/nextflow.config | 2 +- .../samtools/faidx/tests/nextflow2.config | 6 - .../nf-core/samtools/flagstat/environment.yml | 6 +- modules/nf-core/samtools/flagstat/main.nf | 18 +- .../samtools/flagstat/tests/main.nf.test.snap | 24 +- .../nf-core/samtools/idxstats/environment.yml | 6 +- modules/nf-core/samtools/idxstats/main.nf | 4 +- .../samtools/idxstats/tests/main.nf.test.snap | 20 +- .../nf-core/samtools/index/environment.yml | 6 +- modules/nf-core/samtools/index/main.nf | 4 +- .../samtools/index/tests/main.nf.test.snap | 58 +-- .../samtools/stats/samtools-stats.diff | 18 + modules/nf-core/severus/environment.yml | 2 +- modules/nf-core/severus/main.nf | 88 ++-- modules/nf-core/severus/meta.yml | 169 ++++--- .../nf-core/severus/tests/main.nf.test.snap | 91 ++-- modules/nf-core/severus/tests/tags.yml | 2 - modules/nf-core/untar/meta.yml | 8 +- subworkflows/local/prepare_reference_files.nf | 2 - subworkflows/local/tumor_normal_happhase.nf | 30 +- subworkflows/local/tumor_only_happhase.nf | 24 +- .../nf-core/bam_stats_samtools/main.nf | 1 - .../tests/main.nf.test.snap | 99 ++-- 74 files changed, 1765 insertions(+), 1536 deletions(-) create mode 100644 modules/nf-core/ascat/ascat.diff delete mode 100644 modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff create mode 100644 modules/nf-core/minimap2/align/minimap2-align.diff create mode 100644 modules/nf-core/modkit/pileup/tests/nextflow.config delete mode 100644 modules/nf-core/modkit/pileup/tests/nextflow.traditional.config delete mode 100644 modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config delete mode 100644 modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config create mode 100644 modules/nf-core/multiqc/tests/custom_prefix.config delete mode 100644 modules/nf-core/samtools/faidx/tests/nextflow2.config create mode 100644 modules/nf-core/samtools/stats/samtools-stats.diff delete mode 100644 modules/nf-core/severus/tests/tags.yml diff --git a/modules.json b/modules.json index 79fd390e..36f2aa24 100644 --- a/modules.json +++ b/modules.json @@ -7,12 +7,13 @@ "nf-core": { "ascat": { "branch": "master", - "git_sha": "98ffb090029d17a9fb8de75dadcfe6bc8b6377ec", - "installed_by": ["modules"] + "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "installed_by": ["modules"], + "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { @@ -28,18 +29,18 @@ }, "ensemblvep/download": { "branch": "master", - "git_sha": "2fcc53751152a999bfc9c24f75f494b9e5bb338f", + "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", - "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", + "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "longphase/phase": { @@ -50,28 +51,28 @@ }, "minimap2/align": { "branch": "master", - "git_sha": "1a5a9e7b4009dcf34e6867dd1a5a1d9a718b027b", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["modules"], + "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", "installed_by": ["modules"] }, "mosdepth": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "af27af1be706e6a2bb8fe454175b0cdf77f47b49", -<<<<<<< HEAD + "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", "installed_by": ["modules"] }, "pigz/uncompress": { @@ -81,43 +82,44 @@ }, "samtools/cat": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "f4eab7945952dc4934224309701a49913ea05ae6", - "installed_by": ["modules"] + "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "installed_by": ["bam_stats_samtools"], + "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", "installed_by": ["modules"] }, "unzip": { @@ -128,27 +130,30 @@ "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", -======= ->>>>>>> TEMPLATE "installed_by": ["modules"] } } }, "subworkflows": { "nf-core": { + "bam_stats_samtools": { + "branch": "master", + "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", + "installed_by": ["subworkflows"] + }, "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "271e7fc14eb1320364416d996fb077421f3faed2", + "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "4b406a74dc0449c0401ed87d5bfff4252fd277fd", + "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff new file mode 100644 index 00000000..36f9216e --- /dev/null +++ b/modules/nf-core/ascat/ascat.diff @@ -0,0 +1,197 @@ +Changes in component 'nf-core/ascat' +'modules/nf-core/ascat/meta.yml' is unchanged +Changes in 'ascat/main.nf': +--- modules/nf-core/ascat/main.nf ++++ modules/nf-core/ascat/main.nf +@@ -4,11 +4,12 @@ + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? +- 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0': +- 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0' }" ++ 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0': ++ 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0' }" + + input: + tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) ++ val(genomeVersion) + path(allele_files) + path(loci_files) + path(bed_file) // optional +@@ -23,8 +24,10 @@ + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png ++ tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments ++ tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true + path "versions.yml", emit: versions + + when: +@@ -34,11 +37,12 @@ + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def gender = args.gender ? "$args.gender" : "NULL" +- def genomeVersion = args.genomeVersion ? "$args.genomeVersion" : "NULL" + def purity = args.purity ? "$args.purity" : "NULL" + def ploidy = args.ploidy ? "$args.ploidy" : "NULL" ++ def penalty = args.penalty ? "$args.penalty" : "NULL" + def gc_input = gc_file ? "$gc_file" : "NULL" + def rt_input = rt_file ? "$rt_file" : "NULL" ++ def pdf_plots = args.pdf_plots ? "$args.pdf_plots" : "NULL" + + def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" + def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" +@@ -48,7 +52,12 @@ + def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" + def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" + def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" +- ++ ++ def normal_exists = input_normal ? 'TRUE' : 'FALSE' ++ def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" ++ def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" ++ def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" ++ def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" + """ + #!/usr/bin/env Rscript + library(RColorBrewer) +@@ -65,21 +74,23 @@ + #prepare from BAM files + ascat.prepareHTS( + tumourseqfile = "$input_tumor", +- normalseqfile = "$input_normal", + tumourname = paste0("$prefix", ".tumour"), +- normalname = paste0("$prefix", ".normal"), + allelecounter_exe = "alleleCounter", + alleles.prefix = allele_prefix, + loci.prefix = loci_prefix, + gender = "$gender", + genomeVersion = "$genomeVersion", + nthreads = $task.cpus ++ $normal_bam ++ $normal_name + $minCounts_arg + $bed_file_arg + $chrom_names_arg + $min_base_qual_arg + $min_map_qual_arg ++ $longread_bins + $fasta_arg ++ $allele_counter_flags + $skip_allele_counting_tumour_arg + $skip_allele_counting_normal_arg, + seed = 42 +@@ -87,37 +98,55 @@ + + + #Load the data +- ascat.bc = ascat.loadData( +- Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), +- Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), +- Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), +- Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), +- genomeVersion = "$genomeVersion", +- gender = "$gender" +- ) ++ if($normal_exists) { ++ print("normal exists") ++ ascat.bc = ascat.loadData( ++ Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), ++ Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), ++ Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), ++ Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), ++ genomeVersion = "$genomeVersion", ++ gender = "$gender" ++ ) ++ } else { ++ print("normal does not exist") ++ ascat.bc = ascat.loadData( ++ Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), ++ Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), ++ genomeVersion = "$genomeVersion", ++ gender = "$gender") ++ gg = ascat.predictGermlineGenotypes(ascat.bc, platform = "WGS_hg38_50X") ++ ++ } ++ print("printing ascat.bc") ++ print(ascat.bc) + + #Plot the raw data + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) + + # optional LogRCorrection + if("$gc_input" != "NULL") { +- gc_input = paste0(normalizePath("$gc_input"), "/", "$gc_input", ".txt") ++ gc_input = paste0(normalizePath("$gc_input")) + + if("$rt_input" != "NULL"){ +- rt_input = paste0(normalizePath("$rt_input"), "/", "$rt_input", ".txt") ++ rt_input = paste0(normalizePath("$rt_input")) + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) + } + else { +- ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = $rt_input) ++ ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) + } + } + + #Segment the data +- ascat.bc = ascat.aspcf(ascat.bc, seed=42) ++ if($normal_exists) { ++ ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) ++ } else { ++ ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) ++ } + + #Plot the segmented data + ascat.plotSegmentedData(ascat.bc) +@@ -125,13 +154,13 @@ + #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers + #If psi and rho are manually set: + if (!is.null($purity) && !is.null($ploidy)){ +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = "$pdf_plots") + } else if(!is.null($purity) && is.null($ploidy)){ +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = "$pdf_plots") + } else if(!is.null($ploidy) && is.null($purity)){ +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = "$pdf_plots") + } else { +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1) ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = "$pdf_plots") + } + + #Extract metrics from ASCAT profiles +@@ -139,6 +168,17 @@ + + #Write out segmented regions (including regions with one copy of each allele) + write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) ++ ++ #Write out raw segmented regions (including regions with one copy of each allele) ++ tryCatch({ # In case segments_raw is not selected ++ write.table( ++ ascat.output[["segments_raw"]], ++ file = paste0(prefix, ".segments_raw.txt"), ++ sep = "\t", quote = FALSE, row.names = FALSE ++ ) ++ }, error = function(e) { ++ message("Error in writing segments_raw: ", conditionMessage(e)) ++ }) + + #Write out CNVs in bed format + cnvs=ascat.output[["segments"]][2:6] +@@ -197,4 +237,4 @@ + """ + + +-} ++} +'modules/nf-core/ascat/environment.yml' is unchanged +************************************************************ diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test b/modules/nf-core/bcftools/concat/tests/main.nf.test index 442f4b4e..9c4e4baf 100644 --- a/modules/nf-core/bcftools/concat/tests/main.nf.test +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test @@ -19,12 +19,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ @@ -50,12 +50,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ @@ -87,12 +87,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ @@ -124,12 +124,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ @@ -162,8 +162,8 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [] ] @@ -191,12 +191,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ @@ -223,12 +223,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ @@ -256,12 +256,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ @@ -289,12 +289,12 @@ nextflow_process { input[0] = [ [ id:'test3' ], // meta map [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz', checkIfExists: true) ], [ - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr22.vcf.gz.csi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr22.1X.vcf.gz.csi', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878_GIAB.chr21_22.vcf.gz.csi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/vcf/NA12878.chr21_22.1X.glimpse2.vcf.gz.csi', checkIfExists: true) ] ] """ diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap index b82169c9..8d1a6363 100644 --- a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap @@ -6,7 +6,7 @@ { "id": "test3" }, - "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + "test3_vcf.vcf.gz:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], [ @@ -25,10 +25,10 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T11:26:25.259752" + "timestamp": "2025-11-26T16:53:25.503018154" }, "homo_sapiens - [[vcf1, vcf2], []]": { "content": [ @@ -38,7 +38,7 @@ { "id": "test3" }, - "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + "test3.vcf:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], "1": [ @@ -61,7 +61,7 @@ { "id": "test3" }, - "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + "test3.vcf:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], "versions": [ @@ -70,10 +70,10 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T10:03:17.250013" + "timestamp": "2025-11-26T16:56:01.364652383" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { "content": [ @@ -182,7 +182,7 @@ { "id": "test3" }, - "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + "test3_vcf.vcf.gz:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], [ @@ -201,10 +201,10 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T11:26:31.742638" + "timestamp": "2025-11-26T16:53:33.38516503" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]": { "content": [ @@ -214,7 +214,7 @@ { "id": "test3" }, - "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + "test3.vcf:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], "1": [ @@ -237,7 +237,7 @@ { "id": "test3" }, - "test3.vcf:md5,bba76244f79c4e307bd0c4c09095885f" + "test3.vcf:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], "versions": [ @@ -246,10 +246,10 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T10:29:33.203302" + "timestamp": "2025-11-26T16:55:30.850726912" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index": { "content": [ @@ -258,7 +258,7 @@ { "id": "test3" }, - "test3_vcf.vcf.gz:md5,85db49dd1629d60e1165f491df6348f6" + "test3_vcf.vcf.gz:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], [ @@ -277,10 +277,10 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-15T11:26:17.482474" + "timestamp": "2025-11-26T16:53:18.091429133" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub": { "content": [ diff --git a/modules/nf-core/bcftools/concat/tests/nextflow.config b/modules/nf-core/bcftools/concat/tests/nextflow.config index c6a5142a..1d5fee9e 100644 --- a/modules/nf-core/bcftools/concat/tests/nextflow.config +++ b/modules/nf-core/bcftools/concat/tests/nextflow.config @@ -1,3 +1,3 @@ process { - ext.args = "--no-version" + ext.args = "--no-version -a" } 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 index afa03d74..2455b145 100644 --- a/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config +++ b/modules/nf-core/bcftools/concat/tests/vcf_gz_index_csi.config @@ -1,4 +1,4 @@ process { ext.prefix = { "${meta.id}_vcf" } - ext.args = "--output-type z --write-index=csi --no-version --allow-overlaps" + ext.args = "--output-type z --write-index=csi --no-version --allow-overlaps -a" } diff --git a/modules/nf-core/ensemblvep/download/environment.yml b/modules/nf-core/ensemblvep/download/environment.yml index c73d7e1e..d9ed9b6b 100644 --- a/modules/nf-core/ensemblvep/download/environment.yml +++ b/modules/nf-core/ensemblvep/download/environment.yml @@ -4,4 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::ensembl-vep=115 + # renovate: datasource=conda depName=bioconda/ensembl-vep + - bioconda::ensembl-vep=115.2=pl5321h2a3209d_1 diff --git a/modules/nf-core/ensemblvep/download/main.nf b/modules/nf-core/ensemblvep/download/main.nf index 714d7088..f7693216 100644 --- a/modules/nf-core/ensemblvep/download/main.nf +++ b/modules/nf-core/ensemblvep/download/main.nf @@ -4,8 +4,8 @@ process ENSEMBLVEP_DOWNLOAD { conda "${moduleDir}/environment.yml" container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f1/f1872dbae2edaae3b7591ac2769efb2de3969adb34752a3ce7cdc9a1409640bb/data' - : 'community.wave.seqera.io/library/ensembl-vep:115--3f10c53a4cdeedf2'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4b/4b5a8c173dc9beaa93effec76b99687fc926b1bd7be47df5d6ce19d7d6b4d6b7/data' + : 'community.wave.seqera.io/library/ensembl-vep:115.2--90ec797ecb088e9a'}" input: tuple val(meta), val(assembly), val(species), val(cache_version) diff --git a/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap index 2f7c7aed..ee94eef6 100644 --- a/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap +++ b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap @@ -11,124 +11,124 @@ [ [ [ - "1-1000000.gz:md5,bb3f43b7512715df72792988ed262d0e", - "10000001-11000000.gz:md5,3a2acf075f478e42dab768cc3913d3f7", - "1000001-2000000.gz:md5,2a1fa1b46a47f90fe36b5c8ab35d01a1", - "11000001-12000000.gz:md5,e16032d944e54a4f41a82925817f88c6", - "12000001-13000000.gz:md5,f51d695b264752299a031b9dbcc44de1", - "13000001-14000000.gz:md5,1532d1764ee39bfd8e1be8b50974ab29", - "14000001-15000000.gz:md5,24173fdc2f65e39aac7ecc4c2726fcf2", - "15000001-16000000.gz:md5,d36d8154114de70c6779ebfb08f1ff8a", - "2000001-3000000.gz:md5,dadb500858b247daf0cf5562938a081d", - "3000001-4000000.gz:md5,eaaebe12f3402b7794c1d82a677ff5ad", - "4000001-5000000.gz:md5,84633b5ee211f4e23170233aefc415ee", - "5000001-6000000.gz:md5,de297b2d604da2070f9630a83db73b22", - "6000001-7000000.gz:md5,0fa47dad82ca5bce6ef96afc491a602c", - "7000001-8000000.gz:md5,2387061609a13eeaeb89a90dd13b1495", - "8000001-9000000.gz:md5,1bfd2fea5051d0a09dde436e75733739", - "9000001-10000000.gz:md5,dbb48f71832f61b9ec01c6f60548e954" + "1-1000000.gz:md5,f9cb33a3ddbb1b82597b3af3e9643dd3", + "10000001-11000000.gz:md5,71aa93ae6388be95fa5269be60236b95", + "1000001-2000000.gz:md5,956f858010c1346ee042ef0ea522043b", + "11000001-12000000.gz:md5,30274a3b8244e492cdf1f611a04848db", + "12000001-13000000.gz:md5,b28d20155f72c1261ba4bb08bea3d302", + "13000001-14000000.gz:md5,293a59ed7b397c1817d77412e124df53", + "14000001-15000000.gz:md5,5291aeb2805c8823b44562d875c7905e", + "15000001-16000000.gz:md5,7fd86078be5f3a400635b269a02185ea", + "2000001-3000000.gz:md5,7f6241cf8e3c91e1c882f3cc86d2dc3a", + "3000001-4000000.gz:md5,e77dc4834119301bbe19dc2a4a05348a", + "4000001-5000000.gz:md5,ac34c2980fea824b21e04874847904ad", + "5000001-6000000.gz:md5,3dfdb3bcd812de1e2b69cfca89a1c1f9", + "6000001-7000000.gz:md5,8446c31796e1aee447af2e353b3734a1", + "7000001-8000000.gz:md5,f84e88618cf747c774ddb98d971e2615", + "8000001-9000000.gz:md5,3094317bb21e35067424e9ad957dfcbe", + "9000001-10000000.gz:md5,3883799cae1ed356ecb416550a89ebde" ], [ - "1-1000000.gz:md5,701d7a2d7afa18b4efd7db488089f162", - "10000001-11000000.gz:md5,105bf3809d7be6f5c310383d5013e633", - "1000001-2000000.gz:md5,9b9eae5303b82666138619afd7b562dd", - "11000001-12000000.gz:md5,c5cc2c2dd5afc3028f3f0a7c03c067c1", - "12000001-13000000.gz:md5,721a1108f6d3b83f1ec96cf39ac9844d", - "13000001-14000000.gz:md5,9fec39204bcdcc5e0458b4ae19ca6f60", - "14000001-15000000.gz:md5,234b0a0b377b6740b70b29ecf0beb9fb", - "15000001-16000000.gz:md5,18444392a5aa3a7e2f09606f3481b765", - "2000001-3000000.gz:md5,e7ed6a622c2759de225b4602feabc1d1", - "3000001-4000000.gz:md5,fde2094cb236ed5cca8f1d6ef2d1e2ed", - "4000001-5000000.gz:md5,2035077fec25cb75beaaf61a0801ec0b", - "5000001-6000000.gz:md5,7d5534332f9aee366ad57add71bb0625", - "6000001-7000000.gz:md5,3da3614a656ed04dd8ba6f06b4c12c37", - "7000001-8000000.gz:md5,f24538b6263452002c9eef88657f332a", - "8000001-9000000.gz:md5,c1357499904580cb780ef275493d06a5", - "9000001-10000000.gz:md5,ed7fee5ec049da066556e033cec1f9b1" + "1-1000000.gz:md5,c2393dd5d120068d496b8789bee91974", + "10000001-11000000.gz:md5,106ab30775ba5fa950f8df7909a163b2", + "1000001-2000000.gz:md5,beeda6a82ca6800093d96bbf2eaa81f9", + "11000001-12000000.gz:md5,27d27c0245dbbb270b2001ca75b03042", + "12000001-13000000.gz:md5,8eea54682f0ef9e1977527999f6bfe29", + "13000001-14000000.gz:md5,5f4581505ebf8c4488bff65b16f125e0", + "14000001-15000000.gz:md5,00e8035d7e179ee51faa7032db090fad", + "15000001-16000000.gz:md5,c8438ec1765eb98cfca60eb2165f4d70", + "2000001-3000000.gz:md5,cf3f572db267b4a8552b37d1c3a78b2d", + "3000001-4000000.gz:md5,ec7df072bf71748c26e25afc2ea353f1", + "4000001-5000000.gz:md5,9dd91cde9d18bae0c884dff7050abaef", + "5000001-6000000.gz:md5,1be8b286a79eebb80ff0684f5c110407", + "6000001-7000000.gz:md5,a0debd5341d3e5ba986225f0f45d01b9", + "7000001-8000000.gz:md5,fc2d82666540059fea44c14569208b14", + "8000001-9000000.gz:md5,0a75c0b27da2c4ae946fdae5e5d83e59", + "9000001-10000000.gz:md5,172900e4145c9a9aa783f01550f4d8a2" ], [ - "1-1000000.gz:md5,e4167c4f03a10c72e22231bce4138383", - "10000001-11000000.gz:md5,a0d9708cbad465edc12f3ce420aa2516", - "1000001-2000000.gz:md5,0b7849c9659b74518f94f0ff760c07c3", - "11000001-12000000.gz:md5,743d76706105cf702cd1eac015c0afd3", - "12000001-13000000.gz:md5,f66f0aa9a02ab3e781cb04d10cc05093", - "13000001-14000000.gz:md5,56dd08b3ddc0b003221e1a1d16331d61", - "2000001-3000000.gz:md5,5477e38b3d53108e4e8ef70b4576dacd", - "3000001-4000000.gz:md5,bd40e0f8602020d14e3e38aeb3a9f31c", - "4000001-5000000.gz:md5,6ae06d70e1fa445e46d66e69b0ca629f", - "5000001-6000000.gz:md5,db03cd98e32f6adb5b424a81420b983c", - "6000001-7000000.gz:md5,4dffec87c3e18cd5c5cdb0befa3230c8", - "7000001-8000000.gz:md5,96ed0ed8f00382c43f6686f70f2b3925", - "8000001-9000000.gz:md5,5c20ed1c637e1182766e66f5741bd070", - "9000001-10000000.gz:md5,2ecd0f2778a09425a2c83e4b5e76ba1b" + "1-1000000.gz:md5,d1d97f733248a030e650a9bd1e7f41bc", + "10000001-11000000.gz:md5,429d681ffa8ca9dc23c62cdab4ffc42b", + "1000001-2000000.gz:md5,58be924f576c85b462df995b76074c9d", + "11000001-12000000.gz:md5,f789a4312ddd0bd423b3c55f66af782c", + "12000001-13000000.gz:md5,76a0fdd867ca559eaf5e8fe3e0f8ea94", + "13000001-14000000.gz:md5,867d9a3b7b6a720b634180efebf65658", + "2000001-3000000.gz:md5,e93c4b398494843b309abf71b218c14a", + "3000001-4000000.gz:md5,ff5b0d6680207d23490279c5f62ba33b", + "4000001-5000000.gz:md5,8b5e33878c599de252a931205a034446", + "5000001-6000000.gz:md5,25b9f4a4edafb9572c323ca1783dd7c1", + "6000001-7000000.gz:md5,c52c31d11ab225f7c9793f0c82ce72e6", + "7000001-8000000.gz:md5,a894863e34285ca3b042cd0eeed253c6", + "8000001-9000000.gz:md5,bcce1adf098aa44c0e55a2df2d801449", + "9000001-10000000.gz:md5,b27661dc26cd23c6a9c41cc885187b4f" ], [ - "1-1000000.gz:md5,28ab3ff34fdd100a65afb89b4ae0f825", - "10000001-11000000.gz:md5,feaf25015c12e72ea5c9e444ffb9a6a9", - "1000001-2000000.gz:md5,8878c44d092a2f7de7298bcecc43da73", - "11000001-12000000.gz:md5,60764928b738a5afb38e739747945ee0", - "12000001-13000000.gz:md5,a397368a23323df7104469537ef4e363", - "13000001-14000000.gz:md5,ecefb54ca22247017c75d8af2fc72e67", - "14000001-15000000.gz:md5,513213c222473a434e73b79927fa3eb3", - "15000001-16000000.gz:md5,b381b0e58227aec9cd1e78f3c2ace485", - "16000001-17000000.gz:md5,44a78638fbdd9d56f20462ba50867d14", - "17000001-18000000.gz:md5,fb6bdfe6078d861895a83f4f7232f74d", - "2000001-3000000.gz:md5,3fe93a5ff45260e3814e177e0f91a9e9", - "3000001-4000000.gz:md5,d449609384c8c0a6cf159b556ef29d47", - "4000001-5000000.gz:md5,201ec9eb75148838ef97bb931acdc02f", - "5000001-6000000.gz:md5,44166dce1082f3e3ce9128930a7aa6a3", - "6000001-7000000.gz:md5,0a54b8acee2e4531423079f361e465ee", - "7000001-8000000.gz:md5,17f245e52522d1270e7005a633eea682", - "8000001-9000000.gz:md5,5f364dabdef97a204e89bce1b9835822", - "9000001-10000000.gz:md5,bb77aff8a7673b2153476b0b9374ffd8" + "1-1000000.gz:md5,70dfe9bedc7a87a063f9b6f2e48b846b", + "10000001-11000000.gz:md5,767a1bd59613ad669cbb835cc11d06ff", + "1000001-2000000.gz:md5,9e1276159b8a073611f048cf6c4a0738", + "11000001-12000000.gz:md5,93dcc27f1185c7af20489ce5796da68e", + "12000001-13000000.gz:md5,0bc55d7b3f7419adcdbf474b7192c5ba", + "13000001-14000000.gz:md5,2a8c5ee78d9d2b462ec889733f311c19", + "14000001-15000000.gz:md5,68e79d710886838294c8de27ea7c1c00", + "15000001-16000000.gz:md5,d975f06bf6f8f1722c29c7b8cce7095b", + "16000001-17000000.gz:md5,bf59b0b7461b4c97520762754a91e41c", + "17000001-18000000.gz:md5,3174d1bff1351ee17f632c6adec54c90", + "2000001-3000000.gz:md5,22ac8f1975b085ed3f5773bc220ff120", + "3000001-4000000.gz:md5,0a8a89f524f7955f3db2847344e688d9", + "4000001-5000000.gz:md5,648d45d681cc4cbe68db4638665122ca", + "5000001-6000000.gz:md5,dfe8c94f45221ed152874083ec0991e2", + "6000001-7000000.gz:md5,e9c705d31a7c1cac9d02c6a018a0d655", + "7000001-8000000.gz:md5,723513cca5842d5c238dc110075ad8dd", + "8000001-9000000.gz:md5,3703d6fbdad1f21a2c1f40c5d8ad5371", + "9000001-10000000.gz:md5,afb3ba977fc7cd18b47bb5fa6fc85832" ], [ - "1-1000000.gz:md5,ad7333dd27732b000f1fb91c69accc47" + "1-1000000.gz:md5,397d664998c2dbfd56c0af94c385f5ee" ], [ - "1-1000000.gz:md5,a104f41c6b74d3657094341960b3e9aa", - "10000001-11000000.gz:md5,cb73357d42446a2a62d41b4ab6814486", - "1000001-2000000.gz:md5,c3d1f590019cb2d9a3fe138ebc3d4adb", - "11000001-12000000.gz:md5,f5de9fb9e6a24c3a0176951fe70cfd35", - "12000001-13000000.gz:md5,ad46cdbd9087eeac328e8dcecb60bdd6", - "13000001-14000000.gz:md5,635dbb498a367214ca45ea4466e15c27", - "14000001-15000000.gz:md5,b4e72a2a01c2d524c1076a9aeb5be6ed", - "15000001-16000000.gz:md5,4ce9dd41ed032eac6234ae6d414dead8", - "16000001-17000000.gz:md5,908fc89908bf5be9862c9f989e105a97", - "17000001-18000000.gz:md5,7bda940567e9c6fa9ba5493911e607b7", - "18000001-19000000.gz:md5,94c81ccdf2110781989774198c725e76", - "19000001-20000000.gz:md5,8e39cf5f5b24bb28c117d502a5d4cd64", - "20000001-21000000.gz:md5,d9a72ba97be5648b08ac53bc4649086e", - "2000001-3000000.gz:md5,e90cc7adc6c60b2b37736f572fe79166", - "3000001-4000000.gz:md5,6b5bbecf824fc18ce9b46c1cbedf0984", - "4000001-5000000.gz:md5,beccbf5aee5031d2d6bc29f2c7486672", - "5000001-6000000.gz:md5,23810c84b4f8607537321f0823a48db3", - "6000001-7000000.gz:md5,d9008100f5e23d3f42849d2bb9c45432", - "7000001-8000000.gz:md5,079f7fa854d40d426925d85a58d688e0", - "8000001-9000000.gz:md5,f000a7feaa7b461cdb6fc3df3651f6ae", - "9000001-10000000.gz:md5,154d5d7cf4d70cc3d9ea2349af7103be" + "1-1000000.gz:md5,ce88865c73633b2b57e6f3481a21b3f8", + "10000001-11000000.gz:md5,8f1f45979e56451d44a3887321910d30", + "1000001-2000000.gz:md5,c40b987ac5b22a6674055849e24204ad", + "11000001-12000000.gz:md5,4e5a2ba329951bd2e01738886766e777", + "12000001-13000000.gz:md5,0670c5ee8dbf7c5f497a948071f94026", + "13000001-14000000.gz:md5,24d4532d1e9c0839f750f6dc798beacd", + "14000001-15000000.gz:md5,3a3de4c21b35ae9cd349e4641d8023a8", + "15000001-16000000.gz:md5,d60e0088ed511f809d9f2137fe46731c", + "16000001-17000000.gz:md5,2ee41d67e7cc73cf0e1bf8e47c708436", + "17000001-18000000.gz:md5,87304db95265191a4368c51ee7993801", + "18000001-19000000.gz:md5,b943b2b6865fa97a04fac7e17ac7c789", + "19000001-20000000.gz:md5,4d1338b66252cbc28c9991967cc5805e", + "20000001-21000000.gz:md5,a81d47d38d78d30bb4575f7a65c9707e", + "2000001-3000000.gz:md5,2ff7e93b14741df46621a15840fa5276", + "3000001-4000000.gz:md5,1ff84c0fb7dd85b55a1f32954f3bd625", + "4000001-5000000.gz:md5,4079a7728625d842f231d1f664b50264", + "5000001-6000000.gz:md5,399986007f0bc002054aff687bce85fc", + "6000001-7000000.gz:md5,c97f0d1a323011c5eb59d2c09a12634e", + "7000001-8000000.gz:md5,0973af953b9632efa1813d0c1265902d", + "8000001-9000000.gz:md5,1c9695b7857c8494396edbf68e2d8095", + "9000001-10000000.gz:md5,7e3e78052518c97155260eba1975ec41" ], [ - "1-1000000.gz:md5,d7a153a75f81d0b45eab68bfe526ffb5", - "10000001-11000000.gz:md5,db38af65cff53b1d1f06489cc872b015", - "1000001-2000000.gz:md5,0a7fff7f67d786d9281ca4783a5ec163", - "11000001-12000000.gz:md5,d3231f8fd2e05281d4388d67c5dfaed2", - "12000001-13000000.gz:md5,779879ffc3cdf8cd4021fef90b130791", - "13000001-14000000.gz:md5,0dea4526b0aa9085afae63249ab361ba", - "14000001-15000000.gz:md5,c25184561e98dd04343f49a8dc339134", - "15000001-16000000.gz:md5,146861be6570e64a0ceb555c9f8e3367", - "16000001-17000000.gz:md5,8e497ba1fe43f39adc47f625b2f0d0cd", - "17000001-18000000.gz:md5,d90fbba28b69487d8948e22f1b7b4217", - "2000001-3000000.gz:md5,2c6990365afec01242bcf698edc7e9da", - "3000001-4000000.gz:md5,9b6c90fd96f4d781d1ccf1339c7fb094", - "4000001-5000000.gz:md5,ee14bc5bfb88da22b27004a948570904", - "5000001-6000000.gz:md5,b8f609f3fb3d607f2da254a217b9fc6a", - "6000001-7000000.gz:md5,be9317f3c10182edd13426cdab8e1607", - "7000001-8000000.gz:md5,a5ab699b93ad721e676f0694a288ae36", - "8000001-9000000.gz:md5,6b5e1b10f154d5b046b7ac58f0957fcb", - "9000001-10000000.gz:md5,db16ac0616d71ce8647e885be9ed0cad" + "1-1000000.gz:md5,e5b943beee3102d4bbcf931618e4516f", + "10000001-11000000.gz:md5,2258cce59acc40383eba19df4adab977", + "1000001-2000000.gz:md5,48ffa67b4638d76f54feffeaf3ceb919", + "11000001-12000000.gz:md5,810e31cc6ef2995163dc4a249c73f131", + "12000001-13000000.gz:md5,0bf858719d427d5dcff6640dd0126ec0", + "13000001-14000000.gz:md5,f337fe31c4cf04d2b61c8cc4e65b3d31", + "14000001-15000000.gz:md5,51fa13d1ceefd98a6a093a41d565aa08", + "15000001-16000000.gz:md5,eaa3a4f3c8e447a78f482f8ff94ee488", + "16000001-17000000.gz:md5,95d704615bf688dea4fcf8916ea35326", + "17000001-18000000.gz:md5,356290a920138412ac131046246fe606", + "2000001-3000000.gz:md5,b32d23dedc91e0f05047cb3f75ab9679", + "3000001-4000000.gz:md5,304b9eb63522e575fb97a7c18e602c93", + "4000001-5000000.gz:md5,d2fa3e7f01321332dc5a65feef9defc0", + "5000001-6000000.gz:md5,d150eec8b35ccf2e136fdc6e7bd17481", + "6000001-7000000.gz:md5,fde4ba9ba1cbe463b65afd45f64d0809", + "7000001-8000000.gz:md5,40a5fe0f827dc040e851c5769896d4f5", + "8000001-9000000.gz:md5,0112761790ef2e78c5515bb3f9923277", + "9000001-10000000.gz:md5,f2d25d2a55f146875f0e5d51d3108341" ], - "chr_synonyms.txt:md5,9b3745f472606bf05c7068b21e2b31aa", + "chr_synonyms.txt:md5,8a7e0941aa4f0e676ab5594f0226b2b5", "info.txt:md5,33ccb74a030a9a345051628c337cb8af" ] ] @@ -136,7 +136,7 @@ ] ], "1": [ - "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" ], "cache": [ [ @@ -147,124 +147,124 @@ [ [ [ - "1-1000000.gz:md5,bb3f43b7512715df72792988ed262d0e", - "10000001-11000000.gz:md5,3a2acf075f478e42dab768cc3913d3f7", - "1000001-2000000.gz:md5,2a1fa1b46a47f90fe36b5c8ab35d01a1", - "11000001-12000000.gz:md5,e16032d944e54a4f41a82925817f88c6", - "12000001-13000000.gz:md5,f51d695b264752299a031b9dbcc44de1", - "13000001-14000000.gz:md5,1532d1764ee39bfd8e1be8b50974ab29", - "14000001-15000000.gz:md5,24173fdc2f65e39aac7ecc4c2726fcf2", - "15000001-16000000.gz:md5,d36d8154114de70c6779ebfb08f1ff8a", - "2000001-3000000.gz:md5,dadb500858b247daf0cf5562938a081d", - "3000001-4000000.gz:md5,eaaebe12f3402b7794c1d82a677ff5ad", - "4000001-5000000.gz:md5,84633b5ee211f4e23170233aefc415ee", - "5000001-6000000.gz:md5,de297b2d604da2070f9630a83db73b22", - "6000001-7000000.gz:md5,0fa47dad82ca5bce6ef96afc491a602c", - "7000001-8000000.gz:md5,2387061609a13eeaeb89a90dd13b1495", - "8000001-9000000.gz:md5,1bfd2fea5051d0a09dde436e75733739", - "9000001-10000000.gz:md5,dbb48f71832f61b9ec01c6f60548e954" + "1-1000000.gz:md5,f9cb33a3ddbb1b82597b3af3e9643dd3", + "10000001-11000000.gz:md5,71aa93ae6388be95fa5269be60236b95", + "1000001-2000000.gz:md5,956f858010c1346ee042ef0ea522043b", + "11000001-12000000.gz:md5,30274a3b8244e492cdf1f611a04848db", + "12000001-13000000.gz:md5,b28d20155f72c1261ba4bb08bea3d302", + "13000001-14000000.gz:md5,293a59ed7b397c1817d77412e124df53", + "14000001-15000000.gz:md5,5291aeb2805c8823b44562d875c7905e", + "15000001-16000000.gz:md5,7fd86078be5f3a400635b269a02185ea", + "2000001-3000000.gz:md5,7f6241cf8e3c91e1c882f3cc86d2dc3a", + "3000001-4000000.gz:md5,e77dc4834119301bbe19dc2a4a05348a", + "4000001-5000000.gz:md5,ac34c2980fea824b21e04874847904ad", + "5000001-6000000.gz:md5,3dfdb3bcd812de1e2b69cfca89a1c1f9", + "6000001-7000000.gz:md5,8446c31796e1aee447af2e353b3734a1", + "7000001-8000000.gz:md5,f84e88618cf747c774ddb98d971e2615", + "8000001-9000000.gz:md5,3094317bb21e35067424e9ad957dfcbe", + "9000001-10000000.gz:md5,3883799cae1ed356ecb416550a89ebde" ], [ - "1-1000000.gz:md5,701d7a2d7afa18b4efd7db488089f162", - "10000001-11000000.gz:md5,105bf3809d7be6f5c310383d5013e633", - "1000001-2000000.gz:md5,9b9eae5303b82666138619afd7b562dd", - "11000001-12000000.gz:md5,c5cc2c2dd5afc3028f3f0a7c03c067c1", - "12000001-13000000.gz:md5,721a1108f6d3b83f1ec96cf39ac9844d", - "13000001-14000000.gz:md5,9fec39204bcdcc5e0458b4ae19ca6f60", - "14000001-15000000.gz:md5,234b0a0b377b6740b70b29ecf0beb9fb", - "15000001-16000000.gz:md5,18444392a5aa3a7e2f09606f3481b765", - "2000001-3000000.gz:md5,e7ed6a622c2759de225b4602feabc1d1", - "3000001-4000000.gz:md5,fde2094cb236ed5cca8f1d6ef2d1e2ed", - "4000001-5000000.gz:md5,2035077fec25cb75beaaf61a0801ec0b", - "5000001-6000000.gz:md5,7d5534332f9aee366ad57add71bb0625", - "6000001-7000000.gz:md5,3da3614a656ed04dd8ba6f06b4c12c37", - "7000001-8000000.gz:md5,f24538b6263452002c9eef88657f332a", - "8000001-9000000.gz:md5,c1357499904580cb780ef275493d06a5", - "9000001-10000000.gz:md5,ed7fee5ec049da066556e033cec1f9b1" + "1-1000000.gz:md5,c2393dd5d120068d496b8789bee91974", + "10000001-11000000.gz:md5,106ab30775ba5fa950f8df7909a163b2", + "1000001-2000000.gz:md5,beeda6a82ca6800093d96bbf2eaa81f9", + "11000001-12000000.gz:md5,27d27c0245dbbb270b2001ca75b03042", + "12000001-13000000.gz:md5,8eea54682f0ef9e1977527999f6bfe29", + "13000001-14000000.gz:md5,5f4581505ebf8c4488bff65b16f125e0", + "14000001-15000000.gz:md5,00e8035d7e179ee51faa7032db090fad", + "15000001-16000000.gz:md5,c8438ec1765eb98cfca60eb2165f4d70", + "2000001-3000000.gz:md5,cf3f572db267b4a8552b37d1c3a78b2d", + "3000001-4000000.gz:md5,ec7df072bf71748c26e25afc2ea353f1", + "4000001-5000000.gz:md5,9dd91cde9d18bae0c884dff7050abaef", + "5000001-6000000.gz:md5,1be8b286a79eebb80ff0684f5c110407", + "6000001-7000000.gz:md5,a0debd5341d3e5ba986225f0f45d01b9", + "7000001-8000000.gz:md5,fc2d82666540059fea44c14569208b14", + "8000001-9000000.gz:md5,0a75c0b27da2c4ae946fdae5e5d83e59", + "9000001-10000000.gz:md5,172900e4145c9a9aa783f01550f4d8a2" ], [ - "1-1000000.gz:md5,e4167c4f03a10c72e22231bce4138383", - "10000001-11000000.gz:md5,a0d9708cbad465edc12f3ce420aa2516", - "1000001-2000000.gz:md5,0b7849c9659b74518f94f0ff760c07c3", - "11000001-12000000.gz:md5,743d76706105cf702cd1eac015c0afd3", - "12000001-13000000.gz:md5,f66f0aa9a02ab3e781cb04d10cc05093", - "13000001-14000000.gz:md5,56dd08b3ddc0b003221e1a1d16331d61", - "2000001-3000000.gz:md5,5477e38b3d53108e4e8ef70b4576dacd", - "3000001-4000000.gz:md5,bd40e0f8602020d14e3e38aeb3a9f31c", - "4000001-5000000.gz:md5,6ae06d70e1fa445e46d66e69b0ca629f", - "5000001-6000000.gz:md5,db03cd98e32f6adb5b424a81420b983c", - "6000001-7000000.gz:md5,4dffec87c3e18cd5c5cdb0befa3230c8", - "7000001-8000000.gz:md5,96ed0ed8f00382c43f6686f70f2b3925", - "8000001-9000000.gz:md5,5c20ed1c637e1182766e66f5741bd070", - "9000001-10000000.gz:md5,2ecd0f2778a09425a2c83e4b5e76ba1b" + "1-1000000.gz:md5,d1d97f733248a030e650a9bd1e7f41bc", + "10000001-11000000.gz:md5,429d681ffa8ca9dc23c62cdab4ffc42b", + "1000001-2000000.gz:md5,58be924f576c85b462df995b76074c9d", + "11000001-12000000.gz:md5,f789a4312ddd0bd423b3c55f66af782c", + "12000001-13000000.gz:md5,76a0fdd867ca559eaf5e8fe3e0f8ea94", + "13000001-14000000.gz:md5,867d9a3b7b6a720b634180efebf65658", + "2000001-3000000.gz:md5,e93c4b398494843b309abf71b218c14a", + "3000001-4000000.gz:md5,ff5b0d6680207d23490279c5f62ba33b", + "4000001-5000000.gz:md5,8b5e33878c599de252a931205a034446", + "5000001-6000000.gz:md5,25b9f4a4edafb9572c323ca1783dd7c1", + "6000001-7000000.gz:md5,c52c31d11ab225f7c9793f0c82ce72e6", + "7000001-8000000.gz:md5,a894863e34285ca3b042cd0eeed253c6", + "8000001-9000000.gz:md5,bcce1adf098aa44c0e55a2df2d801449", + "9000001-10000000.gz:md5,b27661dc26cd23c6a9c41cc885187b4f" ], [ - "1-1000000.gz:md5,28ab3ff34fdd100a65afb89b4ae0f825", - "10000001-11000000.gz:md5,feaf25015c12e72ea5c9e444ffb9a6a9", - "1000001-2000000.gz:md5,8878c44d092a2f7de7298bcecc43da73", - "11000001-12000000.gz:md5,60764928b738a5afb38e739747945ee0", - "12000001-13000000.gz:md5,a397368a23323df7104469537ef4e363", - "13000001-14000000.gz:md5,ecefb54ca22247017c75d8af2fc72e67", - "14000001-15000000.gz:md5,513213c222473a434e73b79927fa3eb3", - "15000001-16000000.gz:md5,b381b0e58227aec9cd1e78f3c2ace485", - "16000001-17000000.gz:md5,44a78638fbdd9d56f20462ba50867d14", - "17000001-18000000.gz:md5,fb6bdfe6078d861895a83f4f7232f74d", - "2000001-3000000.gz:md5,3fe93a5ff45260e3814e177e0f91a9e9", - "3000001-4000000.gz:md5,d449609384c8c0a6cf159b556ef29d47", - "4000001-5000000.gz:md5,201ec9eb75148838ef97bb931acdc02f", - "5000001-6000000.gz:md5,44166dce1082f3e3ce9128930a7aa6a3", - "6000001-7000000.gz:md5,0a54b8acee2e4531423079f361e465ee", - "7000001-8000000.gz:md5,17f245e52522d1270e7005a633eea682", - "8000001-9000000.gz:md5,5f364dabdef97a204e89bce1b9835822", - "9000001-10000000.gz:md5,bb77aff8a7673b2153476b0b9374ffd8" + "1-1000000.gz:md5,70dfe9bedc7a87a063f9b6f2e48b846b", + "10000001-11000000.gz:md5,767a1bd59613ad669cbb835cc11d06ff", + "1000001-2000000.gz:md5,9e1276159b8a073611f048cf6c4a0738", + "11000001-12000000.gz:md5,93dcc27f1185c7af20489ce5796da68e", + "12000001-13000000.gz:md5,0bc55d7b3f7419adcdbf474b7192c5ba", + "13000001-14000000.gz:md5,2a8c5ee78d9d2b462ec889733f311c19", + "14000001-15000000.gz:md5,68e79d710886838294c8de27ea7c1c00", + "15000001-16000000.gz:md5,d975f06bf6f8f1722c29c7b8cce7095b", + "16000001-17000000.gz:md5,bf59b0b7461b4c97520762754a91e41c", + "17000001-18000000.gz:md5,3174d1bff1351ee17f632c6adec54c90", + "2000001-3000000.gz:md5,22ac8f1975b085ed3f5773bc220ff120", + "3000001-4000000.gz:md5,0a8a89f524f7955f3db2847344e688d9", + "4000001-5000000.gz:md5,648d45d681cc4cbe68db4638665122ca", + "5000001-6000000.gz:md5,dfe8c94f45221ed152874083ec0991e2", + "6000001-7000000.gz:md5,e9c705d31a7c1cac9d02c6a018a0d655", + "7000001-8000000.gz:md5,723513cca5842d5c238dc110075ad8dd", + "8000001-9000000.gz:md5,3703d6fbdad1f21a2c1f40c5d8ad5371", + "9000001-10000000.gz:md5,afb3ba977fc7cd18b47bb5fa6fc85832" ], [ - "1-1000000.gz:md5,ad7333dd27732b000f1fb91c69accc47" + "1-1000000.gz:md5,397d664998c2dbfd56c0af94c385f5ee" ], [ - "1-1000000.gz:md5,a104f41c6b74d3657094341960b3e9aa", - "10000001-11000000.gz:md5,cb73357d42446a2a62d41b4ab6814486", - "1000001-2000000.gz:md5,c3d1f590019cb2d9a3fe138ebc3d4adb", - "11000001-12000000.gz:md5,f5de9fb9e6a24c3a0176951fe70cfd35", - "12000001-13000000.gz:md5,ad46cdbd9087eeac328e8dcecb60bdd6", - "13000001-14000000.gz:md5,635dbb498a367214ca45ea4466e15c27", - "14000001-15000000.gz:md5,b4e72a2a01c2d524c1076a9aeb5be6ed", - "15000001-16000000.gz:md5,4ce9dd41ed032eac6234ae6d414dead8", - "16000001-17000000.gz:md5,908fc89908bf5be9862c9f989e105a97", - "17000001-18000000.gz:md5,7bda940567e9c6fa9ba5493911e607b7", - "18000001-19000000.gz:md5,94c81ccdf2110781989774198c725e76", - "19000001-20000000.gz:md5,8e39cf5f5b24bb28c117d502a5d4cd64", - "20000001-21000000.gz:md5,d9a72ba97be5648b08ac53bc4649086e", - "2000001-3000000.gz:md5,e90cc7adc6c60b2b37736f572fe79166", - "3000001-4000000.gz:md5,6b5bbecf824fc18ce9b46c1cbedf0984", - "4000001-5000000.gz:md5,beccbf5aee5031d2d6bc29f2c7486672", - "5000001-6000000.gz:md5,23810c84b4f8607537321f0823a48db3", - "6000001-7000000.gz:md5,d9008100f5e23d3f42849d2bb9c45432", - "7000001-8000000.gz:md5,079f7fa854d40d426925d85a58d688e0", - "8000001-9000000.gz:md5,f000a7feaa7b461cdb6fc3df3651f6ae", - "9000001-10000000.gz:md5,154d5d7cf4d70cc3d9ea2349af7103be" + "1-1000000.gz:md5,ce88865c73633b2b57e6f3481a21b3f8", + "10000001-11000000.gz:md5,8f1f45979e56451d44a3887321910d30", + "1000001-2000000.gz:md5,c40b987ac5b22a6674055849e24204ad", + "11000001-12000000.gz:md5,4e5a2ba329951bd2e01738886766e777", + "12000001-13000000.gz:md5,0670c5ee8dbf7c5f497a948071f94026", + "13000001-14000000.gz:md5,24d4532d1e9c0839f750f6dc798beacd", + "14000001-15000000.gz:md5,3a3de4c21b35ae9cd349e4641d8023a8", + "15000001-16000000.gz:md5,d60e0088ed511f809d9f2137fe46731c", + "16000001-17000000.gz:md5,2ee41d67e7cc73cf0e1bf8e47c708436", + "17000001-18000000.gz:md5,87304db95265191a4368c51ee7993801", + "18000001-19000000.gz:md5,b943b2b6865fa97a04fac7e17ac7c789", + "19000001-20000000.gz:md5,4d1338b66252cbc28c9991967cc5805e", + "20000001-21000000.gz:md5,a81d47d38d78d30bb4575f7a65c9707e", + "2000001-3000000.gz:md5,2ff7e93b14741df46621a15840fa5276", + "3000001-4000000.gz:md5,1ff84c0fb7dd85b55a1f32954f3bd625", + "4000001-5000000.gz:md5,4079a7728625d842f231d1f664b50264", + "5000001-6000000.gz:md5,399986007f0bc002054aff687bce85fc", + "6000001-7000000.gz:md5,c97f0d1a323011c5eb59d2c09a12634e", + "7000001-8000000.gz:md5,0973af953b9632efa1813d0c1265902d", + "8000001-9000000.gz:md5,1c9695b7857c8494396edbf68e2d8095", + "9000001-10000000.gz:md5,7e3e78052518c97155260eba1975ec41" ], [ - "1-1000000.gz:md5,d7a153a75f81d0b45eab68bfe526ffb5", - "10000001-11000000.gz:md5,db38af65cff53b1d1f06489cc872b015", - "1000001-2000000.gz:md5,0a7fff7f67d786d9281ca4783a5ec163", - "11000001-12000000.gz:md5,d3231f8fd2e05281d4388d67c5dfaed2", - "12000001-13000000.gz:md5,779879ffc3cdf8cd4021fef90b130791", - "13000001-14000000.gz:md5,0dea4526b0aa9085afae63249ab361ba", - "14000001-15000000.gz:md5,c25184561e98dd04343f49a8dc339134", - "15000001-16000000.gz:md5,146861be6570e64a0ceb555c9f8e3367", - "16000001-17000000.gz:md5,8e497ba1fe43f39adc47f625b2f0d0cd", - "17000001-18000000.gz:md5,d90fbba28b69487d8948e22f1b7b4217", - "2000001-3000000.gz:md5,2c6990365afec01242bcf698edc7e9da", - "3000001-4000000.gz:md5,9b6c90fd96f4d781d1ccf1339c7fb094", - "4000001-5000000.gz:md5,ee14bc5bfb88da22b27004a948570904", - "5000001-6000000.gz:md5,b8f609f3fb3d607f2da254a217b9fc6a", - "6000001-7000000.gz:md5,be9317f3c10182edd13426cdab8e1607", - "7000001-8000000.gz:md5,a5ab699b93ad721e676f0694a288ae36", - "8000001-9000000.gz:md5,6b5e1b10f154d5b046b7ac58f0957fcb", - "9000001-10000000.gz:md5,db16ac0616d71ce8647e885be9ed0cad" + "1-1000000.gz:md5,e5b943beee3102d4bbcf931618e4516f", + "10000001-11000000.gz:md5,2258cce59acc40383eba19df4adab977", + "1000001-2000000.gz:md5,48ffa67b4638d76f54feffeaf3ceb919", + "11000001-12000000.gz:md5,810e31cc6ef2995163dc4a249c73f131", + "12000001-13000000.gz:md5,0bf858719d427d5dcff6640dd0126ec0", + "13000001-14000000.gz:md5,f337fe31c4cf04d2b61c8cc4e65b3d31", + "14000001-15000000.gz:md5,51fa13d1ceefd98a6a093a41d565aa08", + "15000001-16000000.gz:md5,eaa3a4f3c8e447a78f482f8ff94ee488", + "16000001-17000000.gz:md5,95d704615bf688dea4fcf8916ea35326", + "17000001-18000000.gz:md5,356290a920138412ac131046246fe606", + "2000001-3000000.gz:md5,b32d23dedc91e0f05047cb3f75ab9679", + "3000001-4000000.gz:md5,304b9eb63522e575fb97a7c18e602c93", + "4000001-5000000.gz:md5,d2fa3e7f01321332dc5a65feef9defc0", + "5000001-6000000.gz:md5,d150eec8b35ccf2e136fdc6e7bd17481", + "6000001-7000000.gz:md5,fde4ba9ba1cbe463b65afd45f64d0809", + "7000001-8000000.gz:md5,40a5fe0f827dc040e851c5769896d4f5", + "8000001-9000000.gz:md5,0112761790ef2e78c5515bb3f9923277", + "9000001-10000000.gz:md5,f2d25d2a55f146875f0e5d51d3108341" ], - "chr_synonyms.txt:md5,9b3745f472606bf05c7068b21e2b31aa", + "chr_synonyms.txt:md5,8a7e0941aa4f0e676ab5594f0226b2b5", "info.txt:md5,33ccb74a030a9a345051628c337cb8af" ] ] @@ -272,15 +272,15 @@ ] ], "versions": [ - "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "25.04.7" }, - "timestamp": "2025-09-04T10:00:46.010443" + "timestamp": "2025-09-29T09:49:32.824496" }, "celegans - download - stub": { "content": [ @@ -296,7 +296,7 @@ ] ], "1": [ - "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" ], "cache": [ [ @@ -309,14 +309,14 @@ ] ], "versions": [ - "versions.yml:md5,906ef8bda2ae1461f20649a6ba8611f1" + "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nextflow": "25.04.7" }, - "timestamp": "2025-09-04T10:00:57.964733" + "timestamp": "2025-09-29T09:49:47.366588" } } \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/download/tests/nextflow.config b/modules/nf-core/ensemblvep/download/tests/nextflow.config index 49485470..882ef8ee 100644 --- a/modules/nf-core/ensemblvep/download/tests/nextflow.config +++ b/modules/nf-core/ensemblvep/download/tests/nextflow.config @@ -1,5 +1,5 @@ params { - vep_cache_version = "114" + vep_cache_version = "115" vep_genome = "WBcel235" vep_species = "caenorhabditis_elegans" } diff --git a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff deleted file mode 100644 index 659e2264..00000000 --- a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff +++ /dev/null @@ -1,131 +0,0 @@ -Changes in component 'nf-core/ensemblvep/vep' -'modules/nf-core/ensemblvep/vep/meta.yml' is unchanged -Changes in 'ensemblvep/vep/main.nf': ---- modules/nf-core/ensemblvep/vep/main.nf -+++ modules/nf-core/ensemblvep/vep/main.nf -@@ -1,11 +1,11 @@ - process ENSEMBLVEP_VEP { - tag "${meta.id}" -- label 'process_medium' -+ label 'process_very_high' - - conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container -- ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4b/4b5a8c173dc9beaa93effec76b99687fc926b1bd7be47df5d6ce19d7d6b4d6b7/data' -- : 'community.wave.seqera.io/library/ensembl-vep:115.2--90ec797ecb088e9a'}" -+ ? 'https://depot.galaxyproject.org/singularity/ensembl-vep:114.2--pl5321h2a3209d_0' -+ : 'biocontainers/ensembl-vep:114.2--pl5321h2a3209d_0'}" - - input: - tuple val(meta), path(vcf), path(custom_extra_files) -@@ -15,6 +15,8 @@ - path cache - tuple val(meta2), path(fasta) - path extra_files -+ path custom_vep -+ path custom_vep_tbi - - output: - tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true -@@ -36,6 +38,7 @@ - def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" - def reference = fasta ? "--fasta ${fasta}" : "" - def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" -+ args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") - """ - vep \\ - -i ${vcf} \\ - -Changes in 'ensemblvep/vep/environment.yml': ---- modules/nf-core/ensemblvep/vep/environment.yml -+++ modules/nf-core/ensemblvep/vep/environment.yml -@@ -4,5 +4,4 @@ - - conda-forge - - bioconda - dependencies: -- # renovate: datasource=conda depName=bioconda/ensembl-vep -- - bioconda::ensembl-vep=115.2=pl5321h2a3209d_1 -+ - bioconda::ensembl-vep=114.2 - -Changes in 'ensemblvep/vep/tests/main.nf.test': ---- modules/nf-core/ensemblvep/vep/tests/main.nf.test -+++ modules/nf-core/ensemblvep/vep/tests/main.nf.test -@@ -16,7 +16,7 @@ - when { - process { - """ -- vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/115_WBcel235/')).collect() -+ vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() - - input[0] = Channel.of([ - [ id:'test' ], // meta map -@@ -55,7 +55,7 @@ - when { - process { - """ -- vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/115_WBcel235/')).collect() -+ vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() - - input[0] = Channel.of([ - [ id:'test' ], // meta map -@@ -79,7 +79,7 @@ - assert process.success - assertAll( - { assert snapshot(process.out.versions).match() }, -- { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v115.2") } -+ { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v114.2") } - ) - } - } - -'modules/nf-core/ensemblvep/vep/tests/vcf.config' is unchanged -'modules/nf-core/ensemblvep/vep/tests/tab.gz.config' is unchanged -Changes in 'ensemblvep/vep/tests/main.nf.test.snap': ---- modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap -+++ modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap -@@ -2,27 +2,27 @@ - "test_ensemblvep_vep_fasta_tab_gz": { - "content": [ - [ -- "versions.yml:md5,1e9ba958f2a6c180c064505b29f843ef" -+ "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" - ] - ], - "meta": { - "nf-test": "0.9.2", -- "nextflow": "25.04.7" -+ "nextflow": "25.04.6" - }, -- "timestamp": "2025-09-29T10:00:37.755173" -+ "timestamp": "2025-08-21T13:16:46.760065318" - }, - "test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)": { - "content": [ - [ -- "versions.yml:md5,1e9ba958f2a6c180c064505b29f843ef" -+ "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" - ], - "d41d8cd98f00b204e9800998ecf8427e", - "test.vcf.gz.tbi" - ], - "meta": { - "nf-test": "0.9.2", -- "nextflow": "25.04.7" -+ "nextflow": "25.04.6" - }, -- "timestamp": "2025-09-29T10:00:03.682447" -+ "timestamp": "2025-08-21T13:16:00.65871573" - } - } -Changes in 'ensemblvep/vep/tests/nextflow.config': ---- modules/nf-core/ensemblvep/vep/tests/nextflow.config -+++ modules/nf-core/ensemblvep/vep/tests/nextflow.config -@@ -1,5 +1,5 @@ - params { -- vep_cache_version = "115" -+ vep_cache_version = "113" - vep_genome = "WBcel235" - vep_species = "caenorhabditis_elegans" - } - -************************************************************ diff --git a/modules/nf-core/longphase/haplotag/environment.yml b/modules/nf-core/longphase/haplotag/environment.yml index 65c58ba3..3a882a5d 100644 --- a/modules/nf-core/longphase/haplotag/environment.yml +++ b/modules/nf-core/longphase/haplotag/environment.yml @@ -3,5 +3,7 @@ channels: - conda-forge - bioconda + dependencies: - - bioconda::longphase=1.7.3 + - bioconda::htslib=1.22.1 + - bioconda::longphase=2.0 diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf index 86ba0592..a64eb7c8 100644 --- a/modules/nf-core/longphase/haplotag/main.nf +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -4,8 +4,8 @@ process LONGPHASE_HAPLOTAG { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/longphase:1.7.3--hf5e1c6e_0': - 'biocontainers/longphase:1.7.3--hf5e1c6e_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': + 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" input: tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test b/modules/nf-core/longphase/haplotag/tests/main.nf.test index c80133c6..fb5d9311 100644 --- a/modules/nf-core/longphase/haplotag/tests/main.nf.test +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test @@ -199,4 +199,4 @@ nextflow_process { } } -} \ No newline at end of file +} diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap index 3cf35dc3..412fb8d0 100644 --- a/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap @@ -19,7 +19,7 @@ ] ], "2": [ - "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + "versions.yml:md5,2dfda84762159ad14ca71803b3139183" ], "bam": [ [ @@ -38,20 +38,20 @@ ] ], "versions": [ - "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + "versions.yml:md5,2dfda84762159ad14ca71803b3139183" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-08-09T09:40:30.738831707" + "timestamp": "2025-10-22T11:47:07.246878607" }, "[ bam, bai, snps, [], [] ], fasta, fai": { "content": [ [ - "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + "versions.yml:md5,2dfda84762159ad14ca71803b3139183" ], [ "@HD\tVN:1.6\tSO:coordinate", @@ -59,15 +59,15 @@ "@RG\tID:test\tSM:test", "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", - "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " ], "721264eb2824a3146b331f2532d10180" ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-07-25T09:12:34.848038423" + "timestamp": "2025-10-22T11:46:50.605854269" }, "[ bam, bai, snps, [], [] ], fasta, fai -stub": { "content": [ @@ -84,7 +84,7 @@ ], "2": [ - "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + "versions.yml:md5,2dfda84762159ad14ca71803b3139183" ], "bam": [ [ @@ -98,20 +98,20 @@ ], "versions": [ - "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + "versions.yml:md5,2dfda84762159ad14ca71803b3139183" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-08-09T09:40:20.836809553" + "timestamp": "2025-10-22T11:47:03.645623933" }, "[ bam, bai, snps, svs, [] ], fasta, fai": { "content": [ [ - "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + "versions.yml:md5,2dfda84762159ad14ca71803b3139183" ], [ "@HD\tVN:1.6\tSO:coordinate", @@ -119,41 +119,41 @@ "@RG\tID:test\tSM:test", "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", - "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam --sv-file NA24385_sv.vcf.gz " + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam --sv-file NA24385_sv.vcf.gz " ], "721264eb2824a3146b331f2532d10180" ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-10-04T13:39:33.50395694" + "timestamp": "2025-10-22T11:47:00.022853298" }, "[ bam, bai, snps, [], [] ], fasta, fai - log & cram": { "content": [ [ - "versions.yml:md5,3c169b598f6e15332b6d7ec1d6d96810" + "versions.yml:md5,2dfda84762159ad14ca71803b3139183" ], [ [ { "id": "test" }, - "test.log:md5,6203f10696f4b0909f0d327c021df773" + "test.log:md5,4ca65dc87cc5c362e8a5fa26a47a896b" ] ], [ "@RG\tID:test\tSM:test", "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", - "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:1.7.3\tCL:longphase haplotag --log --cram --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0\tCL:longphase haplotag --log --cram --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " ], "721264eb2824a3146b331f2532d10180" ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-07-25T09:45:54.254102844" + "timestamp": "2025-10-22T11:46:55.93374635" } } \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/environment.yml b/modules/nf-core/longphase/phase/environment.yml index 068a22cd..3a882a5d 100644 --- a/modules/nf-core/longphase/phase/environment.yml +++ b/modules/nf-core/longphase/phase/environment.yml @@ -5,5 +5,5 @@ channels: - bioconda dependencies: - - bioconda::htslib=1.20 - - bioconda::longphase=1.7.3 + - bioconda::htslib=1.22.1 + - bioconda::longphase=2.0 diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index f8351afd..3e08dfcf 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -4,19 +4,23 @@ process LONGPHASE_PHASE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0': - 'biocontainers/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': + 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" input: - tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) + tuple val(meta), path(bam), path(bai), path(snvs), path(svs), path(mods) tuple val(meta2), path(fasta) tuple val(meta3), path(fai) output: - tuple val(meta), path("*.vcf.gz") , emit: vcf - tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf + tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: snv_vcf_index + tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true + tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -24,7 +28,7 @@ process LONGPHASE_PHASE { script: def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" def sv_file = svs ? "--sv-file ${svs}" : "" def mod_file = mods ? "--mod-file ${mods}" : "" def bams = bam.collectMany { file -> ["-b", file] }.join(" ") @@ -35,7 +39,7 @@ process LONGPHASE_PHASE { --threads $task.cpus \\ -o ${prefix} \\ --reference ${fasta} \\ - --snp-file ${snps} \\ + --snp-file ${snvs} \\ ${bams} \\ ${sv_file} \\ ${mod_file} \\ @@ -43,9 +47,7 @@ process LONGPHASE_PHASE { bgzip \\ --threads $task.cpus \\ $args2 \\ - ${prefix}.vcf - - tabix -p vcf ${prefix}.vcf.gz + ${prefix}*.vcf cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -55,10 +57,15 @@ process LONGPHASE_PHASE { stub: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" + def sv_command = svs ? "echo '' | bgzip -c > ${prefix}_SV.vcf.gz" : "" + def mod_command = mods ? "echo '' | bgzip -c > ${prefix}_mod.vcf.gz" : "" """ + echo $args echo "" | bgzip -c > ${prefix}.vcf.gz - echo "" > ${prefix}.vcf.gz.tbi + + $sv_command + $mod_command cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/longphase/phase/meta.yml b/modules/nf-core/longphase/phase/meta.yml index 93963d58..94efc684 100644 --- a/modules/nf-core/longphase/phase/meta.yml +++ b/modules/nf-core/longphase/phase/meta.yml @@ -34,7 +34,7 @@ input: description: Index of sorted BAM/CRAM file(s) pattern: "*.{bai,crai,csi}" ontologies: [] - - snps: + - snvs: type: file description: VCF file with SNPs (and INDELs) pattern: "*.{vcf,vcf.gz}" @@ -70,15 +70,39 @@ input: pattern: "*.fai" ontologies: [] output: - vcf: + snv_vcf: - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - "*.vcf.gz": + - "${prefix}.vcf.gz": type: file - description: Compressed VCF file with phased variants + description: Compressed VCF file with phased SNVs and indels + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + sv_vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "${prefix}_SV.vcf.gz": + type: file + description: Compressed VCF file with phased SVs + pattern: "*_SV.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + mod_vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - "${prefix}_mod.vcf.gz": + type: file + description: Compressed VCF file with phased modifications pattern: "*.vcf.gz" ontologies: - edam: http://edamontology.org/format_3989 # GZIP format diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test b/modules/nf-core/longphase/phase/tests/main.nf.test index 3e303312..b45bbf01 100644 --- a/modules/nf-core/longphase/phase/tests/main.nf.test +++ b/modules/nf-core/longphase/phase/tests/main.nf.test @@ -44,7 +44,7 @@ nextflow_process { } -test("[ bam, bai, snps, svs, [] ], fasta, fai") { + test("[ bam, bai, snps, svs, [] ], fasta, fai") { when { process { @@ -78,7 +78,7 @@ test("[ bam, bai, snps, svs, [] ], fasta, fai") { } -test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { + test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { when { process { @@ -154,4 +154,38 @@ test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { } + test("[ bam, bai, snps, svs, [] ], fasta, fai - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', 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/vcf/NA24385_sv.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'reference' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } } diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test.snap b/modules/nf-core/longphase/phase/tests/main.nf.test.snap index 8a38c1ca..b0cf7144 100644 --- a/modules/nf-core/longphase/phase/tests/main.nf.test.snap +++ b/modules/nf-core/longphase/phase/tests/main.nf.test.snap @@ -1,4 +1,59 @@ { + "[ bam, bai, snps, svs, [] ], fasta, fai - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + ], + "mod_vcf": [ + + ], + "snv_vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "sv_vcf": [ + [ + { + "id": "test" + }, + "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.5" + }, + "timestamp": "2025-11-06T16:06:24.025191062" + }, "[ bam, bai, snps, [], [] ], fasta, fai": { "content": [ { @@ -7,30 +62,42 @@ { "id": "test" }, - "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" ] ], "1": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + ], + "mod_vcf": [ + ], - "vcf": [ + "snv_vcf": [ [ { "id": "test" }, - "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" + "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" ] + ], + "sv_vcf": [ + ], "versions": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "25.04.5" }, - "timestamp": "2024-07-22T12:14:04.269956432" + "timestamp": "2025-11-06T16:05:57.029934447" }, "[ bam, bai, snps, svs, [] ], fasta, fai": { "content": [ @@ -40,30 +107,52 @@ { "id": "test" }, - "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" ] ], "1": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + [ + { + "id": "test" + }, + "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + ], + "mod_vcf": [ + + ], + "snv_vcf": [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" + ] ], - "vcf": [ + "sv_vcf": [ [ { "id": "test" }, - "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" + "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" ] ], "versions": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.5" }, - "timestamp": "2024-10-04T13:37:16.921910004" + "timestamp": "2025-11-06T16:06:03.319855838" }, "[ bam x2, bai x2, snps, svs, [] ], fasta, fai": { "content": [ @@ -73,30 +162,52 @@ { "id": "test" }, - "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" ] ], "1": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + [ + { + "id": "test" + }, + "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ], - "vcf": [ + "mod_vcf": [ + + ], + "snv_vcf": [ [ { "id": "test" }, - "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" + "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" + ] + ], + "sv_vcf": [ + [ + { + "id": "test" + }, + "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" ] ], "versions": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.5" }, - "timestamp": "2024-10-04T13:37:23.41768963" + "timestamp": "2025-11-06T16:06:10.867281359" }, "[ bam, bai, snps, [], [] ], fasta, fai - stub": { "content": [ @@ -110,25 +221,37 @@ ] ], "1": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + ], - "vcf": [ + "2": [ + + ], + "3": [ + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + ], + "mod_vcf": [ + + ], + "snv_vcf": [ [ { "id": "test" }, "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] + ], + "sv_vcf": [ + ], "versions": [ - "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" + "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.2" + "nf-test": "0.9.2", + "nextflow": "25.04.5" }, - "timestamp": "2024-07-22T12:15:40.296227382" + "timestamp": "2025-11-06T16:06:17.992733472" } } \ No newline at end of file diff --git a/modules/nf-core/minimap2/align/minimap2-align.diff b/modules/nf-core/minimap2/align/minimap2-align.diff new file mode 100644 index 00000000..967bb654 --- /dev/null +++ b/modules/nf-core/minimap2/align/minimap2-align.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/minimap2/align' +'modules/nf-core/minimap2/align/meta.yml' is unchanged +Changes in 'minimap2/align/main.nf': +--- modules/nf-core/minimap2/align/main.nf ++++ modules/nf-core/minimap2/align/main.nf +@@ -1,6 +1,6 @@ + process MINIMAP2_ALIGN { + tag "$meta.id" +- label 'process_high' ++ label 'process_very_high' + + // Note: the versions here need to match the versions used in the mulled container below and minimap2/index + conda "${moduleDir}/environment.yml" + +'modules/nf-core/minimap2/align/environment.yml' is unchanged +'modules/nf-core/minimap2/align/tests/main.nf.test' is unchanged +'modules/nf-core/minimap2/align/tests/main.nf.test.snap' is unchanged +************************************************************ diff --git a/modules/nf-core/modkit/pileup/environment.yml b/modules/nf-core/modkit/pileup/environment.yml index 7b7a0ca3..67c67438 100644 --- a/modules/nf-core/modkit/pileup/environment.yml +++ b/modules/nf-core/modkit/pileup/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - ont-modkit=0.4.4 + - ont-modkit=0.6.0 diff --git a/modules/nf-core/modkit/pileup/main.nf b/modules/nf-core/modkit/pileup/main.nf index df6ff59d..462f8973 100644 --- a/modules/nf-core/modkit/pileup/main.nf +++ b/modules/nf-core/modkit/pileup/main.nf @@ -4,8 +4,8 @@ process MODKIT_PILEUP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ont-modkit:0.4.4--hcdda2d0_0': - 'biocontainers/ont-modkit:0.4.4--hcdda2d0_0' }" + 'https://depot.galaxyproject.org/singularity/ont-modkit:0.6.0--hcdda2d0_0': + 'biocontainers/ont-modkit:0.6.0--hcdda2d0_0' }" input: tuple val(meta), path(bam), path(bai) @@ -13,8 +13,7 @@ process MODKIT_PILEUP { tuple val(meta3), path(bed) output: - tuple val(meta), path("*.bed") , emit: bed , optional: true - tuple val(meta), path("*.bedgraph"), emit: bedgraph, optional: true + tuple val(meta), path("*.bed.gz") , emit: bedgz , optional: true tuple val(meta), path("*.log") , emit: log , optional: true path "versions.yml" , emit: versions @@ -31,6 +30,8 @@ process MODKIT_PILEUP { modkit \\ pileup \\ $args \\ + --bgzf \\ + --bgzf-threads ${task.cpus} \\ --threads ${task.cpus} \\ --prefix ${prefix} \\ $reference \\ @@ -45,7 +46,7 @@ process MODKIT_PILEUP { fi done else - mv ${prefix}.tmp ${prefix}.bed + mv ${prefix}.tmp ${prefix}.bed.gz fi cat <<-END_VERSIONS > versions.yml @@ -58,8 +59,9 @@ process MODKIT_PILEUP { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.bed - touch ${prefix}.bedgraph + echo $args + + echo | gzip > ${prefix}.bed.gz touch ${prefix}.log cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/modkit/pileup/meta.yml b/modules/nf-core/modkit/pileup/meta.yml index 32aba6ad..3d7d9fd5 100644 --- a/modules/nf-core/modkit/pileup/meta.yml +++ b/modules/nf-core/modkit/pileup/meta.yml @@ -6,8 +6,8 @@ keywords: - long-read tools: - "modkit": - description: A bioinformatics tool for working with modified bases in Oxford Nanopore - sequencing data + description: A bioinformatics tool for working with modified bases in Oxford + Nanopore sequencing data homepage: https://github.com/nanoporetech/modkit documentation: https://github.com/nanoporetech/modkit tool_dev_url: https://github.com/nanoporetech/modkit @@ -36,8 +36,8 @@ input: e.g. `[ id:'hg38' ]` - fasta: type: file - description: Reference sequence in FASTA format. Required for motif (e.g. CpG) - filtering + description: Reference sequence in FASTA format. Required for motif (e.g. + CpG) filtering pattern: "*.fasta" ontologies: [] - fai: @@ -52,33 +52,22 @@ input: e.g. `[ id:'regions' ]` - bed: type: file - description: BED file that will restrict threshold estimation and pileup results - to positions overlapping intervals in the file + description: BED file that will restrict threshold estimation and pileup + results to positions overlapping intervals in the file pattern: "*.bed" ontologies: [] output: - bed: + bedgz: - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'test', single_end:false ]` - - "*.bed": + - "*.bed.gz": type: file - description: bedMethyl output file(s) + description: bgzf-compressed bedMethyl output file(s) pattern: "*.bed" ontologies: [] - bedgraph: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'test', single_end:false ]` - - "*.bedgraph": - type: file - description: bedgraph output files - pattern: "*.bedgraph" - ontologies: [] log: - - meta: type: map @@ -102,3 +91,4 @@ authors: - "@fellen31" maintainers: - "@fellen31" + - "@jkh00" diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test b/modules/nf-core/modkit/pileup/tests/main.nf.test index 6ce8dfe2..652b725a 100644 --- a/modules/nf-core/modkit/pileup/tests/main.nf.test +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test @@ -7,10 +7,14 @@ nextflow_process { tag "modkit" tag "modkit/pileup" process "MODKIT_PILEUP" + config "./nextflow.config" test("[bam, bai], [], []") { when { + params { + module_args = '' + } process { """ input[0] = [ @@ -36,6 +40,9 @@ nextflow_process { test("[bam, bai], [fasta, fai], []") { when { + params { + module_args = '' + } process { """ input[0] = [ @@ -65,6 +72,9 @@ nextflow_process { test("[bam, bai], [fasta, fai], bed") { when { + params { + module_args = '--modified-bases 5mC 5hmC' + } process { """ input[0] = [ @@ -93,11 +103,12 @@ nextflow_process { } - test("[bam, bai], [fasta, fai], bed - traditional") { - - config "./nextflow.traditional.config" + test("[bam, bai], [fasta, fai], [], phased") { when { + params { + module_args = '--phased --modified-bases 5mC 5hmC' + } process { """ input[0] = [ @@ -110,42 +121,7 @@ nextflow_process { file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] - input[2] = Channel.of('chr22\t0\t1000') - .collectFile(name: 'chr22.bed', newLine: true) - .map { file -> [ [ id:'chr22' ], file ] } - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - - } - - test("[bam, bai], [fasta, fai], bed - traditional, HP") { - - config "./nextflow.traditional_hp.config" - - when { - process { - """ - input[0] = [ - [ id: 'test' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) - ] - input[1] = [ - [ id: 'test_ref' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) - ] - input[2] = Channel.of('chr22\t0\t1000') - .collectFile(name: 'chr22.bed', newLine: true) - .map { file -> [ [ id:'chr22' ], file ] } + input[2] = [[],[]] """ } } @@ -159,11 +135,12 @@ nextflow_process { } - test("[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph") { - - config "./nextflow.traditional_hp_bedgraph.config" + test("[bam, bai], [fasta, fai], bed, phased") { when { + params { + module_args = '--phased --modified-bases 5mC 5hmC' + } process { """ input[0] = [ @@ -197,6 +174,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = [ @@ -224,6 +204,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = [ @@ -251,10 +234,12 @@ nextflow_process { } test("[bam, bai], [fasta, fai], bed - stub") { - options "-stub" when { + params { + module_args = '--modified-bases 5mC 5hmC' + } process { """ input[0] = [ @@ -283,12 +268,14 @@ nextflow_process { } - test("[bam, bai], [fasta, fai], bed - traditional - stub") { + test("[bam, bai], [fasta, fai], [], phased - stub") { - config "./nextflow.traditional.config" options "-stub" when { + params { + module_args = '--phased --modified-bases 5mC 5hmC' + } process { """ input[0] = [ @@ -301,43 +288,7 @@ nextflow_process { file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] - input[2] = Channel.of('chr22\t0\t1000') - .collectFile(name: 'chr22.bed', newLine: true) - .map { file -> [ [ id:'chr22' ], file ] } - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } - ) - } - - } - - test("[bam, bai], [fasta, fai], bed - traditional, HP - stub") { - - config "./nextflow.traditional_hp.config" - options "-stub" - - when { - process { - """ - input[0] = [ - [ id: 'test' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.phased.bam.bai', checkIfExists: true) - ] - input[1] = [ - [ id: 'test_ref' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) - ] - input[2] = Channel.of('chr22\t0\t1000') - .collectFile(name: 'chr22.bed', newLine: true) - .map { file -> [ [ id:'chr22' ], file ] } + input[2] = [[],[]] """ } } @@ -351,12 +302,14 @@ nextflow_process { } - test("[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph - stub") { + test("[bam, bai], [fasta, fai], bed, phased - stub") { - config "./nextflow.traditional_hp_bedgraph.config" options "-stub" when { + params { + module_args = '--phased --modified-bases 5mC 5hmC' + } process { """ input[0] = [ @@ -385,4 +338,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap index af80c6ec..3f30af70 100644 --- a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap @@ -7,42 +7,36 @@ { "id": "test" }, - "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + "test.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472" ] ], "1": [ ], "2": [ - - ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bed": [ + "bedgz": [ [ { "id": "test" }, - "test.bed:md5,ac38ce3bed1f8aa770d1e1a9f332e170" + "test.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472" ] - ], - "bedgraph": [ - ], "log": [ ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-15T15:01:47.27240322" + "timestamp": "2025-12-11T14:18:34.613472799" }, "[bam, bai], [fasta, fai], [] - stub": { "content": [ @@ -52,18 +46,10 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ [ { "id": "test" @@ -71,23 +57,15 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ - [ - { - "id": "test" - }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "2": [ + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bedgraph": [ + "bedgz": [ [ { "id": "test" }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "log": [ @@ -99,50 +77,46 @@ ] ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.2" }, - "timestamp": "2025-04-15T15:02:14.786526107" + "timestamp": "2025-12-19T09:56:52.060201127" }, - "[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph": { + "[bam, bai], [fasta, fai], [], phased": { "content": [ { "0": [ - - ], - "1": [ [ { "id": "test" }, [ - "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", - "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + "test_combined.bed.gz:md5,2ade8f1d8c163ff61698d828d0ef3fb0", + "test_hp1.bed.gz:md5,e8e8c00005127492fd5610a9fa0cd098", + "test_hp2.bed.gz:md5,b211935a2e88b0ebeee987abc3a622e2" ] ] ], - "2": [ + "1": [ ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ - + "2": [ + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bedgraph": [ + "bedgz": [ [ { "id": "test" }, [ - "test_1_m_CG0_combined.bedgraph:md5,af55904c9acbafa17ff35ee3239152d0", - "test_2_m_CG0_combined.bedgraph:md5,13554927fb35b71a98c0e6bcdc3945c9" + "test_combined.bed.gz:md5,2ade8f1d8c163ff61698d828d0ef3fb0", + "test_hp1.bed.gz:md5,e8e8c00005127492fd5610a9fa0cd098", + "test_hp2.bed.gz:md5,b211935a2e88b0ebeee987abc3a622e2" ] ] ], @@ -150,17 +124,17 @@ ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-15T15:02:04.393035124" + "timestamp": "2025-12-11T14:18:42.290304403" }, - "[bam, bai], [fasta, fai], bed - traditional, HP": { + "[bam, bai], [fasta, fai], [], phased - stub": { "content": [ { "0": [ @@ -168,95 +142,48 @@ { "id": "test" }, - [ - "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", - "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" - ] + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ [ { "id": "test" }, - [ - "test_1.bed:md5,464a9870774c340753e79639aeaf76c2", - "test_2.bed:md5,118de4b653dd082d76faa8802df493eb" - ] + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "bedgraph": [ - - ], - "log": [ - + "2": [ + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-04-15T15:01:58.76489375" - }, - "[bam, bai], [fasta, fai], []": { - "content": [ - { - "0": [ + "bedgz": [ [ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ + "log": [ [ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - "bedgraph": [ - - ], - "log": [ - ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.2" }, - "timestamp": "2025-04-15T15:01:41.559902964" + "timestamp": "2025-12-19T09:57:00.458022339" }, - "[bam, bai], [fasta, fai], bed - traditional, HP - stub": { + "[bam, bai], [fasta, fai], []": { "content": [ { "0": [ @@ -264,62 +191,36 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "2": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ + "bedgz": [ [ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "bedgraph": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" ] ], "log": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-15T15:02:31.123304033" + "timestamp": "2025-12-11T14:18:26.964056871" }, "[bam, bai], [], []": { "content": [ @@ -329,44 +230,38 @@ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" ] ], "1": [ ], "2": [ - - ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bed": [ + "bedgz": [ [ { "id": "test" }, - "test.bed:md5,f973de342df883efc1656c82a3a3978d" + "test.bed.gz:md5,f973de342df883efc1656c82a3a3978d" ] - ], - "bedgraph": [ - ], "log": [ ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-15T15:01:35.512266692" + "timestamp": "2025-12-11T14:18:19.273553787" }, - "[bam, bai], [fasta, fai], bed - traditional, HP, bedgraph - stub": { + "[bam, bai], [fasta, fai], bed, phased": { "content": [ { "0": [ @@ -374,64 +269,46 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + [ + "test_combined.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472", + "test_hp1.bed.gz:md5,8125fff82b626811d73c6a09c292ed31", + "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" + ] ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "2": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ - [ - { - "id": "test" - }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bedgraph": [ + "bedgz": [ [ { "id": "test" }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + [ + "test_combined.bed.gz:md5,e60263a72bb1cfdca8eb12028cfe1472", + "test_hp1.bed.gz:md5,8125fff82b626811d73c6a09c292ed31", + "test_hp2.bed.gz:md5,6438ea42b16a21db197ddf73ec665685" + ] ] ], "log": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-15T15:02:37.027692372" + "timestamp": "2025-12-11T14:18:50.043853179" }, - "[bam, bai], [], [] - stub": { + "[bam, bai], [fasta, fai], bed, phased - stub": { "content": [ { "0": [ @@ -439,18 +316,10 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ [ { "id": "test" @@ -458,23 +327,15 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ - [ - { - "id": "test" - }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "2": [ + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bedgraph": [ + "bedgz": [ [ { "id": "test" }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "log": [ @@ -486,17 +347,17 @@ ] ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.2" }, - "timestamp": "2025-04-15T15:02:09.515064105" + "timestamp": "2025-12-19T09:57:04.868976217" }, - "[bam, bai], [fasta, fai], bed - traditional - stub": { + "[bam, bai], [], [] - stub": { "content": [ { "0": [ @@ -504,18 +365,10 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ [ { "id": "test" @@ -523,23 +376,15 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ - [ - { - "id": "test" - }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "2": [ + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bedgraph": [ + "bedgz": [ [ { "id": "test" }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "log": [ @@ -551,15 +396,15 @@ ] ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.2" }, - "timestamp": "2025-04-15T15:02:25.6273826" + "timestamp": "2025-12-19T09:56:47.829913052" }, "[bam, bai], [fasta, fai], bed - stub": { "content": [ @@ -569,18 +414,10 @@ { "id": "test" }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "1": [ - [ - { - "id": "test" - }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ [ { "id": "test" @@ -588,23 +425,15 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ - [ - { - "id": "test" - }, - "test.bed:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "2": [ + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ], - "bedgraph": [ + "bedgz": [ [ { "id": "test" }, - "test.bedgraph:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.bed.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], "log": [ @@ -616,59 +445,14 @@ ] ], "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ] - } - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" - }, - "timestamp": "2025-04-15T15:02:20.328195604" - }, - "[bam, bai], [fasta, fai], bed - traditional": { - "content": [ - { - "0": [ - [ - { - "id": "test" - }, - "test.bed:md5,db6333f714a8ea4aa33902404a8d4812" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" - ], - "bed": [ - [ - { - "id": "test" - }, - "test.bed:md5,db6333f714a8ea4aa33902404a8d4812" - ] - ], - "bedgraph": [ - - ], - "log": [ - - ], - "versions": [ - "versions.yml:md5,8527c1177696459470aef23905cfb6af" + "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.04.2" }, - "timestamp": "2025-04-15T15:01:52.925069493" + "timestamp": "2025-12-19T09:56:56.290093996" } } \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.config b/modules/nf-core/modkit/pileup/tests/nextflow.config new file mode 100644 index 00000000..62521d0b --- /dev/null +++ b/modules/nf-core/modkit/pileup/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'MODKIT_PILEUP' { + ext.args = params.module_args + } +} diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config deleted file mode 100644 index 672598d5..00000000 --- a/modules/nf-core/modkit/pileup/tests/nextflow.traditional.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'MODKIT_PILEUP' { - ext.args = '--preset traditional' - } -} diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config deleted file mode 100644 index c0e0d79a..00000000 --- a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'MODKIT_PILEUP' { - ext.args = '--preset traditional --partition-tag HP' - } -} diff --git a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config b/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config deleted file mode 100644 index 4f456dcd..00000000 --- a/modules/nf-core/modkit/pileup/tests/nextflow.traditional_hp_bedgraph.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: 'MODKIT_PILEUP' { - ext.args = '--preset traditional --partition-tag HP --bedgraph' - } -} diff --git a/modules/nf-core/mosdepth/environment.yml b/modules/nf-core/mosdepth/environment.yml index f871e054..97c93721 100644 --- a/modules/nf-core/mosdepth/environment.yml +++ b/modules/nf-core/mosdepth/environment.yml @@ -5,4 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/mosdepth - - mosdepth=0.3.10 + - mosdepth=0.3.11=h0ec343a_1 + # renovate: datasource=conda depName=bioconda/htslib + - htslib=1.22.1 diff --git a/modules/nf-core/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf index 3bf945f9..72ba5e48 100644 --- a/modules/nf-core/mosdepth/main.nf +++ b/modules/nf-core/mosdepth/main.nf @@ -4,8 +4,8 @@ process MOSDEPTH { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mosdepth:0.3.10--h4e814b3_1' : - 'biocontainers/mosdepth:0.3.10--h4e814b3_1'}" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/00/00d32b53160c26794959da7303ee6e2107afd4d292060c9f287b0af1fddbd847/data' : + 'community.wave.seqera.io/library/mosdepth_htslib:0f58993cb6d93294'}" input: tuple val(meta), path(bam), path(bai), path(bed) diff --git a/modules/nf-core/mosdepth/tests/main.nf.test.snap b/modules/nf-core/mosdepth/tests/main.nf.test.snap index 67e16562..a063dd9f 100644 --- a/modules/nf-core/mosdepth/tests/main.nf.test.snap +++ b/modules/nf-core/mosdepth/tests/main.nf.test.snap @@ -39,7 +39,7 @@ ] ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ [ @@ -222,15 +222,15 @@ ] ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:57:12.350279421" + "timestamp": "2025-09-23T13:06:13.219131" }, "homo_sapiens - cram, crai, bed": { "content": [ @@ -260,7 +260,7 @@ ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ [ @@ -289,7 +289,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "6": [ @@ -307,7 +307,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + "test.regions.bed.gz.csi:md5,c33ac5c86370039463796f01434fc0e4" ] ], "8": [ @@ -340,7 +340,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "per_base_d4": [ @@ -367,7 +367,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + "test.regions.bed.gz.csi:md5,c33ac5c86370039463796f01434fc0e4" ] ], "regions_txt": [ @@ -395,15 +395,15 @@ ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:56:12.528228123" + "timestamp": "2025-09-23T13:22:14.011309" }, "homo_sapiens - bam, bai, [] - quantized": { "content": [ @@ -433,7 +433,7 @@ ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ @@ -456,7 +456,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "6": [ @@ -480,7 +480,7 @@ "id": "test", "single_end": true }, - "test.quantized.bed.gz.csi:md5,be9617f551f19a33923f1e886eaefb93" + "test.quantized.bed.gz.csi:md5,c0a3176a59010639455a4aefb3f247ef" ] ], "global_txt": [ @@ -507,7 +507,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "per_base_d4": [ @@ -528,7 +528,7 @@ "id": "test", "single_end": true }, - "test.quantized.bed.gz.csi:md5,be9617f551f19a33923f1e886eaefb93" + "test.quantized.bed.gz.csi:md5,c0a3176a59010639455a4aefb3f247ef" ] ], "regions_bed": [ @@ -556,15 +556,15 @@ ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:56:38.422491251" + "timestamp": "2025-09-23T13:22:22.818082" }, "homo_sapiens - bam, bai, bed": { "content": [ @@ -594,7 +594,7 @@ ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ [ @@ -623,7 +623,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "6": [ @@ -641,7 +641,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + "test.regions.bed.gz.csi:md5,c33ac5c86370039463796f01434fc0e4" ] ], "8": [ @@ -674,7 +674,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "per_base_d4": [ @@ -701,7 +701,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + "test.regions.bed.gz.csi:md5,c33ac5c86370039463796f01434fc0e4" ] ], "regions_txt": [ @@ -729,15 +729,15 @@ ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:55:43.01015749" + "timestamp": "2025-09-23T13:22:04.449943" }, "homo_sapiens - bam, bai, [] - window": { "content": [ @@ -767,7 +767,7 @@ ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ [ @@ -796,7 +796,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "6": [ @@ -814,7 +814,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,257d67678136963d9dd904330079609d" + "test.regions.bed.gz.csi:md5,17a2cbe22a948d7c004b90a1f28347a1" ] ], "8": [ @@ -847,7 +847,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "per_base_d4": [ @@ -874,7 +874,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,257d67678136963d9dd904330079609d" + "test.regions.bed.gz.csi:md5,17a2cbe22a948d7c004b90a1f28347a1" ] ], "regions_txt": [ @@ -902,15 +902,15 @@ ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:56:27.10647246" + "timestamp": "2025-09-23T13:22:18.435089" }, "homo_sapiens - bam, bai, []": { "content": [ @@ -940,7 +940,7 @@ ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ @@ -963,7 +963,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "6": [ @@ -1002,7 +1002,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "per_base_d4": [ @@ -1039,15 +1039,15 @@ ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:55:30.449110281" + "timestamp": "2025-09-23T13:21:59.785829" }, "homo_sapiens - cram, crai, []": { "content": [ @@ -1077,7 +1077,7 @@ ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ @@ -1100,7 +1100,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "6": [ @@ -1139,7 +1139,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "per_base_d4": [ @@ -1176,15 +1176,15 @@ ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:55:55.244274402" + "timestamp": "2025-09-23T13:22:09.294766" }, "homo_sapiens - bam, bai, bed - thresholds": { "content": [ @@ -1222,11 +1222,11 @@ "id": "test", "single_end": true }, - "test.thresholds.bed.gz.csi:md5,912055ee9452229439df6fae95644196" + "test.thresholds.bed.gz.csi:md5,2c52ab89e7496af475de3cb2ca04c7b3" ] ], "12": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ], "2": [ [ @@ -1255,7 +1255,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "6": [ @@ -1273,7 +1273,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + "test.regions.bed.gz.csi:md5,c33ac5c86370039463796f01434fc0e4" ] ], "8": [ @@ -1306,7 +1306,7 @@ "id": "test", "single_end": true }, - "test.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4" + "test.per-base.bed.gz.csi:md5,6adccf94ed775c9f53422e3e9c7af27f" ] ], "per_base_d4": [ @@ -1333,7 +1333,7 @@ "id": "test", "single_end": true }, - "test.regions.bed.gz.csi:md5,47669cfe41f3e222e74d81e1b1be191f" + "test.regions.bed.gz.csi:md5,c33ac5c86370039463796f01434fc0e4" ] ], "regions_txt": [ @@ -1369,18 +1369,18 @@ "id": "test", "single_end": true }, - "test.thresholds.bed.gz.csi:md5,912055ee9452229439df6fae95644196" + "test.thresholds.bed.gz.csi:md5,2c52ab89e7496af475de3cb2ca04c7b3" ] ], "versions": [ - "versions.yml:md5,333368078626c18a32eeb12299080cc9" + "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.7" }, - "timestamp": "2025-01-17T14:56:49.888375978" + "timestamp": "2025-09-23T13:22:27.300204" } } \ No newline at end of file diff --git a/modules/nf-core/mosdepth/tests/quantized.config b/modules/nf-core/mosdepth/tests/quantized.config index 63c55350..c208a4ce 100644 --- a/modules/nf-core/mosdepth/tests/quantized.config +++ b/modules/nf-core/mosdepth/tests/quantized.config @@ -1,3 +1,3 @@ process { ext.args = "--quantize 0:1:4:100:200" -} \ No newline at end of file +} diff --git a/modules/nf-core/mosdepth/tests/threshold.config b/modules/nf-core/mosdepth/tests/threshold.config index 9b014ddf..3302da60 100644 --- a/modules/nf-core/mosdepth/tests/threshold.config +++ b/modules/nf-core/mosdepth/tests/threshold.config @@ -1,3 +1,3 @@ process { ext.args = "--thresholds 1,10,20,30" -} \ No newline at end of file +} diff --git a/modules/nf-core/mosdepth/tests/window.config b/modules/nf-core/mosdepth/tests/window.config index 7a0f755c..7f0d08d6 100644 --- a/modules/nf-core/mosdepth/tests/window.config +++ b/modules/nf-core/mosdepth/tests/window.config @@ -1,3 +1,3 @@ process { ext.args = "--by 100" -} \ No newline at end of file +} diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index d02016a0..009874d4 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.32 + - bioconda::multiqc=1.33 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index c1158fb0..3b0e975b 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,11 +3,11 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/8c/8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb/data' : - 'community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data' : + 'community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b' }" input: - path multiqc_files, stageAs: "?/*" + path multiqc_files, stageAs: "?/*" path(multiqc_config) path(extra_multiqc_config) path(multiqc_logo) @@ -15,10 +15,11 @@ process MULTIQC { path(sample_names) output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions + path "*.html" , emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever when: task.ext.when == null || task.ext.when @@ -26,38 +27,29 @@ process MULTIQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + def config = multiqc_config ? "--config ${multiqc_config}" : '' + def extra_config = extra_multiqc_config ? "--config ${extra_multiqc_config}" : '' def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' def replace = replace_names ? "--replace-names ${replace_names}" : '' def samples = sample_names ? "--sample-names ${sample_names}" : '' """ multiqc \\ --force \\ - $args \\ - $config \\ - $prefix \\ - $extra_config \\ - $logo \\ - $replace \\ - $samples \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${extra_config} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ stub: """ mkdir multiqc_data + touch multiqc_data/.stub mkdir multiqc_plots touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ } diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ce30eb73..f790cab0 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -57,10 +57,10 @@ input: - edam: http://edamontology.org/format_3475 # TSV output: report: - - "*multiqc_report.html": + - "*.html": type: file description: MultiQC report file - pattern: "multiqc_report.html" + pattern: ".html" ontologies: [] data: - "*_data": @@ -74,12 +74,15 @@ output: pattern: "*_data" ontologies: [] versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool authors: - "@abhi18av" - "@bunop" @@ -90,3 +93,27 @@ maintainers: - "@bunop" - "@drpatelh" - "@jfy133" +containers: + conda: + linux_amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-d58f60e4deb769bf_1/condalock + linux_arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-193776baee4194db_1/condalock + docker: + linux_amd64: + build_id: bd-d58f60e4deb769bf_1 + name: community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf + scanId: sc-d76ac07493e940b4_6 + linux_arm64: + build_id: bd-193776baee4194db_1 + name: community.wave.seqera.io/library/multiqc:1.32--193776baee4194db + scanId: sc-86caded0bff8246e_3 + singularity: + linux_amd64: + build_id: bd-e649ffa094d1ef4a_1 + name: oras://community.wave.seqera.io/library/multiqc:1.32--e649ffa094d1ef4a + https: https://community.wave.seqera.io/v2/library/multiqc/blobs/sha256:8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb + linux_arm64: + build_id: bd-aee0064f5570ef22_1 + name: oras://community.wave.seqera.io/library/multiqc:1.32--aee0064f5570ef22 + https: https://community.wave.seqera.io/v2/library/multiqc/blobs/sha256:f02c59ebf6e9a00aa954ee8188a4ecc5c743e18f40b9215a242f67606a00f9cf diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config new file mode 100644 index 00000000..b30b1358 --- /dev/null +++ b/modules/nf-core/multiqc/tests/custom_prefix.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = "custom_prefix" + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 33316a7d..d1ae8b06 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -30,7 +30,33 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_single") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } + ) + } + + } + + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.report[0] ==~ ".*/custom_prefix.html" }, + { assert process.out.data[0] ==~ ".*/custom_prefix_data" } ) } @@ -56,7 +82,7 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_config") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } ) } } @@ -84,7 +110,7 @@ nextflow_process { { assert snapshot(process.out.report.collect { file(it).getName() } + process.out.data.collect { file(it).getName() } + process.out.plots.collect { file(it).getName() } + - process.out.versions ).match("multiqc_stub") } + process.out.findAll { key, val -> key.startsWith("versions")} ).match() } ) } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index a88bafd6..d72d35b7 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -1,41 +1,61 @@ { - "multiqc_versions_single": { + "sarscov2 single-end [fastqc]": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:33:24.356715" + "timestamp": "2025-12-09T10:10:43.020315838" }, - "multiqc_stub": { + "sarscov2 single-end [fastqc] - stub": { "content": [ [ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:34:11.103619" + "timestamp": "2025-12-09T10:11:14.131950776" }, - "multiqc_versions_config": { + "sarscov2 single-end [fastqc] [config]": { "content": [ - [ - "versions.yml:md5,737bb2c7cad54ffc2ec020791dc48b8f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "24.10.4" + "nextflow": "25.10.2" }, - "timestamp": "2025-10-27T13:34:04.615233" + "timestamp": "2025-12-09T10:11:07.15692209" } } \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/tests/main.nf.test b/modules/nf-core/pigz/uncompress/tests/main.nf.test index 9c3289bc..09eabe30 100644 --- a/modules/nf-core/pigz/uncompress/tests/main.nf.test +++ b/modules/nf-core/pigz/uncompress/tests/main.nf.test @@ -29,11 +29,11 @@ nextflow_process { } } - + test("Should run without failures - stub") { - + options "-stub" - + when { params { outdir = "$outputDir" @@ -55,4 +55,4 @@ nextflow_process { } } -} \ No newline at end of file +} diff --git a/modules/nf-core/samtools/cat/environment.yml b/modules/nf-core/samtools/cat/environment.yml index 62054fc9..89e12a64 100644 --- a/modules/nf-core/samtools/cat/environment.yml +++ b/modules/nf-core/samtools/cat/environment.yml @@ -4,5 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/samtools/cat/main.nf b/modules/nf-core/samtools/cat/main.nf index 0490b81d..824d6911 100644 --- a/modules/nf-core/samtools/cat/main.nf +++ b/modules/nf-core/samtools/cat/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_CAT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.22.1--h96c455f_0' : + 'biocontainers/samtools:1.22.1--h96c455f_0' }" input: tuple val(meta), path(input_files, stageAs: "?/*") diff --git a/modules/nf-core/samtools/cat/tests/main.nf.test.snap b/modules/nf-core/samtools/cat/tests/main.nf.test.snap index 9af1b19f..2143309a 100644 --- a/modules/nf-core/samtools/cat/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/cat/tests/main.nf.test.snap @@ -14,14 +14,14 @@ "bams_stub_versions": { "content": [ [ - "versions.yml:md5,cd29ae344fb0bf5635527e1cb7a7d95f" + "versions.yml:md5,99695cce7873f354da5dd8660522cb4f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T07:47:51.511914861" + "timestamp": "2025-09-10T13:02:09.79415" }, "bams_bam": { "content": [ @@ -58,13 +58,13 @@ "bams_versions": { "content": [ [ - "versions.yml:md5,cd29ae344fb0bf5635527e1cb7a7d95f" + "versions.yml:md5,99695cce7873f354da5dd8660522cb4f" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:47:50.783194958" + "timestamp": "2025-09-10T13:02:05.668116" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/environment.yml b/modules/nf-core/samtools/faidx/environment.yml index 62054fc9..89e12a64 100644 --- a/modules/nf-core/samtools/faidx/environment.yml +++ b/modules/nf-core/samtools/faidx/environment.yml @@ -4,5 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index 6de0095d..57a03497 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_FAIDX { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.22.1--h96c455f_0' : + 'biocontainers/samtools:1.22.1--h96c455f_0' }" input: tuple val(meta), path(fasta) @@ -17,7 +17,7 @@ process SAMTOOLS_FAIDX { tuple val(meta), path ("*.sizes") , emit: sizes, optional: true tuple val(meta), path ("*.fai") , emit: fai, optional: true tuple val(meta), path ("*.gzi") , emit: gzi, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -32,11 +32,6 @@ process SAMTOOLS_FAIDX { $args ${get_sizes_command} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -51,11 +46,5 @@ process SAMTOOLS_FAIDX { fi ${get_sizes_command} - - cat <<-END_VERSIONS > versions.yml - - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index b7a2e0c1..163c3015 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -86,13 +86,28 @@ output: description: Optional gzip index file for compressed inputs pattern: "*.gzi" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test index 64219b7d..02ba5040 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -8,10 +8,14 @@ nextflow_process { tag "modules_nfcore" tag "samtools" tag "samtools/faidx" + config "./nextflow.config" test("test_samtools_faidx") { when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -23,9 +27,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } @@ -33,6 +37,9 @@ nextflow_process { test("test_samtools_faidx_bgzip") { when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -44,18 +51,19 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_fasta") { - config "./nextflow.config" - when { + params { + module_args = 'MT192765.1 -o extract.fa' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -68,18 +76,20 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_stub_fasta") { - config "./nextflow2.config" - + options "-stub" when { + params { + module_args = '-o extract.fa' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -92,16 +102,20 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_stub_fai") { + options "-stub" when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -113,9 +127,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } @@ -123,6 +137,9 @@ nextflow_process { test("test_samtools_faidx_get_sizes") { when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -136,9 +153,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -146,6 +163,9 @@ nextflow_process { test("test_samtools_faidx_get_sizes_bgzip") { when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -159,9 +179,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -171,6 +191,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -184,9 +207,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -196,6 +219,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -209,11 +235,11 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } -} \ No newline at end of file +} diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap index 73722414..565d20e7 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -21,7 +21,11 @@ ], "4": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -41,16 +45,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:31:48.258623157" + "timestamp": "2025-12-23T14:02:40.159309157" }, "test_samtools_faidx_get_sizes_bgzip - stub": { "content": [ @@ -83,7 +91,11 @@ ] ], "4": [ - "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -112,16 +124,20 @@ "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:32:41.122428188" + "timestamp": "2025-12-23T14:03:39.550619177" }, "test_samtools_faidx_get_sizes": { "content": [ @@ -149,7 +165,11 @@ ], "4": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -173,16 +193,20 @@ "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" ] ], - "versions": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:34:02.353546697" + "timestamp": "2025-12-23T14:03:16.844965756" }, "test_samtools_faidx_bgzip": { "content": [ @@ -212,7 +236,11 @@ ] ], "4": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -238,16 +266,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:31:55.157487176" + "timestamp": "2025-12-23T14:02:47.301476131" }, "test_samtools_faidx_fasta": { "content": [ @@ -271,7 +303,11 @@ ], "4": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ [ @@ -291,16 +327,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:32:02.149455586" + "timestamp": "2025-12-23T09:44:40.559583279" }, "test_samtools_faidx_get_sizes - stub": { "content": [ @@ -328,7 +368,11 @@ ], "4": [ - "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -352,16 +396,20 @@ "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e3e4ba35a02020d173be8d1ee04eaebf" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:32:34.29376776" + "timestamp": "2025-12-23T14:03:31.989929281" }, "test_samtools_faidx_stub_fasta": { "content": [ @@ -372,7 +420,7 @@ "id": "test", "single_end": false }, - "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "1": [ @@ -385,7 +433,11 @@ ], "4": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ [ @@ -393,7 +445,7 @@ "id": "test", "single_end": false }, - "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "fai": [ @@ -405,16 +457,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:32:09.125065185" + "timestamp": "2025-12-23T09:44:48.295693103" }, "test_samtools_faidx_stub_fai": { "content": [ @@ -431,14 +487,18 @@ "id": "test", "single_end": false }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "3": [ ], "4": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -449,7 +509,7 @@ "id": "test", "single_end": false }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "gzi": [ @@ -458,16 +518,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:32:16.274287863" + "timestamp": "2025-12-23T14:03:09.784289542" }, "test_samtools_faidx_get_sizes_bgzip": { "content": [ @@ -500,7 +564,11 @@ ] ], "4": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -529,15 +597,19 @@ "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" ] ], - "versions": [ - "versions.yml:md5,6bbe80a2e14bd61202ca63e12d66027f" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.1" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-11-20T17:32:28.117654855" + "timestamp": "2025-12-23T14:03:24.814967939" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/nextflow.config b/modules/nf-core/samtools/faidx/tests/nextflow.config index f76a3ba0..202c036e 100644 --- a/modules/nf-core/samtools/faidx/tests/nextflow.config +++ b/modules/nf-core/samtools/faidx/tests/nextflow.config @@ -1,7 +1,7 @@ process { withName: SAMTOOLS_FAIDX { - ext.args = 'MT192765.1 -o extract.fa' + ext.args = params.module_args } } diff --git a/modules/nf-core/samtools/faidx/tests/nextflow2.config b/modules/nf-core/samtools/faidx/tests/nextflow2.config deleted file mode 100644 index 33ebbd5d..00000000 --- a/modules/nf-core/samtools/faidx/tests/nextflow2.config +++ /dev/null @@ -1,6 +0,0 @@ -process { - - withName: SAMTOOLS_FAIDX { - ext.args = '-o extract.fa' - } -} diff --git a/modules/nf-core/samtools/flagstat/environment.yml b/modules/nf-core/samtools/flagstat/environment.yml index 62054fc9..89e12a64 100644 --- a/modules/nf-core/samtools/flagstat/environment.yml +++ b/modules/nf-core/samtools/flagstat/environment.yml @@ -4,5 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf index c23f3a5c..f148f56b 100644 --- a/modules/nf-core/samtools/flagstat/main.nf +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_FLAGSTAT { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.22.1--h96c455f_0' : + 'biocontainers/samtools:1.22.1--h96c455f_0' }" input: tuple val(meta), path(bam), path(bai) @@ -35,7 +35,19 @@ process SAMTOOLS_FLAGSTAT { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.flagstat + cat <<-END_FLAGSTAT > ${prefix}.flagstat + 1000000 + 0 in total (QC-passed reads + QC-failed reads) + 0 + 0 secondary + 0 + 0 supplementary + 0 + 0 duplicates + 900000 + 0 mapped (90.00% : N/A) + 1000000 + 0 paired in sequencing + 500000 + 0 read1 + 500000 + 0 read2 + 800000 + 0 properly paired (80.00% : N/A) + 850000 + 0 with mate mapped to a different chr + 50000 + 0 with mate mapped to a different chr (mapQ>=5) + END_FLAGSTAT cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap index 04c3852b..0a0a9b15 100644 --- a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -8,11 +8,11 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "1": [ - "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" ], "flagstat": [ [ @@ -20,19 +20,19 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "versions": [ - "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:02:58.866491759" + "timestamp": "2025-09-15T15:02:00.813612" }, "BAM": { "content": [ @@ -47,7 +47,7 @@ ] ], "1": [ - "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" ], "flagstat": [ [ @@ -59,14 +59,14 @@ ] ], "versions": [ - "versions.yml:md5,108a155f2d4a99f50bf3176904208d27" + "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:02:47.383332837" + "timestamp": "2025-09-15T15:01:55.232954" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/idxstats/environment.yml b/modules/nf-core/samtools/idxstats/environment.yml index 62054fc9..89e12a64 100644 --- a/modules/nf-core/samtools/idxstats/environment.yml +++ b/modules/nf-core/samtools/idxstats/environment.yml @@ -4,5 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf index 3d5bf4bd..9181a1a5 100644 --- a/modules/nf-core/samtools/idxstats/main.nf +++ b/modules/nf-core/samtools/idxstats/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_IDXSTATS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.22.1--h96c455f_0' : + 'biocontainers/samtools:1.22.1--h96c455f_0' }" input: tuple val(meta), path(bam), path(bai) diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap index 2cc89a3b..d3e785e0 100644 --- a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap @@ -12,7 +12,7 @@ ] ], "1": [ - "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + "versions.yml:md5,6da44e5235401559cea62052bdc0197b" ], "idxstats": [ [ @@ -24,15 +24,15 @@ ] ], "versions": [ - "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + "versions.yml:md5,6da44e5235401559cea62052bdc0197b" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:11:56.466856235" + "timestamp": "2025-09-10T13:47:35.796569" }, "bam": { "content": [ @@ -47,7 +47,7 @@ ] ], "1": [ - "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + "versions.yml:md5,6da44e5235401559cea62052bdc0197b" ], "idxstats": [ [ @@ -59,14 +59,14 @@ ] ], "versions": [ - "versions.yml:md5,c8d7394830c3c1e5be150589571534fb" + "versions.yml:md5,6da44e5235401559cea62052bdc0197b" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:11:46.311550359" + "timestamp": "2025-09-10T13:47:31.86415" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml index 62054fc9..89e12a64 100644 --- a/modules/nf-core/samtools/index/environment.yml +++ b/modules/nf-core/samtools/index/environment.yml @@ -4,5 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 7019a72e..a77ad821 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_INDEX { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.22.1--h96c455f_0' : + 'biocontainers/samtools:1.22.1--h96c455f_0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap index 72d65e81..3836c6bf 100644 --- a/modules/nf-core/samtools/index/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -18,7 +18,7 @@ ], "3": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ], "bai": [ @@ -36,15 +36,15 @@ ] ], "versions": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:21:25.261127166" + "timestamp": "2025-09-10T14:13:38.25787" }, "crai - stub": { "content": [ @@ -65,7 +65,7 @@ ] ], "3": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ], "bai": [ @@ -83,15 +83,15 @@ ], "versions": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:21:12.653194876" + "timestamp": "2025-09-10T14:13:34.496412" }, "bai - stub": { "content": [ @@ -112,7 +112,7 @@ ], "3": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ], "bai": [ [ @@ -130,28 +130,28 @@ ], "versions": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:21:01.854932651" + "timestamp": "2025-09-10T14:13:25.934431" }, "csi": { "content": [ "test.paired_end.sorted.bam.csi", [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:20:51.485364222" + "timestamp": "2025-09-10T14:13:22.262088" }, "crai": { "content": [ @@ -172,7 +172,7 @@ ] ], "3": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ], "bai": [ @@ -190,15 +190,15 @@ ], "versions": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:20:40.518873972" + "timestamp": "2025-09-10T14:13:18.191664" }, "bai": { "content": [ @@ -219,7 +219,7 @@ ], "3": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ], "bai": [ [ @@ -237,14 +237,14 @@ ], "versions": [ - "versions.yml:md5,5e09a6fdf76de396728f877193d72315" + "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.2", + "nextflow": "25.04.6" }, - "timestamp": "2024-09-16T08:20:21.184050361" + "timestamp": "2025-09-10T14:13:08.51539" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/stats/samtools-stats.diff b/modules/nf-core/samtools/stats/samtools-stats.diff new file mode 100644 index 00000000..f6a5b76c --- /dev/null +++ b/modules/nf-core/samtools/stats/samtools-stats.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/samtools/stats' +'modules/nf-core/samtools/stats/meta.yml' is unchanged +Changes in 'samtools/stats/main.nf': +--- modules/nf-core/samtools/stats/main.nf ++++ modules/nf-core/samtools/stats/main.nf +@@ -1,6 +1,6 @@ + process SAMTOOLS_STATS { + tag "$meta.id" +- label 'process_single' ++ label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + +'modules/nf-core/samtools/stats/environment.yml' is unchanged +'modules/nf-core/samtools/stats/tests/main.nf.test' is unchanged +'modules/nf-core/samtools/stats/tests/main.nf.test.snap' is unchanged +************************************************************ diff --git a/modules/nf-core/severus/environment.yml b/modules/nf-core/severus/environment.yml index 6081c124..d657c525 100644 --- a/modules/nf-core/severus/environment.yml +++ b/modules/nf-core/severus/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::severus=1.3 + - bioconda::severus=1.6 diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 7df7c4e5..833af257 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -8,28 +8,26 @@ process SEVERUS { 'biocontainers/severus:1.6--pyhdfd78af_0' }" input: - tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf), path(tbi) - tuple val(meta2), path(bed), path(pon_path) + tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) + tuple val(meta2), path(bed) output: - tuple val(meta), path("severus.log") , emit: log - tuple val(meta), path("read_qual.txt") , emit: read_qual - tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double - tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true - tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true - tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true - tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true - tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true - tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true - tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true - tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true - tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true - tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}/severus.log") , emit: log + tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual + tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -41,23 +39,15 @@ process SEVERUS { def control = control_input ? "--control-bam ${control_input}" : "" def vntr_bed = bed ? "--vntr-bed ${bed}" : "" def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" - def pon = pon_path && (!control_input) ? "--PON ${pon_path}" : "" """ severus \\ $args \\ --threads $task.cpus \\ --target-bam $target_input \\ $vntr_bed \\ - $pon \\ $control \\ $phasing_vcf \\ - --out-dir . - - bgzip somatic_SVs/severus_somatic.vcf - tabix -p vcf somatic_SVs/severus_somatic.vcf.gz - bgzip all_SVs/severus_all.vcf - tabix -p vcf all_SVs/severus_all.vcf.gz - + --out-dir ${prefix} cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -70,28 +60,26 @@ process SEVERUS { prefix = task.ext.prefix ?: "${meta.id}" """ - mkdir -p all_SVs/plots - mkdir -p somatic_SVs/plots + mkdir -p ${prefix}/all_SVs/plots + mkdir -p ${prefix}/somatic_SVs/plots - touch severus_collaped_dup.bed - touch severus.log - touch severus_LOH.bed - touch read_alignments - touch read_ids.csv - touch read_qual.txt - touch breakpoints_double.csv - touch all_SVs/severus_all.vcf.gz - touch all_SVs/severus_all.vcf.gz.tbi - touch all_SVs/breakpoints_clusters_list.tsv - touch all_SVs/breakpoints_clusters.tsv - touch all_SVs/plots/severus_0.html - touch all_SVs/plots/severus_1.html - touch somatic_SVs/severus_somatic.vcf.gz - touch somatic_SVs/severus_somatic.vcf.gz.tbi - touch somatic_SVs/breakpoints_clusters_list.tsv - touch somatic_SVs/breakpoints_clusters.tsv - touch somatic_SVs/plots/severus_0.html - touch somatic_SVs/plots/severus_1.html + touch ${prefix}/severus_collaped_dup.bed + touch ${prefix}/severus.log + touch ${prefix}/severus_LOH.bed + touch ${prefix}/read_alignments + touch ${prefix}/read_ids.csv + touch ${prefix}/read_qual.txt + touch ${prefix}/breakpoints_double.csv + touch ${prefix}/all_SVs/severus_all.vcf + touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv + touch ${prefix}/all_SVs/breakpoints_clusters.tsv + touch ${prefix}/all_SVs/plots/severus_0.html + touch ${prefix}/all_SVs/plots/severus_1.html + touch ${prefix}/somatic_SVs/severus_somatic.vcf + touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv + touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv + touch ${prefix}/somatic_SVs/plots/severus_0.html + touch ${prefix}/somatic_SVs/plots/severus_1.html cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/severus/meta.yml b/modules/nf-core/severus/meta.yml index 8ada3548..b39df3fd 100644 --- a/modules/nf-core/severus/meta.yml +++ b/modules/nf-core/severus/meta.yml @@ -29,23 +29,28 @@ input: description: path to one or multiple target BAM/CRAM files (e.g. tumor, must be indexed) pattern: "*.{bam,cram}" + ontologies: [] - target_index: type: file description: path to one or multiple target BAM/CRAM index files pattern: "*.{bai,crai,csi}" + ontologies: [] - control_input: type: file description: path to the control BAM/CRAM file (e.g. normal, must be indexed) pattern: "*.{bam,cram}" + ontologies: [] - control_index: type: file description: path to the control BAM/CRAM file index pattern: "*.{bai,crai,csi}" + ontologies: [] - vcf: type: file description: path to vcf file used for phasing (if using haplotype specific SV calling pattern: "*.{vcf,vcf.gz}" + ontologies: [] - - meta2: type: map description: | @@ -55,162 +60,192 @@ input: type: file description: path to bed file for tandem repeat regions (must be ordered) pattern: "*.bed" + ontologies: [] output: - - log: - - meta: + log: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/severus.log: type: file - description: Severus log file + description: | + log file pattern: "${prefix}/severus.log" - - read_qual: - - meta: + ontologies: [] + read_qual: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/read_qual.txt: type: file - description: Severus read_qual file + description: | + txt file containing read quality information pattern: "${prefix}/read_qual.txt" - - breakpoints_double: - - meta: + ontologies: [] + breakpoints_double: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/breakpoints_double.csv: type: file - description: Severus breakpoints_double file + description: | + Detailed info about the detected breakpoints for all samples in text format, intended for an advanced user. pattern: "${prefix}/breakpoints_double.csv" - - read_alignments: - - meta: + ontologies: [] + read_alignments: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/read_alignments: type: file - description: read alignments file + description: | pattern: "${prefix}/read_alignments" - - read_ids: - - meta: + ontologies: [] + read_ids: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/read_ids.csv: type: file - description: read IDs for support reads + description: | + Contains supporting read IDs for each SV pattern: "${prefix}/read_ids" - - collapsed_dup: - - meta: + ontologies: [] + collapsed_dup: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/severus_collaped_dup.bed: type: file - description: a bed file with identified collapsed duplication regions + description: | pattern: "${prefix}/severus_collaped_dup" - - loh: - - meta: + ontologies: [] + loh: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/severus_LOH.bed: type: file - description: a bed file with predicted LOH regions + description: | + BED file containing loss of heterozygosity information pattern: "${prefix}/severus_LOH.bed" - - all_vcf: - - meta: + ontologies: [] + all_vcf: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/all_SVs/severus_all.vcf: - type: file - description: VCF file with all SVs (somatic + germline) + type: map + description: | + VCF file containing somatic and germline structural variants pattern: "${prefix}/all_SVs/severus_all.vcf" - - all_breakpoints_clusters_list: - - meta: + all_breakpoints_clusters_list: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/all_SVs/breakpoints_clusters_list.tsv: type: file - description: Severus breakpoints clusters list file + description: | + a TSV containing a list of all breakpoint clusters pattern: "${prefix}/all_SVs/breakpoints_clusters_list.tsv" - - all_breakpoints_clusters: - - meta: + ontologies: [] + all_breakpoints_clusters: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/all_SVs/breakpoints_clusters.tsv: type: file - description: Severus breakpoints clusters file + description: | + TSV file listing meta information in breakpoint clusters pattern: "${prefix}/all_SVs/breakpoints_clusters.tsv" - - all_plots: - - meta: + ontologies: [] + all_plots: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/all_SVs/plots/severus_*.html: type: file - description: Severus plots + description: | + Plotly graph containing of somatic and germline breakpoint clusters pattern: "${prefix}/all_SVs/plots/*.html" - - somatic_vcf: - - meta: + ontologies: [] + somatic_vcf: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ${prefix}/somatic_SVs/severus_all.vcf: + pattern: "${prefix}/severus.log" + - ${prefix}/somatic_SVs/severus_somatic.vcf: type: file - description: VCF file with somatic SVs + description: | + VCF file containing somatic structural variants (SV) pattern: "${prefix}/somatic_SVs/severus_all.vcf" - - somatic_breakpoints_clusters_list: - - meta: + ontologies: [] + somatic_breakpoints_clusters_list: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv: type: file - description: Severus somatic breakpoints clusters list file + description: | + TSV file containing full list of somatic breakpoint clusters pattern: "${prefix}/somatic_SVs/breakpoints_clusters_list.tsv" - - somatic_breakpoints_clusters: - - meta: + ontologies: [] + somatic_breakpoints_clusters: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/somatic_SVs/breakpoints_clusters.tsv: type: file - description: Severus somatic breakpoints clusters file + description: | + TSV file containing meta information of somatic breakpoint clusters pattern: "${prefix}/somatic_SVs/breakpoints_clusters.tsv" - - somatic_plots: - - meta: + ontologies: [] + somatic_plots: + - - meta: type: map description: | Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` + pattern: "${prefix}/severus.log" - ${prefix}/somatic_SVs/plots/severus_*.html: type: file - description: Severus somatic plots + description: | + Plotly graph of somatic breakpoint clusters pattern: "${prefix}/somatic_SVs/plots/*.html" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@fellen31" maintainers: diff --git a/modules/nf-core/severus/tests/main.nf.test.snap b/modules/nf-core/severus/tests/main.nf.test.snap index 28754a33..16d4466b 100644 --- a/modules/nf-core/severus/tests/main.nf.test.snap +++ b/modules/nf-core/severus/tests/main.nf.test.snap @@ -7,7 +7,7 @@ { "id": "test" }, - "read_qual.txt:md5,d0428d5dc149f2b40e46e480809d7417" + "read_qual.txt:md5,93f74117a9c031a9f7f3e56fcfc4b02c" ] ], [ @@ -15,10 +15,10 @@ { "id": "test" }, - "breakpoints_double.csv:md5,a0fdb9d522587e7b088b3a61fce99843" + "breakpoints_double.csv:md5,7cb071eb787217599ce780b443d9f203" ] ], - "VcfFile [chromosomes=[], sampleCount=1, variantCount=0, phased=true, phasedAutodetect=true]", + "VcfFile [chromosomes=[chr22], sampleCount=1, variantCount=1, phased=false, phasedAutodetect=false]", [ ], @@ -26,14 +26,14 @@ ], [ - "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + "versions.yml:md5,ad073554f79b24f01b7eeb44b7e70008" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-22T16:18:01.020231375" + "timestamp": "2025-10-23T10:30:12.366674714" }, "homo_sapiens - [ bam, bai, bam, bai, vcf ], [[],[]]": { "content": [ @@ -43,7 +43,7 @@ { "id": "test" }, - "read_qual.txt:md5,799cd79452b0480c945e6663c572ea87" + "read_qual.txt:md5,c3964c3cb18fe94df02d8b5b1d46b0f8" ] ], [ @@ -51,11 +51,11 @@ { "id": "test" }, - "breakpoints_double.csv:md5,085eae5aaaed3f4970b65b80f5ded767" + "breakpoints_double.csv:md5,c3c4c8b8737458c898d2ab73cc726a73" ] ], "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", - "7f6a6ca528a33bf3d41520971bcd00bb", + "467023c532e1c5a9df93d98a0ec92255", [ ], @@ -63,7 +63,12 @@ ], [ - + [ + { + "id": "test" + }, + "severus_somatic.vcf:md5,ce1bbdc8006bf77cf0241341b8031034" + ] ], [ @@ -72,14 +77,14 @@ ], [ - "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + "versions.yml:md5,ad073554f79b24f01b7eeb44b7e70008" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-22T16:11:13.354543848" + "timestamp": "2025-10-23T10:30:20.686848066" }, "homo_sapiens - [ bam, bai, [], [], [] ], [[],[]] - stub": { "content": [ @@ -112,7 +117,12 @@ ] ], "11": [ - + [ + { + "id": "test" + }, + "severus_somatic.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "12": [ [ @@ -142,7 +152,7 @@ ] ], "15": [ - "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + "versions.yml:md5,ad073554f79b24f01b7eeb44b7e70008" ], "2": [ [ @@ -327,18 +337,23 @@ ] ], "somatic_vcf": [ - + [ + { + "id": "test" + }, + "severus_somatic.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ], "versions": [ - "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + "versions.yml:md5,ad073554f79b24f01b7eeb44b7e70008" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-22T16:03:53.176564181" + "timestamp": "2025-10-23T10:30:28.305922677" }, "homo_sapiens - [ bam, bai, bam, bai, [] ], [[],[]]": { "content": [ @@ -348,7 +363,7 @@ { "id": "test" }, - "read_qual.txt:md5,799cd79452b0480c945e6663c572ea87" + "read_qual.txt:md5,c3964c3cb18fe94df02d8b5b1d46b0f8" ] ], [ @@ -356,11 +371,11 @@ { "id": "test" }, - "breakpoints_double.csv:md5,e2b55013bcb77a0b738cdba485520f68" + "breakpoints_double.csv:md5,820a478c24ca5a83e122a7e811f8414d" ] ], "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", - "7f6a6ca528a33bf3d41520971bcd00bb", + "467023c532e1c5a9df93d98a0ec92255", [ ], @@ -368,7 +383,12 @@ ], [ - + [ + { + "id": "test" + }, + "severus_somatic.vcf:md5,10d304342aa0adc19bc85b67645c9820" + ] ], [ @@ -377,14 +397,14 @@ ], [ - "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + "versions.yml:md5,ad073554f79b24f01b7eeb44b7e70008" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-22T16:11:01.967892199" + "timestamp": "2025-10-23T10:30:16.766604348" }, "homo_sapiens - [ bam, bai, bam, bai, vcf ], [ bed ]": { "content": [ @@ -394,7 +414,7 @@ { "id": "test" }, - "read_qual.txt:md5,8ef1a36618e7f2cad39c79c9aed3cd64" + "read_qual.txt:md5,8ea4c56f328b82b104702705c06f0731" ] ], [ @@ -402,11 +422,11 @@ { "id": "test" }, - "breakpoints_double.csv:md5,085eae5aaaed3f4970b65b80f5ded767" + "breakpoints_double.csv:md5,c3c4c8b8737458c898d2ab73cc726a73" ] ], "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1, phased=false, phasedAutodetect=false]", - "7f6a6ca528a33bf3d41520971bcd00bb", + "467023c532e1c5a9df93d98a0ec92255", [ ], @@ -414,7 +434,12 @@ ], [ - + [ + { + "id": "test" + }, + "severus_somatic.vcf:md5,d759aea3770c7d074d34c3c469f8ff14" + ] ], [ @@ -423,13 +448,13 @@ ], [ - "versions.yml:md5,ba5c727bfdd7186a318f8fa6c2aca06b" + "versions.yml:md5,ad073554f79b24f01b7eeb44b7e70008" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "25.04.6" }, - "timestamp": "2025-01-22T16:11:25.517633729" + "timestamp": "2025-10-23T10:30:24.866674264" } } \ No newline at end of file diff --git a/modules/nf-core/severus/tests/tags.yml b/modules/nf-core/severus/tests/tags.yml deleted file mode 100644 index d7e36658..00000000 --- a/modules/nf-core/severus/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -severus: - - "modules/nf-core/severus/**" diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml index 1b6bf491..1603e382 100644 --- a/modules/nf-core/untar/meta.yml +++ b/modules/nf-core/untar/meta.yml @@ -1,5 +1,5 @@ name: untar -description: Extract files. +description: Extract files from tar, tar.gz, tar.bz2, tar.xz archives keywords: - untar - uncompress @@ -7,7 +7,7 @@ keywords: tools: - untar: description: | - Extract tar.gz files. + Extract tar, tar.gz, tar.bz2, tar.xz files. documentation: https://www.gnu.org/software/tar/manual/ licence: ["GPL-3.0-or-later"] identifier: "" @@ -19,8 +19,8 @@ input: e.g. [ id:'test', single_end:false ] - archive: type: file - description: File to be untar - pattern: "*.{tar}.{gz}" + description: File to be untarred + pattern: "*.{tar,tar.gz,tar.bz2,tar.xz}" ontologies: - edam: http://edamontology.org/format_3981 # TAR format - edam: http://edamontology.org/format_3989 # GZIP format diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 5df2b891..da316f40 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -83,8 +83,6 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fai = SAMTOOLS_FAIDX.out.fai - ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) - // // Prepare ASCAT files // diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 9215495a..d32e7643 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -91,16 +91,14 @@ workflow TUMOR_NORMAL_HAPPHASE { // // MODULE: CLAIR3 - // // small germline variant calling + CLAIR3 ( normal_bams, fasta, fai ) - ch_versions = ch_versions.mix(CLAIR3.out.versions) - // Add germline vcf to normal bams // remove clair3 model information @@ -145,12 +143,12 @@ workflow TUMOR_NORMAL_HAPPHASE { // both are needed for mixing with the tumor bams normal_bams - .join(LONGPHASE_PHASE.out.vcf) - .map { meta, bam, bai, clair3_model, platform, vcf -> + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE.out.sv_vcf) + .join(LONGPHASE_PHASE.out.mod_vcf) + .map { meta, bam, bai, clair3_model, platform, vcf, svs, mods -> def new_meta = meta + [type: "normal"] - def snvs = [] - def mods = [] - return[new_meta, bam, bai, vcf, snvs, mods] + return[new_meta, bam, bai, vcf, svs, mods] } .set{ normal_bams } @@ -165,12 +163,12 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams and type information // mix with the normal bams tumor_bams - .join(LONGPHASE_PHASE.out.vcf) - .map { meta, bam, bai, vcf -> + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE.out.sv_vcf) + .join(LONGPHASE_PHASE.out.mod_vcf) + .map { meta, bam, bai, vcf, svs, mods -> def new_meta = meta + [type: "tumor"] - def snvs = [] - def mods = [] - return [new_meta, bam, bai, vcf, snvs, mods] + return [new_meta, bam, bai, vcf, svs, mods] } .mix(normal_bams) .set{ mixed_bams_vcf } @@ -244,8 +242,8 @@ workflow TUMOR_NORMAL_HAPPHASE { // Return channel return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] } - .join(LONGPHASE_PHASE.out.vcf) - .join(LONGPHASE_PHASE.out.tbi) + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE.out.snv_vcf_index) .set{tumor_normal_severus} // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] @@ -304,8 +302,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { somatic_vep } - ch_versions = ch_versions.mix(CLAIRS.out.versions) - emit: tumor_normal_severus somatic_vep diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 220a8710..b7ae3c5b 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -46,13 +46,10 @@ workflow TUMOR_ONLY_HAPPHASE { gnomad ) - ch_versions = ch_versions.mix(CLAIRSTO.out.versions) - CLAIRSTO.out.indel_vcf .join(CLAIRSTO.out.snv_vcf) .set{ clairsto_vcf } - ch_versions = ch_versions.mix(CLAIRSTO.out.versions) // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // indel_vcf: vcf for indels // snv_vcf: vcf for snvs @@ -66,9 +63,6 @@ workflow TUMOR_ONLY_HAPPHASE { VCFSPLIT ( clairsto_vcf ) - ch_versions = ch_versions.mix(VCFSPLIT.out.versions) - - ch_versions = ch_versions.mix(VCFSPLIT.out.versions) // Add the nonsomatic vcf info // remove model info @@ -113,18 +107,18 @@ workflow TUMOR_ONLY_HAPPHASE { fasta, fai ) - ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) // Add phased nonsomatic vcf info // remove model info tumor_bams - .join(LONGPHASE_PHASE.out.vcf) - .map{ meta, bam, bai, model, snps -> - def svs = [] - def mods = [] - return [meta, bam, bai, snps, svs, mods] + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE.out.sv_vcf) + .join(LONGPHASE_PHASE.out.mod_vcf) + .map { meta, bam, bai, vcf, svs, mods -> + def new_meta = meta + [type: "tumor"] + return [new_meta, bam, bai, vcf, svs, mods] } .set{ tumor_bams_phasedvcf } @@ -145,7 +139,6 @@ workflow TUMOR_ONLY_HAPPHASE { fasta, fai ) - ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) @@ -163,15 +156,14 @@ workflow TUMOR_ONLY_HAPPHASE { SAMTOOLS_INDEX ( haplotagged_bams ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) // join information and the phased VCF file haplotagged_bams .join(SAMTOOLS_INDEX.out.bai) - .join(LONGPHASE_PHASE.out.vcf) - .join(LONGPHASE_PHASE.out.tbi) + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE.out.snv_vcf_index) .map{ meta, hap_bam, hap_bai, vcf, tbi -> def new_meta = [id: meta.id, paired_data: meta.paired_data, diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index 44d4c010..90fcbf80 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -15,7 +15,6 @@ workflow BAM_STATS_SAMTOOLS { ch_versions = Channel.empty() SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) - ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap index 8ca22526..3c543191 100644 --- a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -17,7 +17,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -30,9 +30,8 @@ ] ], "3": [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -40,7 +39,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -62,17 +61,16 @@ ] ], "versions": [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:08:35.660286921" + "timestamp": "2025-11-01T02:39:28.707989" }, "test_bam_stats_samtools_single_end - stub": { "content": [ @@ -92,7 +90,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -105,9 +103,8 @@ ] ], "3": [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -115,7 +112,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -137,17 +134,16 @@ ] ], "versions": [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:08:24.220305512" + "timestamp": "2025-11-01T02:39:20.473816" }, "test_bam_stats_samtools_paired_end_cram - stub": { "content": [ @@ -167,7 +163,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -180,9 +176,8 @@ ] ], "3": [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -190,7 +185,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -212,17 +207,16 @@ ] ], "versions": [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:08:54.206770141" + "timestamp": "2025-11-01T02:39:37.697552" }, "test_bam_stats_samtools_single_end": { "content": [ @@ -250,20 +244,19 @@ "id": "test", "single_end": true }, - "test.stats:md5,291bb2393ec947140d12d42c2795b222" + "test.stats:md5,7a05a22bdb17e8df6e8c2d100ff09a31" ] ], [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:07:49.731645858" + "timestamp": "2025-11-01T02:38:50.143087" }, "test_bam_stats_samtools_paired_end": { "content": [ @@ -291,20 +284,19 @@ "id": "test", "single_end": true }, - "test.stats:md5,8140d69cdedd77570ca1d7618a744e16" + "test.stats:md5,a391612b5ef5b181e854ccaad8c8a068" ] ], [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:08:01.421996172" + "timestamp": "2025-11-01T02:39:01.02311" }, "test_bam_stats_samtools_paired_end_cram": { "content": [ @@ -332,19 +324,18 @@ "id": "test", "single_end": false }, - "test.stats:md5,1622856127bafd6cdbadee9cd64ec9b7" + "test.stats:md5,2b0e31ab01b867a6ff312023ae03838d" ] ], [ - "versions.yml:md5,73c55059ed478cd2f9cd93dd3185da3a", - "versions.yml:md5,80d8653e01575b3c381d87073f672fb5", - "versions.yml:md5,cb889532237a2f3d813978ac14a12d51" + "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:08:12.640915756" + "timestamp": "2025-11-01T02:39:12.503355" } } \ No newline at end of file From b01cd5ef56cba84029f2f5f8b75ae45165697387 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:14:43 +0100 Subject: [PATCH 027/183] minor changelog update --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b438393b..5cd2ca6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v1.0.0 - [28 Nov 2025] - Initial release of IntGenomicsLab/lrsomatic, created with the [nf-core](https://nf-co.re/) template. ### `Added` From 64b76b80a5e8eef628bf716c19ada6fc280daf90 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:15:14 +0100 Subject: [PATCH 028/183] Changes to use topic versions where possible --- workflows/lrsomatic.nf | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index e5757b72..44cbfd74 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -106,7 +106,6 @@ workflow LRSOMATIC { METAEXTRACT( ch_samplesheet ) - ch_versions = ch_versions.mix(METAEXTRACT.out.versions) basecall_meta = METAEXTRACT.out.meta_ext // Adds the base calling model to meta.basecall_model @@ -154,13 +153,9 @@ workflow LRSOMATIC { // // QC the unaligned bams if (!params.skip_qc && !params.skip_cramino) { - CRAMINO_PRE ( ch_cat_ubams ) - - ch_versions = ch_versions.mix(CRAMINO_PRE.out.versions) } - // // SUBWORKFLOW: PREPARE_REFERENCE_FILES // @@ -175,11 +170,11 @@ workflow LRSOMATIC { clair3_modelMap ) - vep_cache = Channel.empty() + vep_cache = channel.empty() if (!params.skip_vep) { - Channel + channel .of([ vep_cache: params.vep_cache, vep_cache_version: params.vep_cache_version, @@ -252,12 +247,11 @@ workflow LRSOMATIC { FIBERTOOLSRS_PREDICTM6A ( pacbio_bams.kinetics ) + pacbio_bams.noKinetics .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) .set{predicted_bams} - ch_versions = ch_versions.mix(FIBERTOOLSRS_PREDICTM6A.out.versions) - ch_cat_ubams_pacbio_ont_branching.ont .mix(predicted_bams) .set{fiber_branch} @@ -277,8 +271,6 @@ workflow LRSOMATIC { fiber_branch.fiber ) - ch_versions = ch_versions.mix(FIBERTOOLSRS_NUCLEOSOMES.out.versions) - // // MODULE: FIBERTOOLSRS_FIRE // @@ -287,8 +279,6 @@ workflow LRSOMATIC { FIBERTOOLSRS_NUCLEOSOMES.out.bam ) - ch_versions = ch_versions.mix(FIBERTOOLSRS_FIRE.out.versions) - if(!params.normal_fiber){ fiber_branch.nonFiber .mix(normal_bams) @@ -307,13 +297,11 @@ workflow LRSOMATIC { // // MODULE: FIBERTOOLSRS_QC // + FIBERTOOLSRS_QC ( FIBERTOOLSRS_FIRE.out.bam ) - - ch_versions = ch_versions.mix(FIBERTOOLSRS_QC.out.versions) } - } // // MODULE: MINIMAP2_ALIGN @@ -460,8 +448,6 @@ workflow LRSOMATIC { [[:], params.bed_file, params.pon_file] ) - - ch_versions = ch_versions.mix(SEVERUS.out.versions) SEVERUS.out.all_vcf @@ -495,7 +481,6 @@ workflow LRSOMATIC { CRAMINO_POST ( ch_minimap_bam ) - ch_versions = ch_versions.mix(CRAMINO_POST.out.versions) } // @@ -587,8 +572,6 @@ workflow LRSOMATIC { wakhan_input, ch_fasta ) - - ch_versions = ch_versions.mix(WAKHAN.out.versions) } // From 47748687047c423d1bc996a094f7db85f82cb32b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:17:01 +0100 Subject: [PATCH 029/183] linting --- subworkflows/local/tumor_normal_happhase.nf | 2 +- workflows/lrsomatic.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index d32e7643..a4c535e7 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -92,7 +92,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // // MODULE: CLAIR3 // small germline variant calling - + CLAIR3 ( normal_bams, fasta, diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 44cbfd74..388c5900 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -247,7 +247,7 @@ workflow LRSOMATIC { FIBERTOOLSRS_PREDICTM6A ( pacbio_bams.kinetics ) - + pacbio_bams.noKinetics .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) .set{predicted_bams} @@ -297,7 +297,7 @@ workflow LRSOMATIC { // // MODULE: FIBERTOOLSRS_QC // - + FIBERTOOLSRS_QC ( FIBERTOOLSRS_FIRE.out.bam ) From 86997ac521cc6c010e8ec9d0a0feea307096fb28 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:27:30 +0100 Subject: [PATCH 030/183] fixes in longphase phase after updating nf-core module --- modules.json | 115 +++-- .../longphase/phase/longphase-phase.diff | 487 +----------------- modules/nf-core/longphase/phase/main.nf | 3 + 3 files changed, 108 insertions(+), 497 deletions(-) diff --git a/modules.json b/modules.json index 36f2aa24..84dc08d7 100644 --- a/modules.json +++ b/modules.json @@ -8,129 +8,178 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": ["modules", "vcf_gather_bcftools"] + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["vcf_gather_bcftools"], + "installed_by": [ + "vcf_gather_bcftools" + ], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -139,25 +188,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/longphase-phase.diff b/modules/nf-core/longphase/phase/longphase-phase.diff index 1e9d2652..d8151f8c 100644 --- a/modules/nf-core/longphase/phase/longphase-phase.diff +++ b/modules/nf-core/longphase/phase/longphase-phase.diff @@ -1,77 +1,9 @@ Changes in component 'nf-core/longphase/phase' -Changes in 'longphase/phase/meta.yml': ---- modules/nf-core/longphase/phase/meta.yml -+++ modules/nf-core/longphase/phase/meta.yml -@@ -34,7 +34,7 @@ - description: Index of sorted BAM/CRAM file(s) - pattern: "*.{bai,crai,csi}" - ontologies: [] -- - snvs: -+ - snps: - type: file - description: VCF file with SNPs (and INDELs) - pattern: "*.{vcf,vcf.gz}" -@@ -70,39 +70,15 @@ - pattern: "*.fai" - ontologies: [] - output: -- snv_vcf: -+ vcf: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` -- - "${prefix}.vcf.gz": -+ - "*.vcf.gz": - type: file -- description: Compressed VCF file with phased SNVs and indels -- pattern: "*.vcf.gz" -- ontologies: -- - edam: http://edamontology.org/format_3989 # GZIP format -- sv_vcf: -- - - meta: -- type: map -- description: | -- Groovy Map containing sample information -- e.g. `[ id:'sample1', single_end:false ]` -- - "${prefix}_SV.vcf.gz": -- type: file -- description: Compressed VCF file with phased SVs -- pattern: "*_SV.vcf.gz" -- ontologies: -- - edam: http://edamontology.org/format_3989 # GZIP format -- mod_vcf: -- - - meta: -- type: map -- description: | -- Groovy Map containing sample information -- e.g. `[ id:'sample1', single_end:false ]` -- - "${prefix}_mod.vcf.gz": -- type: file -- description: Compressed VCF file with phased modifications -+ description: Compressed VCF file with phased variants - pattern: "*.vcf.gz" - ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format - +'modules/nf-core/longphase/phase/meta.yml' is unchanged Changes in 'longphase/phase/main.nf': --- modules/nf-core/longphase/phase/main.nf +++ modules/nf-core/longphase/phase/main.nf -@@ -4,20 +4,19 @@ - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': -- 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" -+ 'https://depot.galaxyproject.org/singularity/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0': -+ 'biocontainers/mulled-v2-d626bb8ec5a659accfbd8490bc1ac4a940722258:682e8c0cc0ceebf9bd38371a58249aabce93b1b3-0' }" - - input: -- tuple val(meta), path(bam), path(bai), path(snvs), path(svs), path(mods) -+ tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) - tuple val(meta2), path(fasta) - tuple val(meta3), path(fai) +@@ -14,10 +14,13 @@ output: @@ -79,414 +11,33 @@ Changes in 'longphase/phase/main.nf': - tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true - tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true - path "versions.yml" , emit: versions -+ tuple val(meta), path("*.vcf.gz") , emit: vcf -+ tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi -+ path "versions.yml" , emit: versions ++ tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf ++ tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: snv_vcf_index ++ tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true ++ tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true ++ tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true ++ tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true ++ path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when -@@ -25,7 +24,7 @@ - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' -- prefix = task.ext.prefix ?: "${meta.id}" -+ def prefix = task.ext.prefix ?: "${meta.id}" - def sv_file = svs ? "--sv-file ${svs}" : "" - def mod_file = mods ? "--mod-file ${mods}" : "" - def bams = bam.collectMany { file -> ["-b", file] }.join(" ") -@@ -36,7 +35,7 @@ - --threads $task.cpus \\ - -o ${prefix} \\ - --reference ${fasta} \\ -- --snp-file ${snvs} \\ -+ --snp-file ${snps} \\ - ${bams} \\ - ${sv_file} \\ - ${mod_file} \\ -@@ -44,7 +43,9 @@ - bgzip \\ +@@ -45,10 +48,13 @@ --threads $task.cpus \\ $args2 \\ -- ${prefix}*.vcf -+ ${prefix}.vcf -+ -+ tabix -p vcf ${prefix}.vcf.gz + ${prefix}*.vcf ++ ++ tabix -p vcf ${prefix}*.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": -@@ -54,15 +55,10 @@ - - stub: - def args = task.ext.args ?: '' -- prefix = task.ext.prefix ?: "${meta.id}" -- def sv_command = svs ? "echo '' | bgzip -c > ${prefix}_SV.vcf.gz" : "" -- def mod_command = mods ? "echo '' | bgzip -c > ${prefix}_mod.vcf.gz" : "" -+ def prefix = task.ext.prefix ?: "${meta.id}" + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') ++ tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS """ -- echo $args - echo "" | bgzip -c > ${prefix}.vcf.gz -- -- $sv_command -- $mod_command -+ echo "" > ${prefix}.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - -Changes in 'longphase/phase/environment.yml': ---- modules/nf-core/longphase/phase/environment.yml -+++ modules/nf-core/longphase/phase/environment.yml -@@ -5,5 +5,5 @@ - - bioconda - - dependencies: -- - bioconda::htslib=1.22.1 -- - bioconda::longphase=2.0 -+ - bioconda::htslib=1.20 -+ - bioconda::longphase=1.7.3 - -Changes in 'longphase/phase/tests/main.nf.test': ---- modules/nf-core/longphase/phase/tests/main.nf.test -+++ modules/nf-core/longphase/phase/tests/main.nf.test -@@ -44,7 +44,7 @@ - - } - -- test("[ bam, bai, snps, svs, [] ], fasta, fai") { -+test("[ bam, bai, snps, svs, [] ], fasta, fai") { - - when { - process { -@@ -78,7 +78,7 @@ - - } - -- test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { -+test("[ bam x2, bai x2, snps, svs, [] ], fasta, fai") { - - when { - process { -@@ -154,38 +154,4 @@ - - } -- test("[ bam, bai, snps, svs, [] ], fasta, fai - stub") { -- options "-stub" -- -- when { -- process { -- """ -- input[0] = [ -- [ id:'test' ], -- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam', checkIfExists: true), -- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/nanopore/bam/test.sorted.bam.bai', 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/vcf/NA24385_sv.vcf.gz', checkIfExists: true), -- [] -- ] -- input[1] = [ -- [ id:'reference' ], -- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) -- ] -- input[2] = [ -- [ id:'reference' ], -- file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) -- ] -- """ -- } -- } -- -- then { -- assertAll( -- { assert process.success }, -- { assert snapshot(process.out).match() } -- ) -- } -- -- } - } -Changes in 'longphase/phase/tests/main.nf.test.snap': ---- modules/nf-core/longphase/phase/tests/main.nf.test.snap -+++ modules/nf-core/longphase/phase/tests/main.nf.test.snap -@@ -1,59 +1,4 @@ - { -- "[ bam, bai, snps, svs, [] ], fasta, fai - stub": { -- "content": [ -- { -- "0": [ -- [ -- { -- "id": "test" -- }, -- "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" -- ] -- ], -- "1": [ -- [ -- { -- "id": "test" -- }, -- "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" -- ] -- ], -- "2": [ -- -- ], -- "3": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -- ], -- "mod_vcf": [ -- -- ], -- "snv_vcf": [ -- [ -- { -- "id": "test" -- }, -- "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" -- ] -- ], -- "sv_vcf": [ -- [ -- { -- "id": "test" -- }, -- "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" -- ] -- ], -- "versions": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -- ] -- } -- ], -- "meta": { -- "nf-test": "0.9.2", -- "nextflow": "25.04.5" -- }, -- "timestamp": "2025-11-06T16:06:24.025191062" -- }, - "[ bam, bai, snps, [], [] ], fasta, fai": { - "content": [ - { -@@ -62,42 +7,30 @@ - { - "id": "test" - }, -- "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" -+ "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" - ] - ], - "1": [ -- -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" - ], -- "2": [ -- -- ], -- "3": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -- ], -- "mod_vcf": [ -- -- ], -- "snv_vcf": [ -+ "vcf": [ - [ - { - "id": "test" - }, -- "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" -+ "test.vcf.gz:md5,fd2d21056b2de4722f12d5e883d9cb0a" - ] - ], -- "sv_vcf": [ -- -- ], - "versions": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" - ] - } - ], - "meta": { -- "nf-test": "0.9.2", -- "nextflow": "25.04.5" -+ "nf-test": "0.8.4", -+ "nextflow": "24.04.2" - }, -- "timestamp": "2025-11-06T16:05:57.029934447" -+ "timestamp": "2024-07-22T12:14:04.269956432" - }, - "[ bam, bai, snps, svs, [] ], fasta, fai": { - "content": [ -@@ -107,52 +40,30 @@ - { - "id": "test" - }, -- "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" -+ "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" - ] - ], - "1": [ -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" -+ ], -+ "vcf": [ - [ - { - "id": "test" - }, -- "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" -- ] -- ], -- "2": [ -- -- ], -- "3": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -- ], -- "mod_vcf": [ -- -- ], -- "snv_vcf": [ -- [ -- { -- "id": "test" -- }, -- "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" -- ] -- ], -- "sv_vcf": [ -- [ -- { -- "id": "test" -- }, -- "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" -+ "test.vcf.gz:md5,b0a3effd6e076edbe7e2f1f7cfff547c" - ] - ], - "versions": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" - ] - } - ], - "meta": { -- "nf-test": "0.9.2", -- "nextflow": "25.04.5" -+ "nf-test": "0.9.0", -+ "nextflow": "24.04.4" - }, -- "timestamp": "2025-11-06T16:06:03.319855838" -+ "timestamp": "2024-10-04T13:37:16.921910004" - }, - "[ bam x2, bai x2, snps, svs, [] ], fasta, fai": { - "content": [ -@@ -162,52 +73,30 @@ - { - "id": "test" - }, -- "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" -+ "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" - ] - ], - "1": [ -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" -+ ], -+ "vcf": [ - [ - { - "id": "test" - }, -- "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" -- ] -- ], -- "2": [ -- -- ], -- "3": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -- ], -- "mod_vcf": [ -- -- ], -- "snv_vcf": [ -- [ -- { -- "id": "test" -- }, -- "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" -- ] -- ], -- "sv_vcf": [ -- [ -- { -- "id": "test" -- }, -- "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" -+ "test.vcf.gz:md5,04905b6042998e592c9f3b887ae9e09c" - ] - ], - "versions": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" - ] - } - ], - "meta": { -- "nf-test": "0.9.2", -- "nextflow": "25.04.5" -+ "nf-test": "0.9.0", -+ "nextflow": "24.04.4" - }, -- "timestamp": "2025-11-06T16:06:10.867281359" -+ "timestamp": "2024-10-04T13:37:23.41768963" - }, - "[ bam, bai, snps, [], [] ], fasta, fai - stub": { - "content": [ -@@ -221,18 +110,9 @@ - ] - ], - "1": [ -- -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" - ], -- "2": [ -- -- ], -- "3": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -- ], -- "mod_vcf": [ -- -- ], -- "snv_vcf": [ -+ "vcf": [ - [ - { - "id": "test" -@@ -240,18 +120,15 @@ - "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], -- "sv_vcf": [ -- -- ], - "versions": [ -- "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" -+ "versions.yml:md5,8d8d82510dd1fbe01a91c575c472897f" - ] - } - ], - "meta": { -- "nf-test": "0.9.2", -- "nextflow": "25.04.5" -+ "nf-test": "0.8.4", -+ "nextflow": "24.04.2" - }, -- "timestamp": "2025-11-06T16:06:17.992733472" -+ "timestamp": "2024-07-22T12:15:40.296227382" - } - } +'modules/nf-core/longphase/phase/environment.yml' is unchanged +'modules/nf-core/longphase/phase/tests/main.nf.test' is unchanged +'modules/nf-core/longphase/phase/tests/main.nf.test.snap' is unchanged 'modules/nf-core/longphase/phase/tests/nextflow.config' is unchanged ************************************************************ diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 3e08dfcf..4585d7e9 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -48,10 +48,13 @@ process LONGPHASE_PHASE { --threads $task.cpus \\ $args2 \\ ${prefix}*.vcf + + tabix -p vcf ${prefix}*.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') END_VERSIONS """ From abb0c68378985f63fef69f9e2d58dbd602799594 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:29:10 +0100 Subject: [PATCH 031/183] linting --- modules.json | 115 ++++++------------------ modules/nf-core/longphase/phase/main.nf | 2 +- 2 files changed, 30 insertions(+), 87 deletions(-) diff --git a/modules.json b/modules.json index 84dc08d7..36f2aa24 100644 --- a/modules.json +++ b/modules.json @@ -8,178 +8,129 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ] + "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "vcf_gather_bcftools" - ], + "installed_by": ["vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -188,33 +139,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 4585d7e9..3b942972 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -48,7 +48,7 @@ process LONGPHASE_PHASE { --threads $task.cpus \\ $args2 \\ ${prefix}*.vcf - + tabix -p vcf ${prefix}*.vcf.gz cat <<-END_VERSIONS > versions.yml From 97021f1de11ebc964b85791c43d4b713622f9599 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:32:41 +0100 Subject: [PATCH 032/183] added vep .diff file --- modules.json | 115 +++++++++++++----- .../ensemblvep/vep/ensemblvep-vep.diff | 52 ++++++++ 2 files changed, 138 insertions(+), 29 deletions(-) create mode 100644 modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff diff --git a/modules.json b/modules.json index 36f2aa24..84dc08d7 100644 --- a/modules.json +++ b/modules.json @@ -8,129 +8,178 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": ["modules", "vcf_gather_bcftools"] + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["vcf_gather_bcftools"], + "installed_by": [ + "vcf_gather_bcftools" + ], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -139,25 +188,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff new file mode 100644 index 00000000..716edbbe --- /dev/null +++ b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff @@ -0,0 +1,52 @@ +Changes in component 'nf-core/ensemblvep/vep' +'modules/nf-core/ensemblvep/vep/meta.yml' is unchanged +Changes in 'ensemblvep/vep/main.nf': +--- modules/nf-core/ensemblvep/vep/main.nf ++++ modules/nf-core/ensemblvep/vep/main.nf +@@ -1,6 +1,6 @@ + process ENSEMBLVEP_VEP { + tag "${meta.id}" +- label 'process_medium' ++ label 'process_very_high' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container +@@ -15,14 +15,16 @@ + path cache + tuple val(meta2), path(fasta) + path extra_files ++ path custom_vep ++ path custom_vep_tbi + + output: +- tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true +- tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true +- tuple val(meta), path("*.tab.gz"), emit: tab, optional: true +- tuple val(meta), path("*.json.gz"), emit: json, optional: true +- path "*.html", emit: report, optional: true +- path "versions.yml", emit: versions ++ tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true ++ tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true ++ tuple val(meta), path("*.tab.gz"), emit: tab, optional: true ++ tuple val(meta), path("*.json.gz"), emit: json, optional: true ++ path "*.html", emit: report, optional: true ++ path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when +@@ -36,6 +38,7 @@ + def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" + def reference = fasta ? "--fasta ${fasta}" : "" + def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" ++ args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") + """ + vep \\ + -i ${vcf} \\ + +'modules/nf-core/ensemblvep/vep/environment.yml' is unchanged +'modules/nf-core/ensemblvep/vep/tests/main.nf.test' is unchanged +'modules/nf-core/ensemblvep/vep/tests/vcf.config' is unchanged +'modules/nf-core/ensemblvep/vep/tests/tab.gz.config' is unchanged +'modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap' is unchanged +'modules/nf-core/ensemblvep/vep/tests/nextflow.config' is unchanged +************************************************************ From 38b9dccd1bf50df9776491bd163cbeb80f69be58 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 13:34:29 +0100 Subject: [PATCH 033/183] update samtools stats --- modules.json | 117 +++++------------- .../nf-core/samtools/stats/environment.yml | 6 +- modules/nf-core/samtools/stats/main.nf | 16 +-- modules/nf-core/samtools/stats/meta.yml | 28 ++++- .../samtools/stats/tests/main.nf.test.snap | 88 ++++++++----- 5 files changed, 119 insertions(+), 136 deletions(-) diff --git a/modules.json b/modules.json index 84dc08d7..124412e3 100644 --- a/modules.json +++ b/modules.json @@ -8,178 +8,129 @@ "ascat": { "branch": "master", "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ] + "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "vcf_gather_bcftools" - ], + "installed_by": ["vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "bam_stats_samtools" - ], + "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -188,33 +139,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml index 62054fc9..89e12a64 100644 --- a/modules/nf-core/samtools/stats/environment.yml +++ b/modules/nf-core/samtools/stats/environment.yml @@ -4,5 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index eac01eeb..a1a05510 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -4,8 +4,8 @@ process SAMTOOLS_STATS { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.22.1--h96c455f_0' : + 'biocontainers/samtools:1.22.1--h96c455f_0' }" input: tuple val(meta), path(input), path(input_index) @@ -13,7 +13,7 @@ process SAMTOOLS_STATS { output: tuple val(meta), path("*.stats"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval('samtools version | sed "1!d;s/.* //"'), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -28,21 +28,11 @@ process SAMTOOLS_STATS { ${reference} \\ ${input} \\ > ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml index 6dc51885..5c59cce4 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -55,13 +55,29 @@ output: description: File containing samtools stats output pattern: "*.{stats}" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" - "@FriederikeHanssen" diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test.snap b/modules/nf-core/samtools/stats/tests/main.nf.test.snap index df507be7..94d981b2 100644 --- a/modules/nf-core/samtools/stats/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -8,11 +8,15 @@ "id": "test", "single_end": false }, - "test.stats:md5,a27fe55e49a341f92379bb20a65c6a06" + "test.stats:md5,f4aec6c41b73d34ac2fc6b3253aa39ba" ] ], "1": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -20,19 +24,23 @@ "id": "test", "single_end": false }, - "test.stats:md5,a27fe55e49a341f92379bb20a65c6a06" + "test.stats:md5,f4aec6c41b73d34ac2fc6b3253aa39ba" ] ], - "versions": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T09:29:16.767396182" + "timestamp": "2025-11-01T02:27:18.460724" }, "bam - stub": { "content": [ @@ -47,7 +55,11 @@ ] ], "1": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -58,16 +70,20 @@ "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T09:29:29.721580274" + "timestamp": "2025-11-01T02:27:30.245839" }, "cram - stub": { "content": [ @@ -82,7 +98,11 @@ ] ], "1": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -93,16 +113,20 @@ "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T09:29:53.567964304" + "timestamp": "2025-11-01T02:27:39.041649" }, "bam": { "content": [ @@ -113,11 +137,15 @@ "id": "test", "single_end": false }, - "test.stats:md5,d53a2584376d78942839e9933a34d11b" + "test.stats:md5,41ba8ad30ddb598dadb177a54c222ab9" ] ], "1": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -125,18 +153,22 @@ "id": "test", "single_end": false }, - "test.stats:md5,d53a2584376d78942839e9933a34d11b" + "test.stats:md5,41ba8ad30ddb598dadb177a54c222ab9" ] ], - "versions": [ - "versions.yml:md5,15b91d8c0e0440332e0fe4df80957043" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T09:28:50.73610604" + "timestamp": "2025-11-01T02:26:55.988241" } } \ No newline at end of file From e0b0b04642aa9b64ec480128b6c949ead644ffbb Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 14:08:18 +0100 Subject: [PATCH 034/183] update nf-core subworkflows --- modules.json | 6 +++--- ro-crate-metadata.json | 2 +- subworkflows/nf-core/utils_nfschema_plugin/main.nf | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules.json b/modules.json index 124412e3..4605b254 100644 --- a/modules.json +++ b/modules.json @@ -143,17 +143,17 @@ }, "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", + "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "51ae5406a030d4da1e49e4dab49756844fdd6c7a", + "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "2fd2cd6d0e7b273747f32e465fdc6bcc3ae0814e", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["subworkflows"] } } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 722e38d3..d084d296 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-12-23T12:58:53+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/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[![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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a bioinformatics pipeline that ...\n\n\n\n\n2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/))\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\n\n\nNow, you can run the pipeline using:\n\n\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\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\nIntGenomicsLab/lrsomatic was originally written by Jonas Demeulemeester.\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n\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", + "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\nIf you use IntGenomicsLab/lrsomatic for your analysis, please cite it using the following doi: [10.5281/zenodo.17751829](https://doi.org/10.5281/zenodo.17751829)\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" diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index ee4738c8..acb39724 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -71,4 +71,3 @@ workflow UTILS_NFSCHEMA_PLUGIN { emit: dummy_emit = true } - From 54a52073fac9f5c960d893a40588087f520df423 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 14:13:45 +0100 Subject: [PATCH 035/183] update ascat --- modules.json | 2 +- modules/nf-core/ascat/environment.yml | 2 +- modules/nf-core/ascat/main.nf | 361 +++++----- modules/nf-core/ascat/meta.yml | 114 +-- modules/nf-core/ascat/tests/main.nf.test | 340 +++++++++ modules/nf-core/ascat/tests/main.nf.test.snap | 677 ++++++++++++++++++ modules/nf-core/ascat/tests/nextflow.config | 5 + 7 files changed, 1281 insertions(+), 220 deletions(-) create mode 100644 modules/nf-core/ascat/tests/main.nf.test create mode 100644 modules/nf-core/ascat/tests/main.nf.test.snap create mode 100644 modules/nf-core/ascat/tests/nextflow.config diff --git a/modules.json b/modules.json index 4605b254..a2a488e3 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "ascat": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, diff --git a/modules/nf-core/ascat/environment.yml b/modules/nf-core/ascat/environment.yml index c5cfc59e..d19645cb 100644 --- a/modules/nf-core/ascat/environment.yml +++ b/modules/nf-core/ascat/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::ascat=3.1.1 + - bioconda::ascat=3.2.0 - bioconda::cancerit-allelecount=4.3.0 diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 1a809687..4d7b2210 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -1,190 +1,211 @@ process ASCAT { - tag "$meta.id" + 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/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0': - 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4c/4cf02c7911ee5e974ce7db978810770efbd8d872ff5ab3462d2a11bcf022fab5/data' + : 'community.wave.seqera.io/library/ascat_cancerit-allelecount:c3e8749fa4af0e99'}" input: tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) - val(genomeVersion) - path(allele_files) - path(loci_files) - path(bed_file) // optional - path(fasta) // optional - path(gc_file) // optional - path(rt_file) // optional + path allele_files + path loci_files + path bed_file + path fasta + path gc_file + path rt_file output: - tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs - tuple val(meta), path("*BAF.txt"), emit: bafs - tuple val(meta), path("*cnvs.txt"), emit: cnvs - tuple val(meta), path("*LogR.txt"), emit: logrs - tuple val(meta), path("*metrics.txt"), emit: metrics - tuple val(meta), path("*png"), emit: png - tuple val(meta), path("*pdf"), emit: pdf, optional: true - tuple val(meta), path("*purityploidy.txt"), emit: purityploidy - tuple val(meta), path("*segments.txt"), emit: segments - tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true - path "versions.yml", emit: versions + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + 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 gender = args.gender ? "$args.gender" : "NULL" - def purity = args.purity ? "$args.purity" : "NULL" - def ploidy = args.ploidy ? "$args.ploidy" : "NULL" - def penalty = args.penalty ? "$args.penalty" : "NULL" - def gc_input = gc_file ? "$gc_file" : "NULL" - def rt_input = rt_file ? "$rt_file" : "NULL" - def pdf_plots = args.pdf_plots ? "$args.pdf_plots" : "NULL" - - def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" - def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" - def chrom_names_arg = args.chrom_names ? ",chrom_names = $args.chrom_names" : "" - def min_base_qual_arg = args.min_base_qual ? ",min_base_qual = $args.min_base_qual" : "" - def min_map_qual_arg = args.min_map_qual ? ",min_map_qual = $args.min_map_qual" : "" - def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" - def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" - def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" - - def normal_exists = input_normal ? 'TRUE' : 'FALSE' - def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" - def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" - def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" - def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + def gender = args.gender ? "${args.gender}" : "NULL" + def genomeVersion = args.genomeVersion ? "${args.genomeVersion}" : "NULL" + def purity = args.purity ? "${args.purity}" : "NULL" + def ploidy = args.ploidy ? "${args.ploidy}" : "NULL" + def gc_input = gc_file ? "${gc_file}" : "NULL" + def rt_input = rt_file ? "${rt_file}" : "NULL" + + def minCounts_arg = args.minCounts ? ", minCounts = ${args.minCounts}" : "" + def bed_file_arg = bed_file ? ", BED_file = '${bed_file}'" : "" + def chrom_names_arg = args.chrom_names ? ", chrom_names = ${args.chrom_names}" : "" + def min_base_qual_arg = args.min_base_qual ? ", min_base_qual = ${args.min_base_qual}" : "" + def min_map_qual_arg = args.min_map_qual ? ", min_map_qual = ${args.min_map_qual}" : "" + def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ", skip_allele_counting_tumour = ${args.skip_allele_counting_tumour}" : "" + def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ", skip_allele_counting_normal = ${args.skip_allele_counting_normal}" : "" + + if (args.additional_allelecounter_flags && fasta) { + additional_allelecounter_arg = ", additional_allelecounter_flags = \"${args.additional_allelecounter_flags} -r ${fasta}\" " + } + else if (args.additional_allelecounter_flags) { + additional_allelecounter_arg = ", additional_allelecounter_flags = \"${args.additional_allelecounter_flags}\" " + } + else if (fasta) { + additional_allelecounter_arg = ", additional_allelecounter_flags = '-r \"${fasta}\"'" + } + else { + additional_allelecounter_arg = "" + } + """ #!/usr/bin/env Rscript library(RColorBrewer) library(ASCAT) options(bitmapType='cairo') - #build prefixes: - allele_path = normalizePath("$allele_files") - allele_prefix = paste0(allele_path, "/", "$allele_files", "_chr") + if(dir.exists("${allele_files}")) { + # expected production use of a directory + allele_path = normalizePath("${allele_files}") + allele_prefix = paste0(allele_path, "/", "${allele_files}", "_chr") + } else if(file.exists("${allele_files}")) { + # expected testing use of a single file + allele_path = basename(normalizePath("${allele_files}")) + allele_prefix = sub('_chr[0-9]+\\\\.txt\$', "_chr", allele_path) + } else { + stop("The specified allele files do not exist.") + } + + if(length(Sys.glob(paste0(allele_prefix,"*")) ) == 0) { + stop(paste("No allele files found matching", allele_prefix)) + } - loci_path = normalizePath("$loci_files") - loci_prefix = paste0(loci_path, "/", "$loci_files", "_chr") + if(dir.exists("${loci_files}")) { + # expected production use of a directory + loci_path = normalizePath("${loci_files}") + loci_prefix = paste0(loci_path, "/", "${loci_files}", "_chr") + } else if(file.exists("${loci_files}")) { + # expected testing use of a single file + loci_path = basename(normalizePath("${loci_files}")) + loci_prefix = sub('_chr[0-9]+\\\\.txt\$', "_chr", loci_path) + } else { + stop("The specified loci files do not exist.") + } - #prepare from BAM files + if(length(Sys.glob(paste0(loci_prefix,"*")) ) == 0) { + stop(paste("No loci files found matching", loci_prefix)) + } + + # Prepare from BAM files ascat.prepareHTS( - tumourseqfile = "$input_tumor", - tumourname = paste0("$prefix", ".tumour"), + tumourseqfile = "${input_tumor}", + normalseqfile = "${input_normal}", + tumourname = paste0("${prefix}", ".tumour"), + normalname = paste0("${prefix}", ".normal"), allelecounter_exe = "alleleCounter", alleles.prefix = allele_prefix, loci.prefix = loci_prefix, - gender = "$gender", - genomeVersion = "$genomeVersion", - nthreads = $task.cpus - $normal_bam - $normal_name - $minCounts_arg - $bed_file_arg - $chrom_names_arg - $min_base_qual_arg - $min_map_qual_arg - $longread_bins - $fasta_arg - $allele_counter_flags - $skip_allele_counting_tumour_arg - $skip_allele_counting_normal_arg, - seed = 42 + gender = "${gender}", + genomeVersion = "${genomeVersion}", + nthreads = ${task.cpus} + ${minCounts_arg} + ${bed_file_arg} + ${chrom_names_arg} + ${min_base_qual_arg} + ${min_map_qual_arg} + ${skip_allele_counting_tumour_arg} + ${skip_allele_counting_normal_arg} + ${additional_allelecounter_arg} + , seed = 42 ) + # Load the data + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("${prefix}", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("${prefix}", ".tumour_tumourBAF.txt"), + Germline_LogR_file = paste0("${prefix}", ".tumour_normalLogR.txt"), + Germline_BAF_file = paste0("${prefix}", ".tumour_normalBAF.txt"), + genomeVersion = "${genomeVersion}", + gender = "${gender}" + ) - #Load the data - if($normal_exists) { - print("normal exists") - ascat.bc = ascat.loadData( - Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), - Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), - Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), - Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), - genomeVersion = "$genomeVersion", - gender = "$gender" - ) - } else { - print("normal does not exist") - ascat.bc = ascat.loadData( - Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), - Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), - genomeVersion = "$genomeVersion", - gender = "$gender") - gg = ascat.predictGermlineGenotypes(ascat.bc, platform = "WGS_hg38_50X") - - } - print("printing ascat.bc") - print(ascat.bc) + # Plot the raw data + ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".before_correction.")) - #Plot the raw data - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) + # Optional LogRCorrection + if("${gc_input}" != "NULL") { - # optional LogRCorrection - if("$gc_input" != "NULL") { - gc_input = paste0(normalizePath("$gc_input")) + if(dir.exists("${gc_input}")) { + # sarek production use of an unzipped folder containing one file + gc_input = list.files("${gc_input}", recursive = TRUE, full.names = TRUE) + if(length(gc_input) != 1 | !file.exists(gc_input)) { + stop("A single gc_input should be provided!") + } + } else if(file.exists("${gc_input}")) { + gc_input = normalizePath("${gc_input}") + } else { + stop("gc_input must be a file or folder containing one file") + } + + if("${rt_input}" != "NULL"){ + + if(dir.exists("${rt_input}")) { + # sarek production use of an unzipped folder containing one file + rt_input = list.files("${rt_input}", recursive = TRUE, full.names = TRUE) + if(length(rt_input) != 1 | !file.exists(rt_input)) { + stop("A single rt_input should be provided!") + } + } else if(file.exists("${rt_input}")) { + rt_input = normalizePath("${rt_input}") + } else { + stop("rt_input must be a file or folder containing one file") + } - if("$rt_input" != "NULL"){ - rt_input = paste0(normalizePath("$rt_input")) ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) - #Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) + # Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".after_correction_gc_rt.")) } else { - ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) - #Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = ${rt_input}) + # Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".after_correction_gc.")) } } - #Segment the data - if($normal_exists) { - ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) - } else { - ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) - } + # Segment the data + ascat.bc = ascat.aspcf(ascat.bc, seed=42) - #Plot the segmented data + # Plot the segmented data ascat.plotSegmentedData(ascat.bc) - #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers - #If psi and rho are manually set: - if (!is.null($purity) && !is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = "$pdf_plots") - } else if(!is.null($purity) && is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = "$pdf_plots") - } else if(!is.null($ploidy) && is.null($purity)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = "$pdf_plots") + # Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, + # and discrete copy numbers + # If psi and rho are manually set: + if (!is.null(${purity}) && !is.null(${ploidy})){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=${purity}, psi_manual=${ploidy}) + } else if(!is.null(${purity}) && is.null(${ploidy})){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=${purity}) + } else if(!is.null(${ploidy}) && is.null(${purity})){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=${ploidy}) } else { - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = "$pdf_plots") + ascat.output <- ascat.runAscat(ascat.bc, gamma=1) } - #Extract metrics from ASCAT profiles + # Extract metrics from ASCAT profiles QC = ascat.metrics(ascat.bc,ascat.output) - #Write out segmented regions (including regions with one copy of each allele) - write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) - - #Write out raw segmented regions (including regions with one copy of each allele) - tryCatch({ # In case segments_raw is not selected - write.table( - ascat.output[["segments_raw"]], - file = paste0(prefix, ".segments_raw.txt"), - sep = "\t", quote = FALSE, row.names = FALSE - ) - }, error = function(e) { - message("Error in writing segments_raw: ", conditionMessage(e)) - }) - - #Write out CNVs in bed format + # Write out segmented regions (including regions with one copy of each allele) + write.table(ascat.output[["segments"]], file=paste0("${prefix}", ".segments.txt"), sep="\t", quote=F, row.names=F) + + # Write out CNVs in bed format cnvs=ascat.output[["segments"]][2:6] - write.table(cnvs, file=paste0("$prefix",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) + write.table(cnvs, file=paste0("${prefix}",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) - #Write out purity and ploidy info + # Write out purity and ploidy info summary <- tryCatch({ matrix(c(ascat.output[["aberrantcellfraction"]], ascat.output[["ploidy"]]), ncol=2, byrow=TRUE)}, error = function(err) { # error handler picks up where error was generated @@ -193,48 +214,46 @@ process ASCAT { } ) colnames(summary) <- c("AberrantCellFraction","Ploidy") - write.table(summary, file=paste0("$prefix",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) + write.table(summary, file=paste0("${prefix}",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) - write.table(QC, file=paste0("$prefix", ".metrics.txt"), sep="\t", quote=F, row.names=F) + write.table(QC, file=paste0("${prefix}", ".metrics.txt"), sep="\t", quote=F, row.names=F) - # version export + # Version export f <- file("versions.yml","w") alleleCounter_version = system(paste("alleleCounter --version"), intern = T) - ascat_version = sessionInfo()\$otherPkgs\$ASCAT\$Version - writeLines(paste0('"', "$task.process", '"', ":"), f) - writeLines(paste(" alleleCounter:", alleleCounter_version), f) + ascat_version = as.character(packageVersion('ASCAT')) + writeLines(paste0('"', "${task.process}", '"', ":"), f) writeLines(paste(" ascat:", ascat_version), f) + writeLines(paste(" alleleCounter:", alleleCounter_version), f) close(f) - """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - echo stub > ${prefix}.after_correction.gc_rt.test.tumour.germline.png - echo stub > ${prefix}.after_correction.gc_rt.test.tumour.tumour.png - echo stub > ${prefix}.before_correction.test.tumour.germline.png - echo stub > ${prefix}.before_correction.test.tumour.tumour.png - echo stub > ${prefix}.cnvs.txt - echo stub > ${prefix}.metrics.txt - echo stub > ${prefix}.normal_alleleFrequencies_chr21.txt - echo stub > ${prefix}.normal_alleleFrequencies_chr22.txt - echo stub > ${prefix}.purityploidy.txt - echo stub > ${prefix}.segments.txt - echo stub > ${prefix}.tumour.ASPCF.png - echo stub > ${prefix}.tumour.sunrise.png - echo stub > ${prefix}.tumour_alleleFrequencies_chr21.txt - echo stub > ${prefix}.tumour_alleleFrequencies_chr22.txt - echo stub > ${prefix}.tumour_normalBAF.txt - echo stub > ${prefix}.tumour_normalLogR.txt - echo stub > ${prefix}.tumour_tumourBAF.txt - echo stub > ${prefix}.tumour_tumourLogR.txt - - echo "${task.process}:" > versions.yml - echo ' alleleCounter: 4.3.0' >> versions.yml - echo ' ascat: 3.0.0' >> versions.yml + touch ${prefix}.after_correction.gc_rt.test.tumour.germline.png + touch ${prefix}.after_correction.gc_rt.test.tumour.tumour.png + touch ${prefix}.before_correction.test.tumour.germline.png + touch ${prefix}.before_correction.test.tumour.tumour.png + touch ${prefix}.cnvs.txt + touch ${prefix}.metrics.txt + touch ${prefix}.normal_alleleFrequencies_chr21.txt + touch ${prefix}.normal_alleleFrequencies_chr22.txt + touch ${prefix}.purityploidy.txt + touch ${prefix}.segments.txt + touch ${prefix}.tumour.ASPCF.png + touch ${prefix}.tumour.sunrise.png + touch ${prefix}.tumour_alleleFrequencies_chr21.txt + touch ${prefix}.tumour_alleleFrequencies_chr22.txt + touch ${prefix}.tumour_normalBAF.txt + touch ${prefix}.tumour_normalLogR.txt + touch ${prefix}.tumour_tumourBAF.txt + touch ${prefix}.tumour_tumourLogR.txt + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bioconductor-ascat: \$(Rscript -e "library(ASCAT); cat(as.character(packageVersion('ASCAT')))") + alleleCounter: \$(alleleCounter --version) + END_VERSIONS """ - - -} \ No newline at end of file +} diff --git a/modules/nf-core/ascat/meta.yml b/modules/nf-core/ascat/meta.yml index db7c9292..d69674ec 100644 --- a/modules/nf-core/ascat/meta.yml +++ b/modules/nf-core/ascat/meta.yml @@ -30,47 +30,57 @@ input: modifying chromosome notation in bam files please follow https://josephcckuo.wordpress.com/2016/11/17/modify-chromosome-notation-in-bam-file/. pattern: "*.{bam,cram}" + ontologies: [] - index_normal: type: file description: index for normal_bam/cram pattern: "*.{bai,crai}" + ontologies: [] - input_tumor: type: file description: BAM/CRAM file, must adhere to chr1, chr2, ...chrX notation pattern: "*.{bam,cram}" + ontologies: [] - index_tumor: type: file description: index for tumor_bam/cram pattern: "*.{bai,crai}" - - - allele_files: - type: file - description: allele files for ASCAT WGS. Can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS - - - loci_files: - type: file - description: loci files for ASCAT WGS. Loci files without chromosome notation - can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS - Make sure the chromosome notation matches the bam/cram input files. To add - the chromosome notation to loci files (hg19/hg38) if necessary, you can run - this command `if [[ $(samtools view | head -n1 | cut -f3)\" - == *\"chr\"* ]]; then for i in {1..22} X; do sed -i 's/^/chr/' G1000_loci_hg19_chr_${i}.txt; - done; fi` - - - bed_file: - type: file - description: Bed file for ASCAT WES (optional, but recommended for WES) - - - fasta: - type: file - description: Reference fasta file (optional) - - - gc_file: - type: file - description: GC correction file (optional) - Used to do logR correction of the - tumour sample(s) with genomic GC content - - - rt_file: - type: file - description: replication timing correction file (optional, provide only in combination - with gc_file) + ontologies: [] + - allele_files: + type: file + description: allele files for ASCAT WGS. Can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS + ontologies: [] + - loci_files: + type: file + description: loci files for ASCAT WGS. Loci files without chromosome notation + can be downloaded here https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS + Make sure the chromosome notation matches the bam/cram input files. To add the + chromosome notation to loci files (hg19/hg38) if necessary, you can run this + command `if [[ $(samtools view | head -n1 | cut -f3)\" == + *\"chr\"* ]]; then for i in {1..22} X; do sed -i 's/^/chr/' G1000_loci_hg19_chr_${i}.txt; + done; fi` + ontologies: [] + - bed_file: + type: file + description: Bed file for ASCAT WES (optional, but recommended for WES) + ontologies: [] + - fasta: + type: file + description: Reference fasta file (optional) + ontologies: [] + - gc_file: + type: file + description: GC correction file (optional) - Used to do logR correction of the + tumour sample(s) with genomic GC content + ontologies: [] + - rt_file: + type: file + description: replication timing correction file (optional, provide only in combination + with gc_file) + ontologies: [] output: - - allelefreqs: - - meta: + allelefreqs: + - - meta: type: map description: | Groovy Map containing sample information @@ -79,8 +89,9 @@ output: type: file description: Files containing allee frequencies per chromosome pattern: "*{alleleFrequencies_chr*.txt}" - - bafs: - - meta: + ontologies: [] + bafs: + - - meta: type: map description: | Groovy Map containing sample information @@ -88,8 +99,9 @@ output: - "*BAF.txt": type: file description: BAF file - - cnvs: - - meta: + ontologies: [] + cnvs: + - - meta: type: map description: | Groovy Map containing sample information @@ -97,8 +109,9 @@ output: - "*cnvs.txt": type: file description: CNV file - - logrs: - - meta: + ontologies: [] + logrs: + - - meta: type: map description: | Groovy Map containing sample information @@ -106,8 +119,9 @@ output: - "*LogR.txt": type: file description: LogR file - - metrics: - - meta: + ontologies: [] + metrics: + - - meta: type: map description: | Groovy Map containing sample information @@ -116,8 +130,9 @@ output: type: file description: File containing quality metrics pattern: "*.{metrics.txt}" - - png: - - meta: + ontologies: [] + png: + - - meta: type: map description: | Groovy Map containing sample information @@ -126,8 +141,9 @@ output: type: file description: ASCAT plots pattern: "*.{png}" - - purityploidy: - - meta: + ontologies: [] + purityploidy: + - - meta: type: map description: | Groovy Map containing sample information @@ -136,8 +152,9 @@ output: type: file description: File with purity and ploidy data pattern: "*.{purityploidy.txt}" - - segments: - - meta: + ontologies: [] + segments: + - - meta: type: map description: | Groovy Map containing sample information @@ -146,11 +163,14 @@ output: type: file description: File with segments data pattern: "*.{segments.txt}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML authors: - "@aasNGC" - "@lassefolkersen" diff --git a/modules/nf-core/ascat/tests/main.nf.test b/modules/nf-core/ascat/tests/main.nf.test new file mode 100644 index 00000000..527fbc26 --- /dev/null +++ b/modules/nf-core/ascat/tests/main.nf.test @@ -0,0 +1,340 @@ +nextflow_process { + + name "Test Process ASCAT" + script "../main.nf" + process "ASCAT" + + tag "modules" + tag "modules_nfcore" + tag "ascat" + config "./nextflow.config" + + test("human - bam - GC") { + when { + params { + module_args = [ + gender : 'XY', + genomeVersion : 'hg19', + minCounts : '1', + min_base_qual : '1', + min_map_qual : '1', + chrom_names : 'c("21")' + ] + } + process { + """ + input[0] = [ + [ id: 'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_alleles_hg38_chr21.txt', checkIfExists: true)] + input[2] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_loci_hg38_chr21.txt', checkIfExists: true)] + input[3] = [] + input[4] = [] + input[5] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/GC_G1000_hg38_21.txt', checkIfExists: true)] + input[6] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.allelefreqs, + process.out.bafs, + process.out.cnvs, + // Logrs Tumour has a float margin discrepancy in conda due to + // log and mean transformation + process.out.logrs.collect{it[1].collect{file(it).name}}, + process.out.metrics, + // This discrepancy affect the png generated + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } + ) + } + } + + test("human - bam - GC - additional_allelecounter") { + when { + params { + module_args = [ + gender : 'XY', + genomeVersion : 'hg19', + minCounts : '1', + min_base_qual : '1', + min_map_qual : '1', + chrom_names : 'c("21")', + additional_allelecounter_flags: '-f 0' + ] + } + process { + """ + input[0] = [ + [ id: 'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_alleles_hg38_chr21.txt', checkIfExists: true)] + input[2] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_loci_hg38_chr21.txt', checkIfExists: true)] + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.allelefreqs, + process.out.bafs, + process.out.cnvs, + // Logrs Tumour has a float margin discrepancy in conda due to + // log and mean transformation + process.out.logrs.collect{it[1].collect{file(it).name}}, + process.out.metrics, + // This discrepancy affect the png generated + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } + ) + } + } + + test("human - cram - GC - RT") { + + when { + params { + module_args = [ + gender : 'XY', + genomeVersion : 'hg19', + minCounts : '1', + min_base_qual : '1', + min_map_qual : '1', + chrom_names : 'c("21")' + ] + } + process { + """ + input[0] = [ + [ id: 'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.markduplicates.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.markduplicates.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.markduplicates.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.markduplicates.sorted.cram.crai', checkIfExists: true) + ] + input[1] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_alleles_hg38_chr21.txt', checkIfExists: true)] + input[2] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_loci_hg38_chr21.txt', checkIfExists: true)] + input[3] = [] + input[4] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true)] + input[5] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/GC_G1000_hg38_21.txt', checkIfExists: true)] + input[6] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/RT_G1000_hg38_21.txt', checkIfExists: true)] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.allelefreqs, + process.out.bafs, + process.out.cnvs, + // Logrs Tumour has a float margin discrepancy in conda due to + // log and mean transformation + process.out.logrs.collect{it[1].collect{file(it).name}}, + process.out.metrics, + // This discrepancy affect the png generated + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } + ) + } + } + + test("human - cram - GC - RT - additional_allelecounter") { + + when { + params { + module_args = [ + gender : 'XY', + genomeVersion : 'hg19', + minCounts : '1', + min_base_qual : '1', + min_map_qual : '1', + chrom_names : 'c("21")', + additional_allelecounter_flags: '-f 0' + ] + } + process { + """ + input[0] = [ + [ id: 'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.markduplicates.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.markduplicates.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.markduplicates.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.markduplicates.sorted.cram.crai', checkIfExists: true) + ] + input[1] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_alleles_hg38_chr21.txt', checkIfExists: true)] + input[2] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_loci_hg38_chr21.txt', checkIfExists: true)] + input[3] = [] + input[4] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true)] + input[5] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/GC_G1000_hg38_21.txt', checkIfExists: true)] + input[6] = [file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/RT_G1000_hg38_21.txt', checkIfExists: true)] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.allelefreqs, + process.out.bafs, + process.out.cnvs, + // Logrs Tumour has a float margin discrepancy in conda due to + // log and mean transformation + process.out.logrs.collect{it[1].collect{file(it).name}}, + process.out.metrics, + // This discrepancy affect the png generated + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } + ) + } + } + + test("human - bam - GC - folder inputs") { + when { + params { + module_args = [ + gender : 'XY', + genomeVersion : 'hg19', + minCounts : '1', + min_base_qual : '1', + min_map_qual : '1', + chrom_names : 'c("21")' + ] + allele_folder = "G1000_alleles_hg38" + loci_folder = "G1000_loci_hg38" + gc_folder = "GC_G1000_hg38_21" + rt_folder = "RT_G1000_hg38_21" + } + process { + """ + + file(params.allele_folder).mkdirs() + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_alleles_hg38_chr21.txt', checkIfExists: true) + .copyTo(params.allele_folder + '/G1000_alleles_hg38_chr21.txt') + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_alleles_hg38_chr22.txt', checkIfExists: true) + .copyTo(params.allele_folder + '/G1000_alleles_hg38_chr22.txt') + + file(params.loci_folder).mkdirs() + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_loci_hg38_chr21.txt', checkIfExists: true) + .copyTo(params.loci_folder + '/G1000_loci_hg38_chr21.txt') + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/G1000_loci_hg38_chr22.txt', checkIfExists: true) + .copyTo(params.loci_folder + '/G1000_loci_hg38_chr22.txt') + + file(params.gc_folder).mkdirs() + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/GC_G1000_hg38_21.txt', checkIfExists: true) + .copyTo(params.gc_folder + '/GC_G1000_hg38_21.txt') + + file(params.rt_folder).mkdirs() + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/ascat/RT_G1000_hg38_21.txt', checkIfExists: true) + .copyTo(params.rt_folder + '/RT_G1000_hg38_21.txt') + + input[0] = [ + [ id: 'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam.bai', checkIfExists: true) + ] + input[1] = file(params.allele_folder, checkIfExists: true) + input[2] = file(params.loci_folder, checkIfExists: true) + input[3] = [] + input[4] = [] + input[5] = file(params.gc_folder, checkIfExists: true) + input[6] = file(params.rt_folder, checkIfExists: true) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.allelefreqs, + process.out.bafs, + process.out.cnvs, + // Logrs Tumour has a float margin discrepancy in conda due to + // log and mean transformation + process.out.logrs.collect{it[1].collect{file(it).name}}, + process.out.metrics, + // This discrepancy affect the png generated + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } + ) + } + } + + test("human - bam - stub") { + + options "-stub" + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id: 'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + input[6] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/ascat/tests/main.nf.test.snap b/modules/nf-core/ascat/tests/main.nf.test.snap new file mode 100644 index 00000000..7db5d76d --- /dev/null +++ b/modules/nf-core/ascat/tests/main.nf.test.snap @@ -0,0 +1,677 @@ +{ + "human - bam - GC": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.normal_alleleFrequencies_chr21.txt:md5,627382ea8ab013d2fb3307a4f9abb058", + "test.tumour_alleleFrequencies_chr21.txt:md5,79000d7e2f57c3492204a19649d327b1" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalBAF.txt:md5,bee93180f7346edc1ead76f2ac150290", + "test.tumour_normalBAF_rawBAF.txt:md5,4c6e12d9e04ac14e115796a08c82a1a9", + "test.tumour_tumourBAF.txt:md5,33bab5381edd65675458e72a492c4ef1", + "test.tumour_tumourBAF_rawBAF.txt:md5,7bab22a530cb8294542a6bc6cace9ae5" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.cnvs.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + "test.tumour_normalLogR.txt", + "test.tumour_tumourLogR.txt" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.metrics.txt:md5,6b7f492c84c2ee3038c9f2856a87b496" + ] + ], + [ + [ + "test.after_correction_gc.test.tumour.germline.png", + "test.after_correction_gc.test.tumour.tumour.png", + "test.before_correction.test.tumour.germline.png", + "test.before_correction.test.tumour.tumour.png", + "test.tumour.ASPCF.png", + "test.tumour.sunrise.png" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.purityploidy.txt:md5,f1484c2b120834d3db8774ad02a038b9" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.segments.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + "versions.yml:md5,75598081a811afded7d7c1a0d08405ac" + ], + { + "ASCAT": { + "ascat": "3.2.0", + "alleleCounter": "4.3.0" + } + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-06-25T12:07:29.534085987" + }, + "human - bam - GC - folder inputs": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.normal_alleleFrequencies_chr21.txt:md5,627382ea8ab013d2fb3307a4f9abb058", + "test.tumour_alleleFrequencies_chr21.txt:md5,79000d7e2f57c3492204a19649d327b1" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalBAF.txt:md5,bee93180f7346edc1ead76f2ac150290", + "test.tumour_normalBAF_rawBAF.txt:md5,4c6e12d9e04ac14e115796a08c82a1a9", + "test.tumour_tumourBAF.txt:md5,33bab5381edd65675458e72a492c4ef1", + "test.tumour_tumourBAF_rawBAF.txt:md5,7bab22a530cb8294542a6bc6cace9ae5" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.cnvs.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + "test.tumour_normalLogR.txt", + "test.tumour_tumourLogR.txt" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.metrics.txt:md5,3502b78584e5251db0fcbd71ed134480" + ] + ], + [ + [ + "test.after_correction_gc_rt.test.tumour.germline.png", + "test.after_correction_gc_rt.test.tumour.tumour.png", + "test.before_correction.test.tumour.germline.png", + "test.before_correction.test.tumour.tumour.png", + "test.tumour.ASPCF.png", + "test.tumour.sunrise.png" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.purityploidy.txt:md5,f1484c2b120834d3db8774ad02a038b9" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.segments.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + "versions.yml:md5,75598081a811afded7d7c1a0d08405ac" + ], + { + "ASCAT": { + "ascat": "3.2.0", + "alleleCounter": "4.3.0" + } + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-06-25T12:18:54.510148361" + }, + "human - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.normal_alleleFrequencies_chr21.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.normal_alleleFrequencies_chr22.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_alleleFrequencies_chr21.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_alleleFrequencies_chr22.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalBAF.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_tumourBAF.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.cnvs.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalLogR.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_tumourLogR.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.after_correction.gc_rt.test.tumour.germline.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.after_correction.gc_rt.test.tumour.tumour.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.before_correction.test.tumour.germline.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.before_correction.test.tumour.tumour.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour.ASPCF.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour.sunrise.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.purityploidy.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.segments.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + "versions.yml:md5,5c8663bfecf62e5eb460f76ee167d410" + ], + "allelefreqs": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.normal_alleleFrequencies_chr21.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.normal_alleleFrequencies_chr22.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_alleleFrequencies_chr21.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_alleleFrequencies_chr22.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "bafs": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalBAF.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_tumourBAF.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "cnvs": [ + [ + { + "id": "test", + "single_end": false + }, + "test.cnvs.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "logrs": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalLogR.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour_tumourLogR.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "png": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.after_correction.gc_rt.test.tumour.germline.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.after_correction.gc_rt.test.tumour.tumour.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.before_correction.test.tumour.germline.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.before_correction.test.tumour.tumour.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour.ASPCF.png:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.tumour.sunrise.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "purityploidy": [ + [ + { + "id": "test", + "single_end": false + }, + "test.purityploidy.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "segments": [ + [ + { + "id": "test", + "single_end": false + }, + "test.segments.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,5c8663bfecf62e5eb460f76ee167d410" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-06-16T12:14:45.315601183" + }, + "human - cram - GC - RT - additional_allelecounter": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.normal_alleleFrequencies_chr21.txt:md5,627382ea8ab013d2fb3307a4f9abb058", + "test.tumour_alleleFrequencies_chr21.txt:md5,79000d7e2f57c3492204a19649d327b1" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalBAF.txt:md5,bee93180f7346edc1ead76f2ac150290", + "test.tumour_normalBAF_rawBAF.txt:md5,4c6e12d9e04ac14e115796a08c82a1a9", + "test.tumour_tumourBAF.txt:md5,33bab5381edd65675458e72a492c4ef1", + "test.tumour_tumourBAF_rawBAF.txt:md5,7bab22a530cb8294542a6bc6cace9ae5" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.cnvs.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + "test.tumour_normalLogR.txt", + "test.tumour_tumourLogR.txt" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.metrics.txt:md5,3502b78584e5251db0fcbd71ed134480" + ] + ], + [ + [ + "test.after_correction_gc_rt.test.tumour.germline.png", + "test.after_correction_gc_rt.test.tumour.tumour.png", + "test.before_correction.test.tumour.germline.png", + "test.before_correction.test.tumour.tumour.png", + "test.tumour.ASPCF.png", + "test.tumour.sunrise.png" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.purityploidy.txt:md5,f1484c2b120834d3db8774ad02a038b9" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.segments.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + "versions.yml:md5,75598081a811afded7d7c1a0d08405ac" + ], + { + "ASCAT": { + "ascat": "3.2.0", + "alleleCounter": "4.3.0" + } + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-06-20T12:46:05.832790403" + }, + "human - cram - GC - RT": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.normal_alleleFrequencies_chr21.txt:md5,627382ea8ab013d2fb3307a4f9abb058", + "test.tumour_alleleFrequencies_chr21.txt:md5,79000d7e2f57c3492204a19649d327b1" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalBAF.txt:md5,bee93180f7346edc1ead76f2ac150290", + "test.tumour_normalBAF_rawBAF.txt:md5,4c6e12d9e04ac14e115796a08c82a1a9", + "test.tumour_tumourBAF.txt:md5,33bab5381edd65675458e72a492c4ef1", + "test.tumour_tumourBAF_rawBAF.txt:md5,7bab22a530cb8294542a6bc6cace9ae5" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.cnvs.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + "test.tumour_normalLogR.txt", + "test.tumour_tumourLogR.txt" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.metrics.txt:md5,3502b78584e5251db0fcbd71ed134480" + ] + ], + [ + [ + "test.after_correction_gc_rt.test.tumour.germline.png", + "test.after_correction_gc_rt.test.tumour.tumour.png", + "test.before_correction.test.tumour.germline.png", + "test.before_correction.test.tumour.tumour.png", + "test.tumour.ASPCF.png", + "test.tumour.sunrise.png" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.purityploidy.txt:md5,f1484c2b120834d3db8774ad02a038b9" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.segments.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + "versions.yml:md5,75598081a811afded7d7c1a0d08405ac" + ], + { + "ASCAT": { + "ascat": "3.2.0", + "alleleCounter": "4.3.0" + } + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-06-16T15:51:14.807808184" + }, + "human - bam - GC - additional_allelecounter": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.normal_alleleFrequencies_chr21.txt:md5,627382ea8ab013d2fb3307a4f9abb058", + "test.tumour_alleleFrequencies_chr21.txt:md5,79000d7e2f57c3492204a19649d327b1" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.tumour_normalBAF.txt:md5,bee93180f7346edc1ead76f2ac150290", + "test.tumour_normalBAF_rawBAF.txt:md5,4c6e12d9e04ac14e115796a08c82a1a9", + "test.tumour_tumourBAF.txt:md5,33bab5381edd65675458e72a492c4ef1", + "test.tumour_tumourBAF_rawBAF.txt:md5,7bab22a530cb8294542a6bc6cace9ae5" + ] + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.cnvs.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + [ + "test.tumour_normalLogR.txt", + "test.tumour_tumourLogR.txt" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.metrics.txt:md5,6e473be3fb2226d493e48a73df2f4501" + ] + ], + [ + [ + "test.before_correction.test.tumour.germline.png", + "test.before_correction.test.tumour.tumour.png", + "test.tumour.ASPCF.png", + "test.tumour.sunrise.png" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.purityploidy.txt:md5,f1484c2b120834d3db8774ad02a038b9" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test.segments.txt:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + [ + "versions.yml:md5,75598081a811afded7d7c1a0d08405ac" + ], + { + "ASCAT": { + "ascat": "3.2.0", + "alleleCounter": "4.3.0" + } + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.3" + }, + "timestamp": "2025-06-20T12:45:23.273839886" + } +} \ No newline at end of file diff --git a/modules/nf-core/ascat/tests/nextflow.config b/modules/nf-core/ascat/tests/nextflow.config new file mode 100644 index 00000000..8e4f96a1 --- /dev/null +++ b/modules/nf-core/ascat/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: "ASCAT" { + ext.args = params.module_args + } +} From 0b57918c8663b1c350ac7bd3eeb372dce6fae022 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 14:31:44 +0100 Subject: [PATCH 036/183] our own ascat version with new diff file --- modules.json | 115 ++++++-- modules/nf-core/ascat/ascat.diff | 454 ++++++++++++++++++++++++------- modules/nf-core/ascat/main.nf | 357 ++++++++++++------------ 3 files changed, 607 insertions(+), 319 deletions(-) diff --git a/modules.json b/modules.json index a2a488e3..dd2694d6 100644 --- a/modules.json +++ b/modules.json @@ -8,129 +8,178 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": ["modules", "vcf_gather_bcftools"] + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["vcf_gather_bcftools"], + "installed_by": [ + "vcf_gather_bcftools" + ], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -139,25 +188,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index 36f9216e..7f939017 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -3,98 +3,247 @@ Changes in component 'nf-core/ascat' Changes in 'ascat/main.nf': --- modules/nf-core/ascat/main.nf +++ modules/nf-core/ascat/main.nf -@@ -4,11 +4,12 @@ +@@ -1,211 +1,189 @@ + process ASCAT { +- tag "${meta.id}" ++ 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/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0': -- 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:ba3e6d2157eac2d38d22e62ec87675e12adb1010-0' }" -+ 'https://depot.galaxyproject.org/singularity/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0': -+ 'biocontainers/mulled-v2-c278c7398beb73294d78639a864352abef2931ce:03f4a075e359bb32a613b098d13dba7b4c8c967f-0' }" +- container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container +- ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4c/4cf02c7911ee5e974ce7db978810770efbd8d872ff5ab3462d2a11bcf022fab5/data' +- : 'community.wave.seqera.io/library/ascat_cancerit-allelecount:c3e8749fa4af0e99'}" ++ container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? ++ 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4c/4cf02c7911ee5e974ce7db978810770efbd8d872ff5ab3462d2a11bcf022fab5/data': ++ 'community.wave.seqera.io/library/ascat_cancerit-allelecount:c3e8749fa4af0e99' }" input: tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) +- path allele_files +- path loci_files +- path bed_file +- path fasta +- path gc_file +- path rt_file + val(genomeVersion) - path(allele_files) - path(loci_files) - path(bed_file) // optional -@@ -23,8 +24,10 @@ - tuple val(meta), path("*LogR.txt"), emit: logrs - tuple val(meta), path("*metrics.txt"), emit: metrics - tuple val(meta), path("*png"), emit: png ++ path(allele_files) ++ path(loci_files) ++ path(bed_file) // optional ++ path(fasta) // optional ++ path(gc_file) // optional ++ path(rt_file) // optional + + output: +- tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs +- tuple val(meta), path("*BAF.txt"), emit: bafs +- tuple val(meta), path("*cnvs.txt"), emit: cnvs +- tuple val(meta), path("*LogR.txt"), emit: logrs +- tuple val(meta), path("*metrics.txt"), emit: metrics +- tuple val(meta), path("*png"), emit: png +- tuple val(meta), path("*purityploidy.txt"), emit: purityploidy +- tuple val(meta), path("*segments.txt"), emit: segments +- path "versions.yml", emit: versions ++ tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs ++ tuple val(meta), path("*BAF.txt"), emit: bafs ++ tuple val(meta), path("*cnvs.txt"), emit: cnvs ++ tuple val(meta), path("*LogR.txt"), emit: logrs ++ tuple val(meta), path("*metrics.txt"), emit: metrics ++ tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true - tuple val(meta), path("*purityploidy.txt"), emit: purityploidy - tuple val(meta), path("*segments.txt"), emit: segments ++ tuple val(meta), path("*purityploidy.txt"), emit: purityploidy ++ tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, optional: true - path "versions.yml", emit: versions ++ path "versions.yml", emit: versions when: -@@ -34,11 +37,12 @@ - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def gender = args.gender ? "$args.gender" : "NULL" -- def genomeVersion = args.genomeVersion ? "$args.genomeVersion" : "NULL" - def purity = args.purity ? "$args.purity" : "NULL" - def ploidy = args.ploidy ? "$args.ploidy" : "NULL" -+ def penalty = args.penalty ? "$args.penalty" : "NULL" - def gc_input = gc_file ? "$gc_file" : "NULL" - def rt_input = rt_file ? "$rt_file" : "NULL" -+ def pdf_plots = args.pdf_plots ? "$args.pdf_plots" : "NULL" + task.ext.when == null || task.ext.when - def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" - def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" -@@ -48,7 +52,12 @@ - def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" - def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" - def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" + script: +- def args = task.ext.args ?: '' +- def prefix = task.ext.prefix ?: "${meta.id}" +- +- def gender = args.gender ? "${args.gender}" : "NULL" +- def genomeVersion = args.genomeVersion ? "${args.genomeVersion}" : "NULL" +- def purity = args.purity ? "${args.purity}" : "NULL" +- def ploidy = args.ploidy ? "${args.ploidy}" : "NULL" +- def gc_input = gc_file ? "${gc_file}" : "NULL" +- def rt_input = rt_file ? "${rt_file}" : "NULL" +- +- def minCounts_arg = args.minCounts ? ", minCounts = ${args.minCounts}" : "" +- def bed_file_arg = bed_file ? ", BED_file = '${bed_file}'" : "" +- def chrom_names_arg = args.chrom_names ? ", chrom_names = ${args.chrom_names}" : "" +- def min_base_qual_arg = args.min_base_qual ? ", min_base_qual = ${args.min_base_qual}" : "" +- def min_map_qual_arg = args.min_map_qual ? ", min_map_qual = ${args.min_map_qual}" : "" +- def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ", skip_allele_counting_tumour = ${args.skip_allele_counting_tumour}" : "" +- def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ", skip_allele_counting_normal = ${args.skip_allele_counting_normal}" : "" +- +- if (args.additional_allelecounter_flags && fasta) { +- additional_allelecounter_arg = ", additional_allelecounter_flags = \"${args.additional_allelecounter_flags} -r ${fasta}\" " +- } +- else if (args.additional_allelecounter_flags) { +- additional_allelecounter_arg = ", additional_allelecounter_flags = \"${args.additional_allelecounter_flags}\" " +- } +- else if (fasta) { +- additional_allelecounter_arg = ", additional_allelecounter_flags = '-r \"${fasta}\"'" +- } +- else { +- additional_allelecounter_arg = "" +- } - ++ def args = task.ext.args ?: '' ++ def prefix = task.ext.prefix ?: "${meta.id}" ++ def gender = args.gender ? "$args.gender" : "NULL" ++ def purity = args.purity ? "$args.purity" : "NULL" ++ def ploidy = args.ploidy ? "$args.ploidy" : "NULL" ++ def penalty = args.penalty ? "$args.penalty" : "NULL" ++ def gc_input = gc_file ? "$gc_file" : "NULL" ++ def rt_input = rt_file ? "$rt_file" : "NULL" ++ ++ def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" ++ def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" ++ def chrom_names_arg = args.chrom_names ? ",chrom_names = $args.chrom_names" : "" ++ def min_base_qual_arg = args.min_base_qual ? ",min_base_qual = $args.min_base_qual" : "" ++ def min_map_qual_arg = args.min_map_qual ? ",min_map_qual = $args.min_map_qual" : "" ++ def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" ++ def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" ++ def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" + + def normal_exists = input_normal ? 'TRUE' : 'FALSE' + def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" + def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" + def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" -+ def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" ++ def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ #!/usr/bin/env Rscript library(RColorBrewer) -@@ -65,21 +74,23 @@ - #prepare from BAM files + library(ASCAT) + options(bitmapType='cairo') + +- if(dir.exists("${allele_files}")) { +- # expected production use of a directory +- allele_path = normalizePath("${allele_files}") +- allele_prefix = paste0(allele_path, "/", "${allele_files}", "_chr") +- } else if(file.exists("${allele_files}")) { +- # expected testing use of a single file +- allele_path = basename(normalizePath("${allele_files}")) +- allele_prefix = sub('_chr[0-9]+\\\\.txt\$', "_chr", allele_path) +- } else { +- stop("The specified allele files do not exist.") +- } +- +- if(length(Sys.glob(paste0(allele_prefix,"*")) ) == 0) { +- stop(paste("No allele files found matching", allele_prefix)) +- } +- +- if(dir.exists("${loci_files}")) { +- # expected production use of a directory +- loci_path = normalizePath("${loci_files}") +- loci_prefix = paste0(loci_path, "/", "${loci_files}", "_chr") +- } else if(file.exists("${loci_files}")) { +- # expected testing use of a single file +- loci_path = basename(normalizePath("${loci_files}")) +- loci_prefix = sub('_chr[0-9]+\\\\.txt\$', "_chr", loci_path) +- } else { +- stop("The specified loci files do not exist.") +- } +- +- if(length(Sys.glob(paste0(loci_prefix,"*")) ) == 0) { +- stop(paste("No loci files found matching", loci_prefix)) +- } +- +- # Prepare from BAM files ++ #build prefixes: ++ allele_path = normalizePath("$allele_files") ++ allele_prefix = paste0(allele_path, "/", "$allele_files", "_chr") ++ ++ loci_path = normalizePath("$loci_files") ++ loci_prefix = paste0(loci_path, "/", "$loci_files", "_chr") ++ ++ #prepare from BAM files ascat.prepareHTS( - tumourseqfile = "$input_tumor", -- normalseqfile = "$input_normal", - tumourname = paste0("$prefix", ".tumour"), -- normalname = paste0("$prefix", ".normal"), +- tumourseqfile = "${input_tumor}", +- normalseqfile = "${input_normal}", +- tumourname = paste0("${prefix}", ".tumour"), +- normalname = paste0("${prefix}", ".normal"), ++ tumourseqfile = "$input_tumor", ++ tumourname = paste0("$prefix", ".tumour"), allelecounter_exe = "alleleCounter", alleles.prefix = allele_prefix, loci.prefix = loci_prefix, - gender = "$gender", - genomeVersion = "$genomeVersion", - nthreads = $task.cpus +- gender = "${gender}", +- genomeVersion = "${genomeVersion}", +- nthreads = ${task.cpus} +- ${minCounts_arg} +- ${bed_file_arg} +- ${chrom_names_arg} +- ${min_base_qual_arg} +- ${min_map_qual_arg} +- ${skip_allele_counting_tumour_arg} +- ${skip_allele_counting_normal_arg} +- ${additional_allelecounter_arg} +- , seed = 42 ++ gender = "$gender", ++ genomeVersion = "$genomeVersion", ++ nthreads = $task.cpus + $normal_bam + $normal_name - $minCounts_arg - $bed_file_arg - $chrom_names_arg - $min_base_qual_arg - $min_map_qual_arg ++ $minCounts_arg ++ $bed_file_arg ++ $chrom_names_arg ++ $min_base_qual_arg ++ $min_map_qual_arg + $longread_bins - $fasta_arg ++ $fasta_arg + $allele_counter_flags - $skip_allele_counting_tumour_arg - $skip_allele_counting_normal_arg, - seed = 42 -@@ -87,37 +98,55 @@ ++ $skip_allele_counting_tumour_arg ++ $skip_allele_counting_normal_arg, ++ seed = 42 + ) - - #Load the data +- # Load the data - ascat.bc = ascat.loadData( -- Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), -- Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), -- Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), -- Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), -- genomeVersion = "$genomeVersion", -- gender = "$gender" +- Tumor_LogR_file = paste0("${prefix}", ".tumour_tumourLogR.txt"), +- Tumor_BAF_file = paste0("${prefix}", ".tumour_tumourBAF.txt"), +- Germline_LogR_file = paste0("${prefix}", ".tumour_normalLogR.txt"), +- Germline_BAF_file = paste0("${prefix}", ".tumour_normalBAF.txt"), +- genomeVersion = "${genomeVersion}", +- gender = "${gender}" - ) +- +- # Plot the raw data +- ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".before_correction.")) +- +- # Optional LogRCorrection +- if("${gc_input}" != "NULL") { +- +- if(dir.exists("${gc_input}")) { +- # sarek production use of an unzipped folder containing one file +- gc_input = list.files("${gc_input}", recursive = TRUE, full.names = TRUE) +- if(length(gc_input) != 1 | !file.exists(gc_input)) { +- stop("A single gc_input should be provided!") +- } +- } else if(file.exists("${gc_input}")) { +- gc_input = normalizePath("${gc_input}") +- } else { +- stop("gc_input must be a file or folder containing one file") +- } +- +- if("${rt_input}" != "NULL"){ +- +- if(dir.exists("${rt_input}")) { +- # sarek production use of an unzipped folder containing one file +- rt_input = list.files("${rt_input}", recursive = TRUE, full.names = TRUE) +- if(length(rt_input) != 1 | !file.exists(rt_input)) { +- stop("A single rt_input should be provided!") +- } +- } else if(file.exists("${rt_input}")) { +- rt_input = normalizePath("${rt_input}") +- } else { +- stop("rt_input must be a file or folder containing one file") +- } +- ++ ++ #Load the data + if($normal_exists) { + print("normal exists") + ascat.bc = ascat.loadData( @@ -117,62 +266,77 @@ Changes in 'ascat/main.nf': + } + print("printing ascat.bc") + print(ascat.bc) - - #Plot the raw data - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) - - # optional LogRCorrection - if("$gc_input" != "NULL") { -- gc_input = paste0(normalizePath("$gc_input"), "/", "$gc_input", ".txt") ++ ++ #Plot the raw data ++ ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) ++ ++ # optional LogRCorrection ++ if("$gc_input" != "NULL") { + gc_input = paste0(normalizePath("$gc_input")) - - if("$rt_input" != "NULL"){ -- rt_input = paste0(normalizePath("$rt_input"), "/", "$rt_input", ".txt") ++ ++ if("$rt_input" != "NULL"){ + rt_input = paste0(normalizePath("$rt_input")) ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) - #Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) +- # Plot raw data after correction +- ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".after_correction_gc_rt.")) ++ #Plot raw data after correction ++ ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) } else { -- ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = $rt_input) +- ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = ${rt_input}) +- # Plot raw data after correction +- ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".after_correction_gc.")) + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) - #Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) ++ #Plot raw data after correction ++ ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) } } - #Segment the data +- # Segment the data - ascat.bc = ascat.aspcf(ascat.bc, seed=42) +- +- # Plot the segmented data ++ #Segment the data + if($normal_exists) { + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) + } else { + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) + } - - #Plot the segmented data ++ ++ #Plot the segmented data ascat.plotSegmentedData(ascat.bc) -@@ -125,13 +154,13 @@ - #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers - #If psi and rho are manually set: - if (!is.null($purity) && !is.null($ploidy)){ -- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) -+ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = "$pdf_plots") - } else if(!is.null($purity) && is.null($ploidy)){ -- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) -+ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = "$pdf_plots") - } else if(!is.null($ploidy) && is.null($purity)){ -- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) -+ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = "$pdf_plots") + +- # Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, +- # and discrete copy numbers +- # If psi and rho are manually set: +- if (!is.null(${purity}) && !is.null(${ploidy})){ +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=${purity}, psi_manual=${ploidy}) +- } else if(!is.null(${purity}) && is.null(${ploidy})){ +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=${purity}) +- } else if(!is.null(${ploidy}) && is.null(${purity})){ +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=${ploidy}) ++ #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers ++ #If psi and rho are manually set: ++ if (!is.null($purity) && !is.null($ploidy)){ ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) ++ } else if(!is.null($purity) && is.null($ploidy)){ ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) ++ } else if(!is.null($ploidy) && is.null($purity)){ ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) } else { -- ascat.output <- ascat.runAscat(ascat.bc, gamma=1) -+ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = "$pdf_plots") + ascat.output <- ascat.runAscat(ascat.bc, gamma=1) } - #Extract metrics from ASCAT profiles -@@ -139,6 +168,17 @@ +- # Extract metrics from ASCAT profiles ++ #Extract metrics from ASCAT profiles + QC = ascat.metrics(ascat.bc,ascat.output) - #Write out segmented regions (including regions with one copy of each allele) - write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) +- # Write out segmented regions (including regions with one copy of each allele) +- write.table(ascat.output[["segments"]], file=paste0("${prefix}", ".segments.txt"), sep="\t", quote=F, row.names=F) +- +- # Write out CNVs in bed format ++ #Write out segmented regions (including regions with one copy of each allele) ++ write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) + + #Write out raw segmented regions (including regions with one copy of each allele) + tryCatch({ # In case segments_raw is not selected @@ -184,14 +348,102 @@ Changes in 'ascat/main.nf': + }, error = function(e) { + message("Error in writing segments_raw: ", conditionMessage(e)) + }) - - #Write out CNVs in bed format ++ ++ #Write out CNVs in bed format cnvs=ascat.output[["segments"]][2:6] -@@ -197,4 +237,4 @@ +- write.table(cnvs, file=paste0("${prefix}",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) +- +- # Write out purity and ploidy info ++ write.table(cnvs, file=paste0("$prefix",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) ++ ++ #Write out purity and ploidy info + summary <- tryCatch({ + matrix(c(ascat.output[["aberrantcellfraction"]], ascat.output[["ploidy"]]), ncol=2, byrow=TRUE)}, error = function(err) { + # error handler picks up where error was generated +@@ -214,46 +192,47 @@ + } + ) + colnames(summary) <- c("AberrantCellFraction","Ploidy") +- write.table(summary, file=paste0("${prefix}",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) +- +- write.table(QC, file=paste0("${prefix}", ".metrics.txt"), sep="\t", quote=F, row.names=F) +- +- # Version export ++ write.table(summary, file=paste0("$prefix",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) ++ ++ write.table(QC, file=paste0("$prefix", ".metrics.txt"), sep="\t", quote=F, row.names=F) ++ ++ # version export + f <- file("versions.yml","w") + alleleCounter_version = system(paste("alleleCounter --version"), intern = T) +- ascat_version = as.character(packageVersion('ASCAT')) +- writeLines(paste0('"', "${task.process}", '"', ":"), f) ++ ascat_version = sessionInfo()\$otherPkgs\$ASCAT\$Version ++ writeLines(paste0('"', "$task.process", '"', ":"), f) ++ writeLines(paste(" alleleCounter:", alleleCounter_version), f) + writeLines(paste(" ascat:", ascat_version), f) +- writeLines(paste(" alleleCounter:", alleleCounter_version), f) + close(f) ++ """ - + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ +- touch ${prefix}.after_correction.gc_rt.test.tumour.germline.png +- touch ${prefix}.after_correction.gc_rt.test.tumour.tumour.png +- touch ${prefix}.before_correction.test.tumour.germline.png +- touch ${prefix}.before_correction.test.tumour.tumour.png +- touch ${prefix}.cnvs.txt +- touch ${prefix}.metrics.txt +- touch ${prefix}.normal_alleleFrequencies_chr21.txt +- touch ${prefix}.normal_alleleFrequencies_chr22.txt +- touch ${prefix}.purityploidy.txt +- touch ${prefix}.segments.txt +- touch ${prefix}.tumour.ASPCF.png +- touch ${prefix}.tumour.sunrise.png +- touch ${prefix}.tumour_alleleFrequencies_chr21.txt +- touch ${prefix}.tumour_alleleFrequencies_chr22.txt +- touch ${prefix}.tumour_normalBAF.txt +- touch ${prefix}.tumour_normalLogR.txt +- touch ${prefix}.tumour_tumourBAF.txt +- touch ${prefix}.tumour_tumourLogR.txt +- +- cat <<-END_VERSIONS > versions.yml +- "${task.process}": +- bioconductor-ascat: \$(Rscript -e "library(ASCAT); cat(as.character(packageVersion('ASCAT')))") +- alleleCounter: \$(alleleCounter --version) +- END_VERSIONS +- """ -} ++ echo stub > ${prefix}.after_correction.gc_rt.test.tumour.germline.png ++ echo stub > ${prefix}.after_correction.gc_rt.test.tumour.tumour.png ++ echo stub > ${prefix}.before_correction.test.tumour.germline.png ++ echo stub > ${prefix}.before_correction.test.tumour.tumour.png ++ echo stub > ${prefix}.cnvs.txt ++ echo stub > ${prefix}.metrics.txt ++ echo stub > ${prefix}.normal_alleleFrequencies_chr21.txt ++ echo stub > ${prefix}.normal_alleleFrequencies_chr22.txt ++ echo stub > ${prefix}.purityploidy.txt ++ echo stub > ${prefix}.segments.txt ++ echo stub > ${prefix}.tumour.ASPCF.png ++ echo stub > ${prefix}.tumour.sunrise.png ++ echo stub > ${prefix}.tumour_alleleFrequencies_chr21.txt ++ echo stub > ${prefix}.tumour_alleleFrequencies_chr22.txt ++ echo stub > ${prefix}.tumour_normalBAF.txt ++ echo stub > ${prefix}.tumour_normalLogR.txt ++ echo stub > ${prefix}.tumour_tumourBAF.txt ++ echo stub > ${prefix}.tumour_tumourLogR.txt ++ ++ echo "${task.process}:" > versions.yml ++ echo ' alleleCounter: 4.3.0' >> versions.yml ++ echo ' ascat: 3.0.0' >> versions.yml ++ ++ """ ++ +} 'modules/nf-core/ascat/environment.yml' is unchanged +'modules/nf-core/ascat/tests/main.nf.test' is unchanged +'modules/nf-core/ascat/tests/main.nf.test.snap' is unchanged +'modules/nf-core/ascat/tests/nextflow.config' is unchanged ************************************************************ diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 4d7b2210..e642df58 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -1,211 +1,189 @@ process ASCAT { - tag "${meta.id}" + tag "$meta.id" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4c/4cf02c7911ee5e974ce7db978810770efbd8d872ff5ab3462d2a11bcf022fab5/data' - : 'community.wave.seqera.io/library/ascat_cancerit-allelecount:c3e8749fa4af0e99'}" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4c/4cf02c7911ee5e974ce7db978810770efbd8d872ff5ab3462d2a11bcf022fab5/data': + 'community.wave.seqera.io/library/ascat_cancerit-allelecount:c3e8749fa4af0e99' }" input: tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) - path allele_files - path loci_files - path bed_file - path fasta - path gc_file - path rt_file + val(genomeVersion) + path(allele_files) + path(loci_files) + path(bed_file) // optional + path(fasta) // optional + path(gc_file) // optional + path(rt_file) // optional output: - tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs - tuple val(meta), path("*BAF.txt"), emit: bafs - tuple val(meta), path("*cnvs.txt"), emit: cnvs - tuple val(meta), path("*LogR.txt"), emit: logrs - tuple val(meta), path("*metrics.txt"), emit: metrics - tuple val(meta), path("*png"), emit: png - tuple val(meta), path("*purityploidy.txt"), emit: purityploidy - tuple val(meta), path("*segments.txt"), emit: segments - path "versions.yml", emit: versions + tuple val(meta), path("*alleleFrequencies_chr*.txt"), emit: allelefreqs + tuple val(meta), path("*BAF.txt"), emit: bafs + tuple val(meta), path("*cnvs.txt"), emit: cnvs + tuple val(meta), path("*LogR.txt"), emit: logrs + tuple val(meta), path("*metrics.txt"), emit: metrics + tuple val(meta), path("*png"), emit: png + tuple val(meta), path("*pdf"), emit: pdf, optional: true + tuple val(meta), path("*purityploidy.txt"), emit: purityploidy + tuple val(meta), path("*segments.txt"), emit: segments + tuple val(meta), path("*segments_raw.txt"), emit: segments_raw, 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 gender = args.gender ? "${args.gender}" : "NULL" - def genomeVersion = args.genomeVersion ? "${args.genomeVersion}" : "NULL" - def purity = args.purity ? "${args.purity}" : "NULL" - def ploidy = args.ploidy ? "${args.ploidy}" : "NULL" - def gc_input = gc_file ? "${gc_file}" : "NULL" - def rt_input = rt_file ? "${rt_file}" : "NULL" - - def minCounts_arg = args.minCounts ? ", minCounts = ${args.minCounts}" : "" - def bed_file_arg = bed_file ? ", BED_file = '${bed_file}'" : "" - def chrom_names_arg = args.chrom_names ? ", chrom_names = ${args.chrom_names}" : "" - def min_base_qual_arg = args.min_base_qual ? ", min_base_qual = ${args.min_base_qual}" : "" - def min_map_qual_arg = args.min_map_qual ? ", min_map_qual = ${args.min_map_qual}" : "" - def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ", skip_allele_counting_tumour = ${args.skip_allele_counting_tumour}" : "" - def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ", skip_allele_counting_normal = ${args.skip_allele_counting_normal}" : "" - - if (args.additional_allelecounter_flags && fasta) { - additional_allelecounter_arg = ", additional_allelecounter_flags = \"${args.additional_allelecounter_flags} -r ${fasta}\" " - } - else if (args.additional_allelecounter_flags) { - additional_allelecounter_arg = ", additional_allelecounter_flags = \"${args.additional_allelecounter_flags}\" " - } - else if (fasta) { - additional_allelecounter_arg = ", additional_allelecounter_flags = '-r \"${fasta}\"'" - } - else { - additional_allelecounter_arg = "" - } - + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def gender = args.gender ? "$args.gender" : "NULL" + def purity = args.purity ? "$args.purity" : "NULL" + def ploidy = args.ploidy ? "$args.ploidy" : "NULL" + def penalty = args.penalty ? "$args.penalty" : "NULL" + def gc_input = gc_file ? "$gc_file" : "NULL" + def rt_input = rt_file ? "$rt_file" : "NULL" + + def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" + def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" + def chrom_names_arg = args.chrom_names ? ",chrom_names = $args.chrom_names" : "" + def min_base_qual_arg = args.min_base_qual ? ",min_base_qual = $args.min_base_qual" : "" + def min_map_qual_arg = args.min_map_qual ? ",min_map_qual = $args.min_map_qual" : "" + def fasta_arg = fasta ? ",ref.fasta = '$fasta'" : "" + def skip_allele_counting_tumour_arg = args.skip_allele_counting_tumour ? ",skip_allele_counting_tumour = $args.skip_allele_counting_tumour" : "" + def skip_allele_counting_normal_arg = args.skip_allele_counting_normal ? ",skip_allele_counting_normal = $args.skip_allele_counting_normal" : "" + + def normal_exists = input_normal ? 'TRUE' : 'FALSE' + def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" + def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" + def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" + def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ #!/usr/bin/env Rscript library(RColorBrewer) library(ASCAT) options(bitmapType='cairo') - if(dir.exists("${allele_files}")) { - # expected production use of a directory - allele_path = normalizePath("${allele_files}") - allele_prefix = paste0(allele_path, "/", "${allele_files}", "_chr") - } else if(file.exists("${allele_files}")) { - # expected testing use of a single file - allele_path = basename(normalizePath("${allele_files}")) - allele_prefix = sub('_chr[0-9]+\\\\.txt\$', "_chr", allele_path) - } else { - stop("The specified allele files do not exist.") - } - - if(length(Sys.glob(paste0(allele_prefix,"*")) ) == 0) { - stop(paste("No allele files found matching", allele_prefix)) - } - - if(dir.exists("${loci_files}")) { - # expected production use of a directory - loci_path = normalizePath("${loci_files}") - loci_prefix = paste0(loci_path, "/", "${loci_files}", "_chr") - } else if(file.exists("${loci_files}")) { - # expected testing use of a single file - loci_path = basename(normalizePath("${loci_files}")) - loci_prefix = sub('_chr[0-9]+\\\\.txt\$', "_chr", loci_path) - } else { - stop("The specified loci files do not exist.") - } + #build prefixes: + allele_path = normalizePath("$allele_files") + allele_prefix = paste0(allele_path, "/", "$allele_files", "_chr") - if(length(Sys.glob(paste0(loci_prefix,"*")) ) == 0) { - stop(paste("No loci files found matching", loci_prefix)) - } + loci_path = normalizePath("$loci_files") + loci_prefix = paste0(loci_path, "/", "$loci_files", "_chr") - # Prepare from BAM files + #prepare from BAM files ascat.prepareHTS( - tumourseqfile = "${input_tumor}", - normalseqfile = "${input_normal}", - tumourname = paste0("${prefix}", ".tumour"), - normalname = paste0("${prefix}", ".normal"), + tumourseqfile = "$input_tumor", + tumourname = paste0("$prefix", ".tumour"), allelecounter_exe = "alleleCounter", alleles.prefix = allele_prefix, loci.prefix = loci_prefix, - gender = "${gender}", - genomeVersion = "${genomeVersion}", - nthreads = ${task.cpus} - ${minCounts_arg} - ${bed_file_arg} - ${chrom_names_arg} - ${min_base_qual_arg} - ${min_map_qual_arg} - ${skip_allele_counting_tumour_arg} - ${skip_allele_counting_normal_arg} - ${additional_allelecounter_arg} - , seed = 42 - ) - - # Load the data - ascat.bc = ascat.loadData( - Tumor_LogR_file = paste0("${prefix}", ".tumour_tumourLogR.txt"), - Tumor_BAF_file = paste0("${prefix}", ".tumour_tumourBAF.txt"), - Germline_LogR_file = paste0("${prefix}", ".tumour_normalLogR.txt"), - Germline_BAF_file = paste0("${prefix}", ".tumour_normalBAF.txt"), - genomeVersion = "${genomeVersion}", - gender = "${gender}" + gender = "$gender", + genomeVersion = "$genomeVersion", + nthreads = $task.cpus + $normal_bam + $normal_name + $minCounts_arg + $bed_file_arg + $chrom_names_arg + $min_base_qual_arg + $min_map_qual_arg + $longread_bins + $fasta_arg + $allele_counter_flags + $skip_allele_counting_tumour_arg + $skip_allele_counting_normal_arg, + seed = 42 ) - # Plot the raw data - ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".before_correction.")) - # Optional LogRCorrection - if("${gc_input}" != "NULL") { - - if(dir.exists("${gc_input}")) { - # sarek production use of an unzipped folder containing one file - gc_input = list.files("${gc_input}", recursive = TRUE, full.names = TRUE) - if(length(gc_input) != 1 | !file.exists(gc_input)) { - stop("A single gc_input should be provided!") - } - } else if(file.exists("${gc_input}")) { - gc_input = normalizePath("${gc_input}") - } else { - stop("gc_input must be a file or folder containing one file") - } + #Load the data + if($normal_exists) { + print("normal exists") + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), + Germline_LogR_file = paste0("$prefix", ".tumour_normalLogR.txt"), + Germline_BAF_file = paste0("$prefix", ".tumour_normalBAF.txt"), + genomeVersion = "$genomeVersion", + gender = "$gender" + ) + } else { + print("normal does not exist") + ascat.bc = ascat.loadData( + Tumor_LogR_file = paste0("$prefix", ".tumour_tumourLogR.txt"), + Tumor_BAF_file = paste0("$prefix", ".tumour_tumourBAF.txt"), + genomeVersion = "$genomeVersion", + gender = "$gender") + gg = ascat.predictGermlineGenotypes(ascat.bc, platform = "WGS_hg38_50X") + + } + print("printing ascat.bc") + print(ascat.bc) - if("${rt_input}" != "NULL"){ + #Plot the raw data + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".before_correction.")) - if(dir.exists("${rt_input}")) { - # sarek production use of an unzipped folder containing one file - rt_input = list.files("${rt_input}", recursive = TRUE, full.names = TRUE) - if(length(rt_input) != 1 | !file.exists(rt_input)) { - stop("A single rt_input should be provided!") - } - } else if(file.exists("${rt_input}")) { - rt_input = normalizePath("${rt_input}") - } else { - stop("rt_input must be a file or folder containing one file") - } + # optional LogRCorrection + if("$gc_input" != "NULL") { + gc_input = paste0(normalizePath("$gc_input")) + if("$rt_input" != "NULL"){ + rt_input = paste0(normalizePath("$rt_input")) ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = rt_input) - # Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".after_correction_gc_rt.")) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc_rt.")) } else { - ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input, replictimingfile = ${rt_input}) - # Plot raw data after correction - ascat.plotRawData(ascat.bc, img.prefix = paste0("${prefix}", ".after_correction_gc.")) + ascat.bc = ascat.correctLogR(ascat.bc, GCcontentfile = gc_input) + #Plot raw data after correction + ascat.plotRawData(ascat.bc, img.prefix = paste0("$prefix", ".after_correction_gc.")) } } - # Segment the data - ascat.bc = ascat.aspcf(ascat.bc, seed=42) + #Segment the data + if($normal_exists) { + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty) + } else { + ascat.bc = ascat.aspcf(ascat.bc, seed=42, penalty = $penalty, ascat.gg = gg) + } - # Plot the segmented data + #Plot the segmented data ascat.plotSegmentedData(ascat.bc) - # Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, - # and discrete copy numbers - # If psi and rho are manually set: - if (!is.null(${purity}) && !is.null(${ploidy})){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=${purity}, psi_manual=${ploidy}) - } else if(!is.null(${purity}) && is.null(${ploidy})){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=${purity}) - } else if(!is.null(${ploidy}) && is.null(${purity})){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=${ploidy}) + #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers + #If psi and rho are manually set: + if (!is.null($purity) && !is.null($ploidy)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) + } else if(!is.null($purity) && is.null($ploidy)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) + } else if(!is.null($ploidy) && is.null($purity)){ + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) } else { ascat.output <- ascat.runAscat(ascat.bc, gamma=1) } - # Extract metrics from ASCAT profiles + #Extract metrics from ASCAT profiles QC = ascat.metrics(ascat.bc,ascat.output) - # Write out segmented regions (including regions with one copy of each allele) - write.table(ascat.output[["segments"]], file=paste0("${prefix}", ".segments.txt"), sep="\t", quote=F, row.names=F) - - # Write out CNVs in bed format + #Write out segmented regions (including regions with one copy of each allele) + write.table(ascat.output[["segments"]], file=paste0("$prefix", ".segments.txt"), sep="\t", quote=F, row.names=F) + + #Write out raw segmented regions (including regions with one copy of each allele) + tryCatch({ # In case segments_raw is not selected + write.table( + ascat.output[["segments_raw"]], + file = paste0(prefix, ".segments_raw.txt"), + sep = "\t", quote = FALSE, row.names = FALSE + ) + }, error = function(e) { + message("Error in writing segments_raw: ", conditionMessage(e)) + }) + + #Write out CNVs in bed format cnvs=ascat.output[["segments"]][2:6] - write.table(cnvs, file=paste0("${prefix}",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) + write.table(cnvs, file=paste0("$prefix",".cnvs.txt"), sep="\t", quote=F, row.names=F, col.names=T) - # Write out purity and ploidy info + #Write out purity and ploidy info summary <- tryCatch({ matrix(c(ascat.output[["aberrantcellfraction"]], ascat.output[["ploidy"]]), ncol=2, byrow=TRUE)}, error = function(err) { # error handler picks up where error was generated @@ -214,46 +192,47 @@ process ASCAT { } ) colnames(summary) <- c("AberrantCellFraction","Ploidy") - write.table(summary, file=paste0("${prefix}",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) + write.table(summary, file=paste0("$prefix",".purityploidy.txt"), sep="\t", quote=F, row.names=F, col.names=T) - write.table(QC, file=paste0("${prefix}", ".metrics.txt"), sep="\t", quote=F, row.names=F) + write.table(QC, file=paste0("$prefix", ".metrics.txt"), sep="\t", quote=F, row.names=F) - # Version export + # version export f <- file("versions.yml","w") alleleCounter_version = system(paste("alleleCounter --version"), intern = T) - ascat_version = as.character(packageVersion('ASCAT')) - writeLines(paste0('"', "${task.process}", '"', ":"), f) - writeLines(paste(" ascat:", ascat_version), f) + ascat_version = sessionInfo()\$otherPkgs\$ASCAT\$Version + writeLines(paste0('"', "$task.process", '"', ":"), f) writeLines(paste(" alleleCounter:", alleleCounter_version), f) + writeLines(paste(" ascat:", ascat_version), f) close(f) + """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.after_correction.gc_rt.test.tumour.germline.png - touch ${prefix}.after_correction.gc_rt.test.tumour.tumour.png - touch ${prefix}.before_correction.test.tumour.germline.png - touch ${prefix}.before_correction.test.tumour.tumour.png - touch ${prefix}.cnvs.txt - touch ${prefix}.metrics.txt - touch ${prefix}.normal_alleleFrequencies_chr21.txt - touch ${prefix}.normal_alleleFrequencies_chr22.txt - touch ${prefix}.purityploidy.txt - touch ${prefix}.segments.txt - touch ${prefix}.tumour.ASPCF.png - touch ${prefix}.tumour.sunrise.png - touch ${prefix}.tumour_alleleFrequencies_chr21.txt - touch ${prefix}.tumour_alleleFrequencies_chr22.txt - touch ${prefix}.tumour_normalBAF.txt - touch ${prefix}.tumour_normalLogR.txt - touch ${prefix}.tumour_tumourBAF.txt - touch ${prefix}.tumour_tumourLogR.txt + echo stub > ${prefix}.after_correction.gc_rt.test.tumour.germline.png + echo stub > ${prefix}.after_correction.gc_rt.test.tumour.tumour.png + echo stub > ${prefix}.before_correction.test.tumour.germline.png + echo stub > ${prefix}.before_correction.test.tumour.tumour.png + echo stub > ${prefix}.cnvs.txt + echo stub > ${prefix}.metrics.txt + echo stub > ${prefix}.normal_alleleFrequencies_chr21.txt + echo stub > ${prefix}.normal_alleleFrequencies_chr22.txt + echo stub > ${prefix}.purityploidy.txt + echo stub > ${prefix}.segments.txt + echo stub > ${prefix}.tumour.ASPCF.png + echo stub > ${prefix}.tumour.sunrise.png + echo stub > ${prefix}.tumour_alleleFrequencies_chr21.txt + echo stub > ${prefix}.tumour_alleleFrequencies_chr22.txt + echo stub > ${prefix}.tumour_normalBAF.txt + echo stub > ${prefix}.tumour_normalLogR.txt + echo stub > ${prefix}.tumour_tumourBAF.txt + echo stub > ${prefix}.tumour_tumourLogR.txt + + echo "${task.process}:" > versions.yml + echo ' alleleCounter: 4.3.0' >> versions.yml + echo ' ascat: 3.2.0' >> versions.yml - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bioconductor-ascat: \$(Rscript -e "library(ASCAT); cat(as.character(packageVersion('ASCAT')))") - alleleCounter: \$(alleleCounter --version) - END_VERSIONS """ -} + +} \ No newline at end of file From b9fea8a1c796e51cce06c184daae58792367a887 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 14:32:55 +0100 Subject: [PATCH 037/183] now actually our ascat version --- modules/nf-core/ascat/main.nf | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index e642df58..fa82efe6 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -42,6 +42,7 @@ process ASCAT { def penalty = args.penalty ? "$args.penalty" : "NULL" def gc_input = gc_file ? "$gc_file" : "NULL" def rt_input = rt_file ? "$rt_file" : "NULL" + def pdf_plots = args.pdf_plots ? "$args.pdf_plots" : "NULL" def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" @@ -56,7 +57,7 @@ process ASCAT { def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" - def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" + def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ #!/usr/bin/env Rscript library(RColorBrewer) @@ -153,13 +154,13 @@ process ASCAT { #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers #If psi and rho are manually set: if (!is.null($purity) && !is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = $pdf_plots) } else if(!is.null($purity) && is.null($ploidy)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = $pdf_plots) } else if(!is.null($ploidy) && is.null($purity)){ - ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = $pdf_plots) } else { - ascat.output <- ascat.runAscat(ascat.bc, gamma=1) + ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = $pdf_plots) } #Extract metrics from ASCAT profiles From b02fb9946b0dba984d9655c09cb6575518de38d0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 14:38:47 +0100 Subject: [PATCH 038/183] prettier --- modules.json | 115 +++++++++++++-------------------------------------- 1 file changed, 29 insertions(+), 86 deletions(-) diff --git a/modules.json b/modules.json index dd2694d6..a2a488e3 100644 --- a/modules.json +++ b/modules.json @@ -8,178 +8,129 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ] + "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "vcf_gather_bcftools" - ], + "installed_by": ["vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -188,33 +139,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From 03acacadb7099e44c15a3d2e9f52673e0adced63 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 15:17:00 +0100 Subject: [PATCH 039/183] recreate diff file vep --- modules.json | 115 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 29 deletions(-) diff --git a/modules.json b/modules.json index a2a488e3..dd2694d6 100644 --- a/modules.json +++ b/modules.json @@ -8,129 +8,178 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": ["modules", "vcf_gather_bcftools"] + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["vcf_gather_bcftools"], + "installed_by": [ + "vcf_gather_bcftools" + ], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -139,25 +188,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file From 7be5248745fa29e0159679817a990ab3b56dbaef Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 15:27:08 +0100 Subject: [PATCH 040/183] Channel. --> channel. changes --- subworkflows/local/prepare_annotation.nf | 8 ++--- subworkflows/local/prepare_reference_files.nf | 36 +++++++++---------- subworkflows/local/tumor_normal_happhase.nf | 8 ++--- subworkflows/local/tumor_only_happhase.nf | 8 ++--- .../nf-core/bam_stats_samtools/main.nf | 14 ++++---- workflows/lrsomatic.nf | 12 +++---- 6 files changed, 43 insertions(+), 43 deletions(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 76b5fdf5..b5503a5d 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -12,11 +12,11 @@ workflow PREPARE_ANNOTATION { main: - ch_versions = Channel.empty() - ensemblvep_cache = Channel.empty() + ch_versions = channel.empty() + ensemblvep_cache = channel.empty() if (download_vep_cache) { - vep_download_info = Channel.of([[],vep_genome, vep_species, vep_cache_version]) + vep_download_info = channel.of([[],vep_genome, vep_species, vep_cache_version]) ENSEMBLVEP_DOWNLOAD(vep_download_info) ensemblvep_cache = ENSEMBLVEP_DOWNLOAD.out.cache ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) @@ -35,7 +35,7 @@ workflow PREPARE_ANNOTATION { } } - ensemblvep_cache = Channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() + ensemblvep_cache = channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() } diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index da316f40..d79448c6 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -22,12 +22,12 @@ workflow PREPARE_REFERENCE_FILES { clair3_modelMap main: - ch_versions = Channel.empty() - ch_prepared_fasta = Channel.empty() - allele_files = Channel.empty() - loci_files = Channel.empty() - gc_file = Channel.empty() - rt_file = Channel.empty() + ch_versions = channel.empty() + ch_prepared_fasta = channel.empty() + allele_files = channel.empty() + loci_files = channel.empty() + gc_file = channel.empty() + rt_file = channel.empty() // Check if fasta and gtf are zipped if (fasta.endsWith('.gz')){ @@ -89,33 +89,33 @@ workflow PREPARE_REFERENCE_FILES { // prepare ascat and controlfreec reference files if ( !params.skip_ascat ) { - if (!ascat_alleles) allele_files = Channel.empty() + if (!ascat_alleles) allele_files = channel.empty() else if (ascat_alleles.endsWith(".zip")) { - UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + UNZIP_ALLELES(channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) - } else allele_files = Channel.fromPath(ascat_alleles).collect() + } else allele_files = channel.fromPath(ascat_alleles).collect() - if (!ascat_loci) loci_files = Channel.empty() + if (!ascat_loci) loci_files = channel.empty() else if (ascat_loci.endsWith(".zip")) { - UNZIP_LOCI(Channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + UNZIP_LOCI(channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) - } else loci_files = Channel.fromPath(ascat_loci).collect() + } else loci_files = channel.fromPath(ascat_loci).collect() - if (!ascat_loci_gc) gc_file = Channel.value([]) + if (!ascat_loci_gc) gc_file = channel.value([]) else if ( ascat_loci_gc.endsWith(".zip") ) { - UNZIP_GC(Channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + UNZIP_GC(channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_GC.out.versions) - } else gc_file = Channel.fromPath(ascat_loci_gc).collect() + } else gc_file = channel.fromPath(ascat_loci_gc).collect() - if (!ascat_loci_rt) rt_file = Channel.value([]) + if (!ascat_loci_rt) rt_file = channel.value([]) else if (ascat_loci_rt.endsWith(".zip")) { - UNZIP_RT(Channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) + UNZIP_RT(channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_RT.out.versions) - } else rt_file = Channel.fromPath(ascat_loci_rt).collect() + } else rt_file = channel.fromPath(ascat_loci_rt).collect() } emit: diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index a4c535e7..3bfab470 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -17,10 +17,10 @@ workflow TUMOR_NORMAL_HAPPHASE { main: - ch_versions = Channel.empty() - tumor_only_severus = Channel.empty() - somatic_vep = Channel.empty() - germline_vep = Channel.empty() + ch_versions = channel.empty() + tumor_only_severus = channel.empty() + somatic_vep = channel.empty() + germline_vep = channel.empty() // Branch input bams in normal and tumour mixed_bams diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index b7ae3c5b..ffa5590a 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -18,10 +18,10 @@ workflow TUMOR_ONLY_HAPPHASE { main: - ch_versions = Channel.empty() - tumor_only_severus = Channel.empty() - somatic_vep = Channel.empty() - germline_vep = Channel.empty() + ch_versions = channel.empty() + tumor_only_severus = channel.empty() + somatic_vep = channel.empty() + germline_vep = channel.empty() tumor_bams .map{ meta, bam, bai -> diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index 90fcbf80..7180151b 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -8,11 +8,11 @@ include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/m workflow BAM_STATS_SAMTOOLS { take: - ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] - ch_fasta // channel: [ val(meta), path(fasta) ] + ch_bam_bai // channel. [ val(meta), path(bam), path(bai) ] + ch_fasta // channel. [ val(meta), path(fasta) ] main: - ch_versions = Channel.empty() + ch_versions = channel.empty() SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) @@ -23,9 +23,9 @@ workflow BAM_STATS_SAMTOOLS { ch_versions = ch_versions.mix(SAMTOOLS_IDXSTATS.out.versions) emit: - stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] - flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), path(flagstat) ] - idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), path(idxstats) ] + stats = SAMTOOLS_STATS.out.stats // channel. [ val(meta), path(stats) ] + flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel. [ val(meta), path(flagstat) ] + idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel. [ val(meta), path(idxstats) ] - versions = ch_versions // channel: [ path(versions.yml) ] + versions = ch_versions // channel. [ path(versions.yml) ] } diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 388c5900..6b32677c 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -487,8 +487,8 @@ workflow LRSOMATIC { // Module: MOSDEPTH // - ch_mosdepth_global = Channel.empty() - ch_mosdepth_summary = Channel.empty() + ch_mosdepth_global = channel.empty() + ch_mosdepth_summary = channel.empty() if (!params.skip_qc && !params.skip_mosdepth) { @@ -511,9 +511,9 @@ workflow LRSOMATIC { // // SUBWORKFLOW: BAM_STATS_SAMTOOLS // - ch_bam_stats = Channel.empty() - ch_bam_flagstat = Channel.empty() - ch_bam_idxstats = Channel.empty() + ch_bam_stats = channel.empty() + ch_bam_flagstat = channel.empty() + ch_bam_idxstats = channel.empty() if (!params.skip_qc && !params.skip_bamstats ) { @@ -577,7 +577,7 @@ workflow LRSOMATIC { // // Collate and save software versions // - def topic_versions = Channel.topic("versions") + def topic_versions = channel.topic("versions") .distinct() .branch { entry -> versions_file: entry instanceof Path From b72a135ef34eb54a47212ca59916001d6968eb89 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 16:25:38 +0100 Subject: [PATCH 041/183] bunch of tiny fixes --- modules/nf-core/severus/main.nf | 10 +- subworkflows/local/tumor_normal_happhase.nf | 15 +- subworkflows/local/tumor_only_happhase.nf | 6 +- tests/default.nf.test.snap | 167 ++------------------ workflows/lrsomatic.nf | 3 + 5 files changed, 38 insertions(+), 163 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 833af257..ad6e7cf1 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -9,7 +9,7 @@ process SEVERUS { input: tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) - tuple val(meta2), path(bed) + tuple val(meta2), path(bed), path(pon_path) output: tuple val(meta), path("${prefix}/severus.log") , emit: log @@ -39,15 +39,23 @@ process SEVERUS { def control = control_input ? "--control-bam ${control_input}" : "" def vntr_bed = bed ? "--vntr-bed ${bed}" : "" def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" + def pon = pon_path && (!control_input) ? "--PON ${pon_path}" : "" + """ severus \\ $args \\ --threads $task.cpus \\ --target-bam $target_input \\ $vntr_bed \\ + $pon \\ $control \\ $phasing_vcf \\ --out-dir ${prefix} + + bgzip ${prefix}/somatic_SVs/severus_somatic.vcf + tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz + bgzip ${prefix}/all_SVs/severus_all.vcf + tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 3bfab470..c430c2a8 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -144,10 +144,10 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams .join(LONGPHASE_PHASE.out.snv_vcf) - .join(LONGPHASE_PHASE.out.sv_vcf) - .join(LONGPHASE_PHASE.out.mod_vcf) - .map { meta, bam, bai, clair3_model, platform, vcf, svs, mods -> + .map { meta, bam, bai, clair3_model, platform, vcf -> def new_meta = meta + [type: "normal"] + def svs = [] + def mods = [] return[new_meta, bam, bai, vcf, svs, mods] } .set{ normal_bams } @@ -164,10 +164,10 @@ workflow TUMOR_NORMAL_HAPPHASE { // mix with the normal bams tumor_bams .join(LONGPHASE_PHASE.out.snv_vcf) - .join(LONGPHASE_PHASE.out.sv_vcf) - .join(LONGPHASE_PHASE.out.mod_vcf) - .map { meta, bam, bai, vcf, svs, mods -> + .map { meta, bam, bai, vcf -> def new_meta = meta + [type: "tumor"] + def svs = [] + def mods = [] return [new_meta, bam, bai, vcf, svs, mods] } .mix(normal_bams) @@ -183,6 +183,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // // MODULE: LONGPHASE_HAPLOTAG // + // haplotag tumor and normal bams with normal vcf files for both LONGPHASE_HAPLOTAG ( mixed_bams_vcf, @@ -257,7 +258,7 @@ workflow TUMOR_NORMAL_HAPPHASE { tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model - return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai,model] + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, model] } .set { clairs_input } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index ffa5590a..8df9571a 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -114,10 +114,10 @@ workflow TUMOR_ONLY_HAPPHASE { // remove model info tumor_bams .join(LONGPHASE_PHASE.out.snv_vcf) - .join(LONGPHASE_PHASE.out.sv_vcf) - .join(LONGPHASE_PHASE.out.mod_vcf) - .map { meta, bam, bai, vcf, svs, mods -> + .map { meta, bam, bai, model, vcf -> def new_meta = meta + [type: "tumor"] + def svs = [] + def mods = [] return [new_meta, bam, bai, vcf, svs, mods] } .set{ tumor_bams_phasedvcf } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 1c8662ed..b9ea8a6b 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,18 +2,9 @@ "-profile test": { "content": [ { - "BCFTOOLS_CONCAT": { - "bcftools": 1.22 - }, - "BCFTOOLS_SORT": { - "bcftools": 1.22 - }, "CLAIR3": { "clair3": "1.2.0" }, - "CLAIRS": { - "clairs": "0.4.1" - }, "CLAIRSTO": { "clairsto": "0.4.0" }, @@ -27,11 +18,9 @@ "ensemblvep": 114.2, "tabix": 1.21 }, - "LONGPHASE_HAPLOTAG": { - "longphase": "1.7.3" - }, "LONGPHASE_PHASE": { - "longphase": "1.7.3" + "longphase": 2.0, + "tabix": "1.22.1" }, "METAEXTRACT": { "samtools": 1.21 @@ -41,34 +30,24 @@ "samtools": 1.21 }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "mosdepth": "0.3.11" }, "SAMTOOLS_FAIDX": { - "samtools": 1.21 + "samtools": "1.22.1" }, "SAMTOOLS_FLAGSTAT": { - "samtools": 1.21 + "samtools": "1.22.1" }, "SAMTOOLS_IDXSTATS": { - "samtools": 1.21 - }, - "SAMTOOLS_INDEX": { - "samtools": 1.21 + "samtools": "1.22.1" }, "SAMTOOLS_STATS": { - "samtools": 1.21 - }, - "SEVERUS": { - "severus": 1.6 + "samtools": "1.22.1" }, "SOMATIC_VEP": { "ensemblvep": 114.2, "tabix": 1.21 }, - "SV_VEP": { - "ensemblvep": 114.2, - "tabix": 1.21 - }, "UNTAR": { "untar": 1.34 }, @@ -76,7 +55,7 @@ "pigz": 2.8 }, "VCFSPLIT": { - "vcfsplit": 1.2 + "bcftools": 1.2 }, "WGET": { "wget": "1.21.4" @@ -118,11 +97,6 @@ "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", "sample1", - "sample1/bamfiles", - "sample1/bamfiles/sample1_normal.bam", - "sample1/bamfiles/sample1_normal.bam.bai", - "sample1/bamfiles/sample1_tumor.bam", - "sample1/bamfiles/sample1_tumor.bam.bai", "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", @@ -152,45 +126,12 @@ "sample1/variants/clair3", "sample1/variants/clair3/merge_output.vcf.gz", "sample1/variants/clair3/merge_output.vcf.gz.tbi", - "sample1/variants/clairs", - "sample1/variants/clairs/indel.vcf.gz", - "sample1/variants/clairs/indel.vcf.gz.tbi", - "sample1/variants/clairs/snvs.vcf.gz", - "sample1/variants/clairs/snvs.vcf.gz.tbi", - "sample1/variants/severus", - "sample1/variants/severus/all_SVs", - "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample1/variants/severus/breakpoints_double.csv", - "sample1/variants/severus/read_ids.csv", - "sample1/variants/severus/read_qual.txt", - "sample1/variants/severus/severus.log", - "sample1/variants/severus/somatic_SVs", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", "sample1/vep", - "sample1/vep/SVs", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", "sample1/vep/germline", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", - "sample1/vep/somatic", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample2", - "sample2/bamfiles", - "sample2/bamfiles/sample2_normal.bam", - "sample2/bamfiles/sample2_normal.bam.bai", - "sample2/bamfiles/sample2_tumor.bam", - "sample2/bamfiles/sample2_tumor.bam.bai", "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", @@ -220,43 +161,12 @@ "sample2/variants/clair3", "sample2/variants/clair3/merge_output.vcf.gz", "sample2/variants/clair3/merge_output.vcf.gz.tbi", - "sample2/variants/clairs", - "sample2/variants/clairs/indel.vcf.gz", - "sample2/variants/clairs/indel.vcf.gz.tbi", - "sample2/variants/clairs/snvs.vcf.gz", - "sample2/variants/clairs/snvs.vcf.gz.tbi", - "sample2/variants/severus", - "sample2/variants/severus/all_SVs", - "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample2/variants/severus/breakpoints_double.csv", - "sample2/variants/severus/read_ids.csv", - "sample2/variants/severus/read_qual.txt", - "sample2/variants/severus/severus.log", - "sample2/variants/severus/somatic_SVs", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", "sample2/vep", - "sample2/vep/SVs", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", "sample2/vep/germline", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", - "sample2/vep/somatic", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample3", - "sample3/bamfiles", - "sample3/bamfiles/sample3_tumor.bam", - "sample3/bamfiles/sample3_tumor.bam.bai", "sample3/qc", "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", @@ -280,26 +190,7 @@ "sample3/variants/clairsto/snv.vcf.gz.tbi", "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", - "sample3/variants/severus", - "sample3/variants/severus/all_SVs", - "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/all_SVs/severus_all.vcf.gz", - "sample3/variants/severus/all_SVs/severus_all.vcf.gz.tbi", - "sample3/variants/severus/breakpoints_double.csv", - "sample3/variants/severus/read_ids.csv", - "sample3/variants/severus/read_qual.txt", - "sample3/variants/severus/severus.log", - "sample3/variants/severus/somatic_SVs", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz.tbi", "sample3/vep", - "sample3/vep/SVs", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", "sample3/vep/germline", "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", @@ -310,65 +201,37 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,7373f28eae1e18614bec4508e6647ff2", - "sample1_normal.bam.bai:md5,fc9dd46a2a04c098cee87650edec0f89", - "sample1_tumor.bam:md5,4aa78492fa890945efe2af47cbe76194", - "sample1_tumor.bam.bai:md5,75ed8b553427bbbd9bbc3c7b52982e85", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", - "sample1.stats:md5,f61e05f232d4b3174797d4b25bdd9457", + "sample1.stats:md5,cf4b23c58e65cb55b31463db14ed6fd3", "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample1.stats:md5,afdcefd9c5a69d5252fe0f9186d349fd", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,244b62ee8500ddccf63bf1a8eb19d7bf", - "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample2_normal.bam:md5,c96d49ed1176c787752e7fcf23bd5ffb", - "sample2_normal.bam.bai:md5,87d97a08bdca08f6eaf2725dd114d3c3", - "sample2_tumor.bam:md5,4f375cb01fb7a7c8161474f2f789d8a4", - "sample2_tumor.bam.bai:md5,54967d76febdeb0abed1bd68d8aee337", + "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", - "sample2.stats:md5,9d98e3ec064b376880648a79c199b9b5", + "sample2.stats:md5,2b7f1a2833840d350d2a4d54fed70cf7", "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", - "sample2.stats:md5,2904de743414042e112d541ffc0f83ba", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,6a1d4530feae8258a925d1f0641a63ff", - "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,c80bbdcb0a6fcfe4164c6d96e6d9ad6a", - "sample3_tumor.bam.bai:md5,cdf45221635a6b03be6f28aa60b202bc", + "sample2.stats:md5,defe74842396209b6cff4b32994287c7", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample3.stats:md5,48eb55e610bd2a6d13c5d38d3c61d29e", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f" ] ], "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2025-11-28T16:07:44.541483428" + "timestamp": "2025-12-24T16:00:06.528198974" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 6b32677c..280c95f5 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -436,6 +436,9 @@ workflow LRSOMATIC { // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf] + } .set { severus_reformat } // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] From 00a7cdcc28e82436d3178724546dfe45a9bf09fb Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 16:31:55 +0100 Subject: [PATCH 042/183] linting --- modules.json | 115 +++++++++++++-------------------------------------- 1 file changed, 29 insertions(+), 86 deletions(-) diff --git a/modules.json b/modules.json index dd2694d6..a2a488e3 100644 --- a/modules.json +++ b/modules.json @@ -8,178 +8,129 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ] + "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { "branch": "master", "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "vcf_gather_bcftools" - ], + "installed_by": ["vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -188,33 +139,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From 19c8a091d2155ec4ff3cf56a814d4c9004e78422 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 24 Dec 2025 16:36:39 +0100 Subject: [PATCH 043/183] revert capital C --- subworkflows/nf-core/bam_stats_samtools/main.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index 7180151b..90fcbf80 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -8,11 +8,11 @@ include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/m workflow BAM_STATS_SAMTOOLS { take: - ch_bam_bai // channel. [ val(meta), path(bam), path(bai) ] - ch_fasta // channel. [ val(meta), path(fasta) ] + ch_bam_bai // channel: [ val(meta), path(bam), path(bai) ] + ch_fasta // channel: [ val(meta), path(fasta) ] main: - ch_versions = channel.empty() + ch_versions = Channel.empty() SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) @@ -23,9 +23,9 @@ workflow BAM_STATS_SAMTOOLS { ch_versions = ch_versions.mix(SAMTOOLS_IDXSTATS.out.versions) emit: - stats = SAMTOOLS_STATS.out.stats // channel. [ val(meta), path(stats) ] - flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel. [ val(meta), path(flagstat) ] - idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel. [ val(meta), path(idxstats) ] + stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] + flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), path(flagstat) ] + idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), path(idxstats) ] - versions = ch_versions // channel. [ path(versions.yml) ] + versions = ch_versions // channel: [ path(versions.yml) ] } From f369ffed7e3ea741faa3b9288fb3829a54a3a465 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 29 Dec 2025 11:13:19 +0100 Subject: [PATCH 044/183] update snap --- tests/default.nf.test.snap | 93 +++++++++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index b9ea8a6b..afca0938 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,9 +2,18 @@ "-profile test": { "content": [ { + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, "CLAIR3": { "clair3": "1.2.0" }, + "CLAIRS": { + "clairs": "0.4.1" + }, "CLAIRSTO": { "clairsto": "0.4.0" }, @@ -18,6 +27,9 @@ "ensemblvep": 114.2, "tabix": 1.21 }, + "LONGPHASE_HAPLOTAG": { + "longphase": 2.0 + }, "LONGPHASE_PHASE": { "longphase": 2.0, "tabix": "1.22.1" @@ -41,9 +53,15 @@ "SAMTOOLS_IDXSTATS": { "samtools": "1.22.1" }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, "SAMTOOLS_STATS": { "samtools": "1.22.1" }, + "SEVERUS": { + "severus": 1.6 + }, "SOMATIC_VEP": { "ensemblvep": 114.2, "tabix": 1.21 @@ -97,6 +115,11 @@ "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", @@ -126,12 +149,32 @@ "sample1/variants/clair3", "sample1/variants/clair3/merge_output.vcf.gz", "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/sample1", + "sample1/variants/severus/sample1/breakpoints_double.csv", + "sample1/variants/severus/sample1/read_ids.csv", + "sample1/variants/severus/sample1/read_qual.txt", + "sample1/variants/severus/sample1/severus.log", "sample1/vep", "sample1/vep/germline", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", @@ -161,12 +204,30 @@ "sample2/variants/clair3", "sample2/variants/clair3/merge_output.vcf.gz", "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/sample2", + "sample2/variants/severus/sample2/breakpoints_double.csv", + "sample2/variants/severus/sample2/read_ids.csv", + "sample2/variants/severus/sample2/read_qual.txt", + "sample2/variants/severus/sample2/severus.log", "sample2/vep", "sample2/vep/germline", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", "sample3/qc", "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", @@ -190,6 +251,12 @@ "sample3/variants/clairsto/snv.vcf.gz.tbi", "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/sample3", + "sample3/variants/severus/sample3/breakpoints_double.csv", + "sample3/variants/severus/sample3/read_ids.csv", + "sample3/variants/severus/sample3/read_qual.txt", + "sample3/variants/severus/sample3/severus.log", "sample3/vep", "sample3/vep/germline", "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", @@ -201,6 +268,10 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ + "sample1_normal.bam:md5,60838033f5f24aa90e16a5babcddd45b", + "sample1_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", + "sample1_tumor.bam:md5,bd73e83253c95a5fdc4db39454ee2253", + "sample1_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", @@ -211,6 +282,14 @@ "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", + "breakpoints_double.csv:md5,57e4f0d5509db44179e7c5044c6bc259", + "read_ids.csv:md5,afdfd7e588057249e8ed61455793d8e7", + "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", + "severus.log:md5,34a132520cfde2cf0fa19ebae20c6183", + "sample2_normal.bam:md5,7e6cdc6c51235a205548be160d798d38", + "sample2_normal.bam.bai:md5,7ad774be4cf80ae968f94d760bddf3c8", + "sample2_tumor.bam:md5,9938db44490835ec0e11069b4da37547", + "sample2_tumor.bam.bai:md5,202852a62fc5bf4cf1c196676068606a", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", @@ -221,17 +300,27 @@ "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,defe74842396209b6cff4b32994287c7", + "breakpoints_double.csv:md5,c5a59c9ea2486f7bb9d5e40fea8f916d", + "read_ids.csv:md5,15b0286b91ea8a98ecbf2cc396a96121", + "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", + "severus.log:md5,fa3357674974b79101bbdcf61e523c9b", + "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", + "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f" + "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f", + "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", + "read_ids.csv:md5,a04f6eb95ba70f244f5494fc4e62745a", + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", + "severus.log:md5,7dbe3de3c12432a1bbca75a1ef9faa7d" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2025-12-24T16:00:06.528198974" + "timestamp": "2025-12-24T17:00:41.795383163" } } \ No newline at end of file From e6ebb34eada2868e902a0759994a8cf31e20a39a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 29 Dec 2025 12:54:27 +0100 Subject: [PATCH 045/183] update local modules version where applicable --- modules/local/clairs/main.nf | 4 ++-- modules/local/clairsto/main.nf | 4 ++-- modules/local/cramino/main.nf | 4 ++-- modules/local/fibertoolsrs/fire/main.nf | 4 ++-- modules/local/fibertoolsrs/nucleosomes/main.nf | 4 ++-- modules/local/fibertoolsrs/predictm6a/main.nf | 4 ++-- modules/local/fibertoolsrs/qc/main.nf | 4 ++-- modules/local/wakhan/main.nf | 17 ----------------- 8 files changed, 14 insertions(+), 31 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index af06180f..65489e0c 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -3,8 +3,8 @@ process CLAIRS { label 'process_very_high' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker.io/hkubal/clairs:v0.4.1': - 'docker.io/hkubal/clairs:v0.4.1' }" + 'docker.io/hkubal/clairs:v0.4.4': + 'docker.io/hkubal/clairs:v0.4.4' }" input: tuple val(meta), path(tumor_bam), path(tumor_bai), path(normal_bam), path(normal_bai), val(model) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 79424f39..091a4920 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -4,8 +4,8 @@ process CLAIRSTO { label 'process_very_high' container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker.io/hkubal/clairs-to:v0.4.0': - 'docker.io/hkubal/clairs-to:v0.4.0' }" + 'docker.io/hkubal/clairs-to:v0.4.2': + 'docker.io/hkubal/clairs-to:v0.4.2' }" input: tuple val(meta), path(tumor_bam), path(tumor_bai), val(model) diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index 41709e2c..b6ab0670 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -4,8 +4,8 @@ process CRAMINO { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cramino:1.0.0--h3dc2dae_0': - 'biocontainers/cramino:1.0.0--h3dc2dae_0' }" + 'https://depot.galaxyproject.org/singularity/cramino:1.3.0--h3dc2dae_0': + 'biocontainers/cramino:1.3.0--h3dc2dae_0' }" input: tuple val(meta), path(bam) diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index e65c623c..82cc87db 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -5,8 +5,8 @@ process FIBERTOOLSRS_FIRE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': - 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.8.1--h3b373d1_0': + 'biocontainers/fibertools-rs:0.8.1--h3b373d1_0' }" input: tuple val(meta), path(bam) diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 41bf341b..0baa4474 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -5,8 +5,8 @@ process FIBERTOOLSRS_NUCLEOSOMES { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': - 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.8.1--h3b373d1_0': + 'biocontainers/fibertools-rs:0.8.1--h3b373d1_0' }" input: tuple val(meta), path(bam) diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 7ea6db24..83319b6f 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -5,8 +5,8 @@ process FIBERTOOLSRS_PREDICTM6A { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': - 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.8.1--h3b373d1_0': + 'biocontainers/fibertools-rs:0.8.1--h3b373d1_0' }" input: tuple val(meta), path(bam) diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf index f89f121b..f9b9e349 100644 --- a/modules/local/fibertoolsrs/qc/main.nf +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -4,8 +4,8 @@ process FIBERTOOLSRS_QC { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.6.2--h3b373d1_0': - 'biocontainers/fibertools-rs:0.6.2--h3b373d1_0' }" + 'https://depot.galaxyproject.org/singularity/fibertools-rs:0.8.1--h3b373d1_0': + 'biocontainers/fibertools-rs:0.8.1--h3b373d1_0' }" input: tuple val(meta), path(bam) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index bb7d5974..c819ca04 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -1,20 +1,3 @@ -// TODO nf-core: If in doubt look at other nf-core/modules to see how we are doing things! :) -// https://github.com/nf-core/modules/tree/master/modules/nf-core/ -// You can also ask for help via your pull request or on the #modules channel on the nf-core Slack workspace: -// https://nf-co.re/join -// TODO nf-core: A module file SHOULD only define input and output files as command-line parameters. -// All other parameters MUST be provided using the "task.ext" directive, see here: -// https://www.nextflow.io/docs/latest/process.html#ext -// where "task.ext" is a string. -// Any parameters that need to be evaluated in the context of a particular sample -// e.g. single-end/paired-end data MUST also be defined and evaluated appropriately. -// TODO nf-core: Software that can be piped together SHOULD be added to separate module files -// unless there is a run-time, storage advantage in implementing in this way -// e.g. it's ok to have a single module for bwa to output BAM instead of SAM: -// bwa mem | samtools view -B -T ref.fasta -// TODO nf-core: Optional inputs are not currently supported by Nextflow. However, using an empty -// list (`[]`) instead of a file can be used to work around this issue. - process WAKHAN { tag "$meta.id" label 'process_medium' From 60fd6c50a67c4f7ac9aa5a9beb73a16d33612788 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 29 Dec 2025 12:54:44 +0100 Subject: [PATCH 046/183] force "." prefix for severus --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 081c0892..f3e7f8b4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -215,6 +215,7 @@ process { // withName: '.*:SEVERUS' { + ext.prefix = "." ext.args = '--min-support 3 --output-read-ids ' publishDir = [ path: { "${params.outdir}/${meta.id}/variants/severus" }, From 09b379cc9acad43bd7348f1449a164f770a5a820 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 29 Dec 2025 14:08:51 +0100 Subject: [PATCH 047/183] update snapshot --- tests/default.nf.test.snap | 45 +++++++++++++++----------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index afca0938..c8bd8896 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -12,16 +12,16 @@ "clair3": "1.2.0" }, "CLAIRS": { - "clairs": "0.4.1" + "clairs": "0.4.4" }, "CLAIRSTO": { - "clairsto": "0.4.0" + "clairsto": "0.4.2" }, "CRAMINO_POST": { - "cramino": "1.0.0" + "cramino": "1.3.0" }, "CRAMINO_PRE": { - "cramino": "1.0.0" + "cramino": "1.3.0" }, "GERMLINE_VEP": { "ensemblvep": 114.2, @@ -155,11 +155,10 @@ "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", "sample1/variants/severus", - "sample1/variants/severus/sample1", - "sample1/variants/severus/sample1/breakpoints_double.csv", - "sample1/variants/severus/sample1/read_ids.csv", - "sample1/variants/severus/sample1/read_qual.txt", - "sample1/variants/severus/sample1/severus.log", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", "sample1/vep", "sample1/vep/germline", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", @@ -210,11 +209,10 @@ "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", "sample2/variants/severus", - "sample2/variants/severus/sample2", - "sample2/variants/severus/sample2/breakpoints_double.csv", - "sample2/variants/severus/sample2/read_ids.csv", - "sample2/variants/severus/sample2/read_qual.txt", - "sample2/variants/severus/sample2/severus.log", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", "sample2/vep", "sample2/vep/germline", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", @@ -252,11 +250,10 @@ "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", "sample3/variants/severus", - "sample3/variants/severus/sample3", - "sample3/variants/severus/sample3/breakpoints_double.csv", - "sample3/variants/severus/sample3/read_ids.csv", - "sample3/variants/severus/sample3/read_qual.txt", - "sample3/variants/severus/sample3/severus.log", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", "sample3/vep", "sample3/vep/germline", "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", @@ -283,9 +280,7 @@ "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", "breakpoints_double.csv:md5,57e4f0d5509db44179e7c5044c6bc259", - "read_ids.csv:md5,afdfd7e588057249e8ed61455793d8e7", "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "severus.log:md5,34a132520cfde2cf0fa19ebae20c6183", "sample2_normal.bam:md5,7e6cdc6c51235a205548be160d798d38", "sample2_normal.bam.bai:md5,7ad774be4cf80ae968f94d760bddf3c8", "sample2_tumor.bam:md5,9938db44490835ec0e11069b4da37547", @@ -301,9 +296,7 @@ "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,defe74842396209b6cff4b32994287c7", "breakpoints_double.csv:md5,c5a59c9ea2486f7bb9d5e40fea8f916d", - "read_ids.csv:md5,15b0286b91ea8a98ecbf2cc396a96121", "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "severus.log:md5,fa3357674974b79101bbdcf61e523c9b", "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", @@ -312,15 +305,13 @@ "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_ids.csv:md5,a04f6eb95ba70f244f5494fc4e62745a", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "severus.log:md5,7dbe3de3c12432a1bbca75a1ef9faa7d" + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2025-12-24T17:00:41.795383163" + "timestamp": "2025-12-29T14:07:45.261506087" } } \ No newline at end of file From aee421626fca4ed2693aed13fff23658edce2e2b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 30 Dec 2025 10:41:04 +0100 Subject: [PATCH 048/183] remove unneeded index files from channels that crashed the pipeline --- subworkflows/local/tumor_normal_happhase.nf | 3 +-- subworkflows/local/tumor_only_happhase.nf | 7 +++---- workflows/lrsomatic.nf | 8 +------- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index c430c2a8..922da7ce 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -244,7 +244,6 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] } .join(LONGPHASE_PHASE.out.snv_vcf) - .join(LONGPHASE_PHASE.out.snv_vcf_index) .set{tumor_normal_severus} // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] @@ -256,7 +255,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Get ClairS input channel tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, model] } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 8df9571a..2b5b351a 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -101,7 +101,6 @@ workflow TUMOR_ONLY_HAPPHASE { // MODULES: LONGPHASE_PHASE // // Phase tumor bams on nonsomatic vcf - LONGPHASE_PHASE ( tumor_bams_germlinevcf, fasta, @@ -163,15 +162,14 @@ workflow TUMOR_ONLY_HAPPHASE { haplotagged_bams .join(SAMTOOLS_INDEX.out.bai) .join(LONGPHASE_PHASE.out.snv_vcf) - .join(LONGPHASE_PHASE.out.snv_vcf_index) - .map{ meta, hap_bam, hap_bai, vcf, tbi -> + .map{ meta, hap_bam, hap_bai, vcf -> def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, fiber: meta.fiber, basecall_model: meta.basecall_model] - return [new_meta, hap_bam, hap_bai, [], [], vcf, tbi] + return [new_meta, hap_bam, hap_bai, [], [], vcf] } .set{ tumor_only_severus } @@ -181,6 +179,7 @@ workflow TUMOR_ONLY_HAPPHASE { // normal_bam: haplotagged aligned bam files for normal (empty) // normal_bai: indexes for normal bam files (empty) // phased_vcf: phased small variant vcf + // tbi: index for phased small variant vcf emit: tumor_only_severus diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 280c95f5..f7784e0d 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -436,9 +436,6 @@ workflow LRSOMATIC { // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> - return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf] - } .set { severus_reformat } // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] @@ -538,7 +535,7 @@ workflow LRSOMATIC { if (!params.skip_ascat) { severus_reformat - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } @@ -565,9 +562,6 @@ workflow LRSOMATIC { // Prepare input channel for WAKHAN severus_reformat - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> - return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf] - } .join(SEVERUS.out.all_vcf) .set { wakhan_input } From 5743eb1f6ca7999a66207933a7b9a10213ae5ba7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 30 Dec 2025 12:10:11 +0100 Subject: [PATCH 049/183] fixing roberts indenting misalignment >:( --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 423f7538..5e93950f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -27,7 +27,7 @@ params { vep_custom_tbi = null - normal_fiber = true + normal_fiber = true // Skip options skip_qc = false From 3fea6f79ccede8c5df541be6fcca73bd4a03b449 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 5 Jan 2026 10:12:43 +0100 Subject: [PATCH 050/183] fix fibertools versioning --- modules/local/fibertoolsrs/fire/main.nf | 2 +- modules/local/fibertoolsrs/nucleosomes/main.nf | 2 +- modules/local/fibertoolsrs/predictm6a/main.nf | 2 +- modules/local/fibertoolsrs/qc/main.nf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 82cc87db..d768171b 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_FIRE { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 0baa4474..74349b4c 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 83319b6f..6a9990a2 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_PREDICTM6A { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf index f9b9e349..fc3eafdf 100644 --- a/modules/local/fibertoolsrs/qc/main.nf +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -12,7 +12,7 @@ process FIBERTOOLSRS_QC { output: tuple val(meta), path("*.txt"), emit: qc_txt - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed '1!d ; s/ft //'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when From ac6785fbc8bd601ae59de20ea6979aab347ef5c6 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 5 Jan 2026 10:18:58 +0100 Subject: [PATCH 051/183] fixing fibertools attempt 2 --- modules/local/fibertoolsrs/fire/main.nf | 2 +- modules/local/fibertoolsrs/nucleosomes/main.nf | 2 +- modules/local/fibertoolsrs/predictm6a/main.nf | 2 +- modules/local/fibertoolsrs/qc/main.nf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index d768171b..60ce78c6 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_FIRE { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 74349b4c..fdb19ce2 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 6a9990a2..23619768 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_PREDICTM6A { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf index fc3eafdf..ab6402bc 100644 --- a/modules/local/fibertoolsrs/qc/main.nf +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -12,7 +12,7 @@ process FIBERTOOLSRS_QC { output: tuple val(meta), path("*.txt"), emit: qc_txt - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed -n 's/.*v\([0-9.]\+\).*/\1/p'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when From 2c26347268ee819584766161684890a9d45882d8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Tue, 6 Jan 2026 15:07:12 +0100 Subject: [PATCH 052/183] fix fibertools version yet again --- modules/local/fibertoolsrs/fire/main.nf | 2 +- modules/local/fibertoolsrs/nucleosomes/main.nf | 2 +- modules/local/fibertoolsrs/predictm6a/main.nf | 2 +- modules/local/fibertoolsrs/qc/main.nf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 60ce78c6..f79bbaf0 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_FIRE { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/\tgit-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index fdb19ce2..a23e883a 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/\tgit-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 23619768..f5c20930 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -13,7 +13,7 @@ process FIBERTOOLSRS_PREDICTM6A { output: tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/\tgit-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf index ab6402bc..60081f7a 100644 --- a/modules/local/fibertoolsrs/qc/main.nf +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -12,7 +12,7 @@ process FIBERTOOLSRS_QC { output: tuple val(meta), path("*.txt"), emit: qc_txt - tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/git-details.*//'"), topic: versions, emit: versions_fibertoolsrs + tuple val("${task.process}"), val('fibertoolsrs'), eval("ft --version |& sed 's/^fibertools-rs v//; s/\tgit-details.*//'"), topic: versions, emit: versions_fibertoolsrs when: task.ext.when == null || task.ext.when From f1bf4de1fe38bf5fd9adfaf112c4157d9f903735 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 7 Jan 2026 10:43:11 +0100 Subject: [PATCH 053/183] fix severus output --- modules/nf-core/severus/main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index ad6e7cf1..75770c34 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -19,11 +19,11 @@ process SEVERUS { tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true + tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf , optional: true tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true @@ -51,7 +51,7 @@ process SEVERUS { $control \\ $phasing_vcf \\ --out-dir ${prefix} - + bgzip ${prefix}/somatic_SVs/severus_somatic.vcf tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz bgzip ${prefix}/all_SVs/severus_all.vcf From 9260e690cfd2ae73a78c838940816c1b086c40ae Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 7 Jan 2026 16:15:52 +0100 Subject: [PATCH 054/183] change centromere specification for wakhan --- conf/modules.config | 3 +-- modules/local/wakhan/main.nf | 3 +++ workflows/lrsomatic.nf | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f3e7f8b4..5072b8d6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -294,8 +294,7 @@ process { [ params.wakhan_chroms ? "--contigs ${params.wakhan_chroms}" : (meta.sex == "female" ? "--contigs chr1-22,chrX" : "--contigs chr1-22,chrX,chrY"), - "--pdf-enable", - "--centromere ${params.centromere_bed}" + "--pdf-enable" ].join(' ').trim() } publishDir = [ path: { "${params.outdir}/${meta.id}/wakhan" }, diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index c819ca04..49c596c5 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -10,6 +10,7 @@ process WAKHAN { input: tuple val(meta), path(tumor_input), path(tumor_index), path(normal_input), path(normal_index), path(vcf), path(breakpoints) tuple val(meta2), path(reference) + path(centromere_bed) output: tuple val(meta), path("*/*_genes_genome.html") , emit: genes_genome_html @@ -45,6 +46,7 @@ process WAKHAN { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def phased_vcf = normal_input ? "--normal-phased-vcf $vcf" : "--tumor-phased-vcf $vcf" + def centromere = centromere_bed ? "--centromere \$PWD/${centromere_bed}" : "" """ wakhan \\ @@ -54,6 +56,7 @@ process WAKHAN { --genome-name ${prefix} \\ --out-dir-plots . \\ ${phased_vcf} \\ + ${centromere} \\ ${args} \\ --threads ${task.cpus} """ diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index f7784e0d..b33d50ff 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -567,7 +567,8 @@ workflow LRSOMATIC { WAKHAN ( wakhan_input, - ch_fasta + ch_fasta, + file(params.centromere_bed) ) } From dde7be5328e3e3e35916d4deb1cec01599228f83 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 7 Jan 2026 16:16:08 +0100 Subject: [PATCH 055/183] update snap --- tests/default.nf.test.snap | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index c8bd8896..96401934 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -66,6 +66,10 @@ "ensemblvep": 114.2, "tabix": 1.21 }, + "SV_VEP": { + "ensemblvep": 114.2, + "tabix": 1.21 + }, "UNTAR": { "untar": 1.34 }, @@ -155,11 +159,19 @@ "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", "sample1/variants/severus/breakpoints_double.csv", "sample1/variants/severus/read_ids.csv", "sample1/variants/severus/read_qual.txt", "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", "sample1/vep/germline", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", @@ -209,11 +221,19 @@ "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", "sample2/variants/severus/breakpoints_double.csv", "sample2/variants/severus/read_ids.csv", "sample2/variants/severus/read_qual.txt", "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", "sample2/vep/germline", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", @@ -250,11 +270,19 @@ "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", "sample3/variants/severus/breakpoints_double.csv", "sample3/variants/severus/read_ids.csv", "sample3/variants/severus/read_qual.txt", "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", "sample3/vep/germline", "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", @@ -312,6 +340,6 @@ "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2025-12-29T14:07:45.261506087" + "timestamp": "2026-01-07T12:24:56.969201207" } } \ No newline at end of file From 000d29f8c17cd1622a8037deda0011c24b5bd55f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 8 Jan 2026 10:32:31 +0100 Subject: [PATCH 056/183] add white background overview pic --- README.md | 2 ++ assets/lrsomatic_1.0.png | Bin 0 -> 180718 bytes 2 files changed, 2 insertions(+) create mode 100644 assets/lrsomatic_1.0.png diff --git a/README.md b/README.md index 4c121985..0c7745e0 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,8 @@ It can be run in both **matched tumour-normal** and **tumour-only mode**, offeri Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. ## Pipeline summary +![image](./assets/lrsomatic_1.0.png) + **1) Pre-processing:** diff --git a/assets/lrsomatic_1.0.png b/assets/lrsomatic_1.0.png new file mode 100644 index 0000000000000000000000000000000000000000..2505e7e35a9429d307229762f0838c29f352c43e GIT binary patch literal 180718 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 literal 0 HcmV?d00001 From fc3c847f227415410201db1178c6e23e97f83a4c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 8 Jan 2026 10:38:13 +0100 Subject: [PATCH 057/183] prettier --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c7745e0..54d7c9a4 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ It can be run in both **matched tumour-normal** and **tumour-only mode**, offeri Developed using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems. ## Pipeline summary -![image](./assets/lrsomatic_1.0.png) +![image](./assets/lrsomatic_1.0.png) **1) Pre-processing:** From 27e7eafee430bf4154e96621859d0ebd1a338964 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 8 Jan 2026 17:31:46 +0100 Subject: [PATCH 058/183] update model channel structure --- subworkflows/local/prepare_reference_files.nf | 14 +++-- subworkflows/local/tumor_normal_happhase.nf | 40 +++++++------ workflows/lrsomatic.nf | 56 ++++++++++++------- 3 files changed, 65 insertions(+), 45 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index d79448c6..8e4e182d 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -38,10 +38,12 @@ workflow PREPARE_REFERENCE_FILES { } else { ch_prepared_fasta = [ [:], fasta ] } - + + // if clair3 model is specified, then download that + // otherwise use info in bam header and download that basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> - def id_new = basecall_model_meta ?: meta.clair3_model + def id_new = basecall_model_meta ? clair3_modelMap.get(basecall_model_meta) : basecall_model_meta def meta_new = [id: id_new] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) @@ -49,13 +51,13 @@ workflow PREPARE_REFERENCE_FILES { return [ meta_new, url ] } .unique() - .set{ model_urls } + .set{ clair3_model_urls } // // MODULE: Download model // - WGET ( model_urls ) + WGET ( clair3_model_urls ) ch_versions = ch_versions.mix(WGET.out.versions) @@ -69,7 +71,7 @@ workflow PREPARE_REFERENCE_FILES { ch_versions = ch_versions.mix(UNTAR.out.versions) - UNTAR.out.untar.set { downloaded_model_files } + UNTAR.out.untar.set { downloaded_clair3_models } // // MODULE: Index the fasta @@ -126,7 +128,7 @@ workflow PREPARE_REFERENCE_FILES { loci_files gc_file rt_file - downloaded_model_files + downloaded_clair3_models versions = ch_versions } diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 922da7ce..3a998f61 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -13,7 +13,7 @@ workflow TUMOR_NORMAL_HAPPHASE { fai clair3_modelMap clairs_modelMap - downloaded_model_files + downloaded_clair3_models main: @@ -33,34 +33,38 @@ workflow TUMOR_NORMAL_HAPPHASE { // Get normal bams and add platform/model info for Clair3 usage // remove type from so that information can be merged easier later - downloaded_model_files + downloaded_clair3_models .map{ meta, file -> - def basecall_model = meta.id - return [basecall_model, meta, file] + def clair3_model = meta.id + return [meta, clair3_model, file] } - .set{downloaded_model_files} + .set{downloaded_clair3_models} - mixed_bams.normal + downloaded_clair3_models.view() + + mixed_bams.normal .map{ meta, bam, bai -> - def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - basecall_model: basecall_model, - clairS_model: meta.clairS_model] - return [ basecall_model, new_meta, bam, bai ] + return [ meta, meta.clair3_model, bam, bai ] } .set { normal_bams_model } + normal_bams_model.view() + normal_bams_model - .combine(downloaded_model_files,by:0) - .map{ basecall_model, meta, bam, bai, meta2, model -> + .combine(downloaded_clair3_models,by:1) + .map {clair3_model, meta_bam, bam, bai, meta_model, model -> + def platform = (meta_bam.platform == 'pb') ? 'hifi' : meta_bam.platform + return [meta_bam, bam, bai, model, platform] + } + .set{ normal_bams } + + normal_bams.view() + /* + .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" return [meta, bam, bai, model, platform] } - .set{ normal_bams } + */ // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index b33d50ff..ab611a20 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -65,7 +65,7 @@ workflow LRSOMATIC { 'dna_r10.4.1_e8.2_400bps_sup@v4.2.0': 'r1041_e82_400bps_sup_v420', 'dna_r10.4.1_e8.2_400bps_sup@v4.1.0': 'r1041_e82_400bps_sup_v410', 'dna_r10.4.1_e8.2_260bps_sup@v4.0.0': 'r1041_e82_260bps_sup_v400', - 'hifi_revio' : 'hifi_revio' + 'hifi_revio' : 'hifi' ] def clairs_modelMap = [ @@ -75,7 +75,7 @@ workflow LRSOMATIC { 'dna_r10.4.1_e8.2_400bps_sup@v4.3.0': 'ont_r10_dorado_sup_5khz_ssrs', 'dna_r10.4.1_e8.2_400bps_sup@v5.0.0': 'ont_r10_dorado_sup_5khz_ssrs', 'dna_r10.4.1_e8.2_400bps_sup@v5.2.0': 'ont_r10_dorado_sup_5khz_ssrs', - 'hifi_revio' : 'hifi_revio_ss' + 'hifi_revio' : 'hifi_revio_ssrs' ] @@ -112,7 +112,19 @@ workflow LRSOMATIC { ch_samplesheet .join(basecall_meta) .map { meta, bam, basecall_model_meta, kinetics_meta -> - def meta_new = meta + [ basecall_model: basecall_model_meta, kinetics: kinetics_meta] + def chosen_clair3_model = meta.clair3_model ?: clair3_modelMap.get(basecall_model_meta) + def chosen_clairSTO_model = meta.clairSTO_model ?: clairs_modelMap.get(basecall_model_meta) + def chosen_clairS_model = meta.clairS_model ?: clairs_modelMap.get(basecall_model_meta) + def meta_new =[ id: meta.id, + paired_data: meta.paired_data, + type: meta.type, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + clair3_model: chosen_clair3_model, + clairS_model : chosen_clairS_model, + clairSTO_model: chosen_clairSTO_model, + kinetics: kinetics_meta] return[ meta_new, bam ] } .groupTuple() @@ -122,6 +134,22 @@ workflow LRSOMATIC { .set{ch_samplesheet} + // + // SUBWORKFLOW: PREPARE_REFERENCE_FILES + // + + PREPARE_REFERENCE_FILES ( + params.fasta, + params.ascat_allele_files, + params.ascat_loci_files, + params.ascat_gc_file, + params.ascat_rt_file, + basecall_meta, + clair3_modelMap + ) + + downloaded_clair3_models = PREPARE_REFERENCE_FILES.out.downloaded_clair3_models + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of unaligned bams @@ -142,7 +170,7 @@ workflow LRSOMATIC { .mix ( ch_split.single ) .set { ch_cat_ubams } - + ch_cat_ubams.view() // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated unaligned bams @@ -156,20 +184,6 @@ workflow LRSOMATIC { CRAMINO_PRE ( ch_cat_ubams ) } - // - // SUBWORKFLOW: PREPARE_REFERENCE_FILES - // - - PREPARE_REFERENCE_FILES ( - params.fasta, - params.ascat_allele_files, - params.ascat_loci_files, - params.ascat_gc_file, - params.ascat_rt_file, - basecall_meta, - clair3_modelMap - ) - vep_cache = channel.empty() if (!params.skip_vep) { @@ -201,7 +215,7 @@ workflow LRSOMATIC { ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai - downloaded_model_files = PREPARE_REFERENCE_FILES.out.downloaded_model_files + // ASCAT files allele_files = PREPARE_REFERENCE_FILES.out.allele_files @@ -328,7 +342,7 @@ workflow LRSOMATIC { // ch_minimap_bams into tumor and paired to phase the paired ones on normal // and add index - + ch_minimap_bam.view() ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) .branch { meta, bams, bais -> @@ -353,7 +367,7 @@ workflow LRSOMATIC { ch_fai, clair3_modelMap, clairs_modelMap, - downloaded_model_files + downloaded_clair3_models ) ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) From a585aee18d340ec386909fe25a43dd804402aea2 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 8 Jan 2026 17:32:16 +0100 Subject: [PATCH 059/183] change cramino process from single to low --- modules/local/cramino/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index b6ab0670..eff34a00 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -1,6 +1,6 @@ process CRAMINO { tag "$meta.id" - label 'process_single' + label 'process_low' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? From 0e4bab20cb262dd158324821c38cb5f19a6b7cbc Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 8 Jan 2026 17:32:33 +0100 Subject: [PATCH 060/183] update snap --- tests/default.nf.test.snap | 75 +++----------------------------------- 1 file changed, 5 insertions(+), 70 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 96401934..95ecedbb 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,18 +2,9 @@ "-profile test": { "content": [ { - "BCFTOOLS_CONCAT": { - "bcftools": 1.22 - }, - "BCFTOOLS_SORT": { - "bcftools": 1.22 - }, "CLAIR3": { "clair3": "1.2.0" }, - "CLAIRS": { - "clairs": "0.4.4" - }, "CLAIRSTO": { "clairsto": "0.4.2" }, @@ -122,8 +113,6 @@ "sample1/bamfiles", "sample1/bamfiles/sample1_normal.bam", "sample1/bamfiles/sample1_normal.bam.bai", - "sample1/bamfiles/sample1_tumor.bam", - "sample1/bamfiles/sample1_tumor.bam.bai", "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", @@ -153,39 +142,15 @@ "sample1/variants/clair3", "sample1/variants/clair3/merge_output.vcf.gz", "sample1/variants/clair3/merge_output.vcf.gz.tbi", - "sample1/variants/clairs", - "sample1/variants/clairs/indel.vcf.gz", - "sample1/variants/clairs/indel.vcf.gz.tbi", - "sample1/variants/clairs/snvs.vcf.gz", - "sample1/variants/clairs/snvs.vcf.gz.tbi", - "sample1/variants/severus", - "sample1/variants/severus/all_SVs", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz", - "sample1/variants/severus/breakpoints_double.csv", - "sample1/variants/severus/read_ids.csv", - "sample1/variants/severus/read_qual.txt", - "sample1/variants/severus/severus.log", - "sample1/variants/severus/somatic_SVs", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample1/vep", - "sample1/vep/SVs", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", "sample1/vep/germline", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", - "sample1/vep/somatic", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample2", "sample2/bamfiles", "sample2/bamfiles/sample2_normal.bam", "sample2/bamfiles/sample2_normal.bam.bai", - "sample2/bamfiles/sample2_tumor.bam", - "sample2/bamfiles/sample2_tumor.bam.bai", "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", @@ -215,33 +180,11 @@ "sample2/variants/clair3", "sample2/variants/clair3/merge_output.vcf.gz", "sample2/variants/clair3/merge_output.vcf.gz.tbi", - "sample2/variants/clairs", - "sample2/variants/clairs/indel.vcf.gz", - "sample2/variants/clairs/indel.vcf.gz.tbi", - "sample2/variants/clairs/snvs.vcf.gz", - "sample2/variants/clairs/snvs.vcf.gz.tbi", - "sample2/variants/severus", - "sample2/variants/severus/all_SVs", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz", - "sample2/variants/severus/breakpoints_double.csv", - "sample2/variants/severus/read_ids.csv", - "sample2/variants/severus/read_qual.txt", - "sample2/variants/severus/severus.log", - "sample2/variants/severus/somatic_SVs", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample2/vep", - "sample2/vep/SVs", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", "sample2/vep/germline", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", - "sample2/vep/somatic", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample3", "sample3/bamfiles", "sample3/bamfiles/sample3_tumor.bam", @@ -295,8 +238,6 @@ [ "sample1_normal.bam:md5,60838033f5f24aa90e16a5babcddd45b", "sample1_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", - "sample1_tumor.bam:md5,bd73e83253c95a5fdc4db39454ee2253", - "sample1_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", @@ -307,12 +248,8 @@ "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", - "breakpoints_double.csv:md5,57e4f0d5509db44179e7c5044c6bc259", - "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "sample2_normal.bam:md5,7e6cdc6c51235a205548be160d798d38", - "sample2_normal.bam.bai:md5,7ad774be4cf80ae968f94d760bddf3c8", - "sample2_tumor.bam:md5,9938db44490835ec0e11069b4da37547", - "sample2_tumor.bam.bai:md5,202852a62fc5bf4cf1c196676068606a", + "sample2_normal.bam:md5,554b89692e84b9ddd0615649e2b15820", + "sample2_normal.bam.bai:md5,af193f1922d90b8741212d2bf690c418", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", @@ -323,8 +260,6 @@ "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,defe74842396209b6cff4b32994287c7", - "breakpoints_double.csv:md5,c5a59c9ea2486f7bb9d5e40fea8f916d", - "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", @@ -337,9 +272,9 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2026-01-07T12:24:56.969201207" + "timestamp": "2026-01-08T17:23:32.905484266" } } \ No newline at end of file From 611b494985b5a43e1fb9f6a1b2f3c912661321cc Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 8 Jan 2026 17:39:32 +0100 Subject: [PATCH 061/183] prettier --- ro-crate-metadata.json | 2 +- subworkflows/local/prepare_reference_files.nf | 4 ++-- subworkflows/local/tumor_normal_happhase.nf | 2 +- workflows/lrsomatic.nf | 14 +++++++------- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index d084d296..35fb56bf 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-12-23T12:58:53+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\nIf you use IntGenomicsLab/lrsomatic for your analysis, please cite it using the following doi: [10.5281/zenodo.17751829](https://doi.org/10.5281/zenodo.17751829)\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", + "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n![image](./assets/lrsomatic_1.0.png)\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\nIf you use IntGenomicsLab/lrsomatic for your analysis, please cite it using the following doi: [10.5281/zenodo.17751829](https://doi.org/10.5281/zenodo.17751829)\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" diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 8e4e182d..6bd11959 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -38,12 +38,12 @@ workflow PREPARE_REFERENCE_FILES { } else { ch_prepared_fasta = [ [:], fasta ] } - + // if clair3 model is specified, then download that // otherwise use info in bam header and download that basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> - def id_new = basecall_model_meta ? clair3_modelMap.get(basecall_model_meta) : basecall_model_meta + def id_new = basecall_model_meta ? clair3_modelMap.get(basecall_model_meta) : basecall_model_meta def meta_new = [id: id_new] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model def download_prefix = ( basecall_model_meta == 'hifi_revio' ? "https://www.bio8.cs.hku.hk/clair3/clair3_models/" : "https://cdn.oxfordnanoportal.com/software/analysis/models/clair3" ) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 3a998f61..87ffb905 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -41,7 +41,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .set{downloaded_clair3_models} downloaded_clair3_models.view() - + mixed_bams.normal .map{ meta, bam, bai -> return [ meta, meta.clair3_model, bam, bai ] diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index ab611a20..73f07f48 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -117,12 +117,12 @@ workflow LRSOMATIC { def chosen_clairS_model = meta.clairS_model ?: clairs_modelMap.get(basecall_model_meta) def meta_new =[ id: meta.id, paired_data: meta.paired_data, - type: meta.type, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - clair3_model: chosen_clair3_model, - clairS_model : chosen_clairS_model, + type: meta.type, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + clair3_model: chosen_clair3_model, + clairS_model : chosen_clairS_model, clairSTO_model: chosen_clairSTO_model, kinetics: kinetics_meta] return[ meta_new, bam ] @@ -215,7 +215,7 @@ workflow LRSOMATIC { ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai - + // ASCAT files allele_files = PREPARE_REFERENCE_FILES.out.allele_files From 8829eb0da18d90fe7f50cd3bad127fd1add00008 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 8 Jan 2026 17:52:00 +0100 Subject: [PATCH 062/183] remove views --- subworkflows/local/tumor_normal_happhase.nf | 3 --- workflows/lrsomatic.nf | 2 -- 2 files changed, 5 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 87ffb905..b183c339 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -40,7 +40,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{downloaded_clair3_models} - downloaded_clair3_models.view() mixed_bams.normal .map{ meta, bam, bai -> @@ -48,7 +47,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set { normal_bams_model } - normal_bams_model.view() normal_bams_model .combine(downloaded_clair3_models,by:1) @@ -58,7 +56,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ normal_bams } - normal_bams.view() /* .map{ basecall_model, meta, bam, bai, meta2, model -> def platform = (meta.platform == "pb") ? "hifi" : "ont" diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 73f07f48..6767cfb8 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -170,7 +170,6 @@ workflow LRSOMATIC { .mix ( ch_split.single ) .set { ch_cat_ubams } - ch_cat_ubams.view() // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated unaligned bams @@ -342,7 +341,6 @@ workflow LRSOMATIC { // ch_minimap_bams into tumor and paired to phase the paired ones on normal // and add index - ch_minimap_bam.view() ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) .branch { meta, bams, bais -> From e7141572ea7a5e6f331b4f83096d5be44a40bfdf Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 09:36:58 +0100 Subject: [PATCH 063/183] update ascat pdf plot schema --- nextflow_schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/nextflow_schema.json b/nextflow_schema.json index 56fefa96..b65a6ca6 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -166,6 +166,11 @@ "ascat_rt_files": { "type": "string", "description": "path to (zip) of RT files" + }, + "ascat_pdf_plots": { + "type": "string", + "description": "Boolean for ASCAT production of pdf plots (entered as string)", + "enum": ["TRUE", "FALSE"] } } }, From d6b8f5eff54169885cb1670bbfa976cb1f7fb867 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 09:44:19 +0100 Subject: [PATCH 064/183] update ascat to pass pdf plots as boolean and use in module as string --- modules/nf-core/ascat/main.nf | 2 +- nextflow.config | 2 +- nextflow_schema.json | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index fa82efe6..fb34f18e 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -42,7 +42,7 @@ process ASCAT { def penalty = args.penalty ? "$args.penalty" : "NULL" def gc_input = gc_file ? "$gc_file" : "NULL" def rt_input = rt_file ? "$rt_file" : "NULL" - def pdf_plots = args.pdf_plots ? "$args.pdf_plots" : "NULL" + def pdf_plots = args.pdf_plots ? ("$args.pdf_plots" == true ? "TRUE": "FALSE") : "NULL" def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" diff --git a/nextflow.config b/nextflow.config index 5e93950f..bdeccd83 100644 --- a/nextflow.config +++ b/nextflow.config @@ -55,7 +55,7 @@ params { ascat_penalty = 150 ascat_purity = null ascat_longread_bins = 2000 - ascat_pdf_plots = "FALSE" + ascat_pdf_plots = false ascat_allelecounter_flags = "-f 0" ascat_chroms = null // Only use if running on a subset of chromosomes (c(1:22, 'X', 'Y')) diff --git a/nextflow_schema.json b/nextflow_schema.json index b65a6ca6..23fa710a 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -168,9 +168,8 @@ "description": "path to (zip) of RT files" }, "ascat_pdf_plots": { - "type": "string", - "description": "Boolean for ASCAT production of pdf plots (entered as string)", - "enum": ["TRUE", "FALSE"] + "type": "boolean", + "description": "Boolean for ASCAT production of pdf plots (entered as string)" } } }, From c366f9895093484f5c26e49af02109250e3ec457 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 10:15:34 +0100 Subject: [PATCH 065/183] change clairs clairsto channel structure --- subworkflows/local/tumor_normal_happhase.nf | 3 +-- subworkflows/local/tumor_only_happhase.nf | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index b183c339..5fa9fc58 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -257,8 +257,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Get ClairS input channel tumor_normal_severus .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> - def model = (!meta.clairS_model || meta.clairS_model.toString().trim() in ['', '[]']) ? clairs_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairS_model - return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, model] + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] } .set { clairs_input } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 2b5b351a..2077a42d 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -25,8 +25,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams .map{ meta, bam, bai -> - def clairSTO_model = (!meta.clairSTO_model || meta.clairSTO_model.toString().trim() in ['', '[]']) ? clairSTO_modelMap.get(meta.basecall_model.toString().trim()) : meta.clairSTO_model - return [meta, bam, bai, clairSTO_model] + return [meta, bam, bai, meta.clairSTO_model] } .set{ tumor_bams } From 319c28542bfbf5878e748095940a1396da039b8a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 10:16:17 +0100 Subject: [PATCH 066/183] remove obsolete reference --- subworkflows/local/tumor_only_happhase.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 2077a42d..621e2ed5 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -166,8 +166,8 @@ workflow TUMOR_ONLY_HAPPHASE { paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, - fiber: meta.fiber, - basecall_model: meta.basecall_model] + fiber: meta.fiber + ] return [new_meta, hap_bam, hap_bai, [], [], vcf] } .set{ tumor_only_severus } From 2d155984bcfd255a2199237862b8e9e799262cf5 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 10:36:20 +0100 Subject: [PATCH 067/183] remove obsolete ref --- subworkflows/local/tumor_normal_happhase.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 5fa9fc58..c66377cb 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -231,7 +231,6 @@ workflow TUMOR_NORMAL_HAPPHASE { platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - basecall_model: meta.basecall_model, clairS_model: meta.clairS_model] return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] } From fc2a4f452b796ac7b9cac9a27da5d295c1ae2b88 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 14:55:47 +0100 Subject: [PATCH 068/183] change channel structure --- subworkflows/local/tumor_normal_happhase.nf | 30 ++++++++++++++------- subworkflows/local/tumor_only_happhase.nf | 7 +++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index c66377cb..d9102cbd 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -21,7 +21,6 @@ workflow TUMOR_NORMAL_HAPPHASE { tumor_only_severus = channel.empty() somatic_vep = channel.empty() germline_vep = channel.empty() - // Branch input bams in normal and tumour mixed_bams .branch{ meta, bam, bai -> @@ -43,7 +42,16 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_bams.normal .map{ meta, bam, bai -> - return [ meta, meta.clair3_model, bam, bai ] + def new_meta = [id: meta.id, + paired_data: meta.paired_data, + platform: meta.platform, + sex: meta.sex, + fiber: meta.fiber, + clair3_model: meta.clair3_model, + clairS_model : meta.clairS_model, + clairSTO_model: meta.clairSTO_model, + kinetics: meta.kinetics] + return [ new_meta, meta.clair3_model, bam, bai ] } .set { normal_bams_model } @@ -74,18 +82,20 @@ workflow TUMOR_NORMAL_HAPPHASE { // remove type from so that information can be merged easier later mixed_bams.tumor .map{ meta, bam, bai -> - def basecall_model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? meta.basecall_model : meta.clair3_model def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - basecall_model: basecall_model, - clairS_model: meta.clairS_model] + clair3_model: meta.clair3_model, + clairS_model : meta.clairS_model, + clairSTO_model: meta.clairSTO_model, + kinetics: meta.kinetics] return[new_meta, bam, bai] } .set{ tumor_bams } + // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -163,6 +173,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add phased vcf to tumour bams and type information // mix with the normal bams + tumor_bams .join(LONGPHASE_PHASE.out.snv_vcf) .map { meta, bam, bai, vcf -> @@ -212,13 +223,11 @@ workflow TUMOR_NORMAL_HAPPHASE { ) ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) - // Add index to channel mixed_bams_vcf .join(mixed_hapbams) .join(SAMTOOLS_INDEX.out.bai) .set{ mixed_hapbams } - // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bams: haplotagged aligned bams // bais: indexes for bam files @@ -231,7 +240,10 @@ workflow TUMOR_NORMAL_HAPPHASE { platform: meta.platform, sex: meta.sex, fiber: meta.fiber, - clairS_model: meta.clairS_model] + clair3_model: meta.clair3_model, + clairS_model : meta.clairS_model, + clairSTO_model: meta.clairSTO_model, + kinetics: meta.kinetics] return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] } .groupTuple(size: 2) @@ -245,7 +257,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .join(LONGPHASE_PHASE.out.snv_vcf) .set{tumor_normal_severus} - // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // tumor_bam: haplotagged aligned bam for tumor // tumor_bai: indexes for tumor bam files @@ -259,7 +270,6 @@ workflow TUMOR_NORMAL_HAPPHASE { return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] } .set { clairs_input } - // // MODULE: CLAIRS // diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 621e2ed5..9cd71048 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -166,8 +166,11 @@ workflow TUMOR_ONLY_HAPPHASE { paired_data: meta.paired_data, platform: meta.platform, sex: meta.sex, - fiber: meta.fiber - ] + fiber: meta.fiber, + clair3_model: meta.clair3_model, + clairS_model : meta.clairS_model, + clairSTO_model: meta.clairSTO_model, + kinetics: meta.kinetics] return [new_meta, hap_bam, hap_bai, [], [], vcf] } .set{ tumor_only_severus } From 02ac2e80efb5ab3c91a9f1128cc670f390fb01fd Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 17:09:56 +0100 Subject: [PATCH 069/183] update snapshot --- tests/default.nf.test | 24 ++++++++++++++ tests/default.nf.test.snap | 67 +++++++++++++++++++++++++++++++++++++- 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/tests/default.nf.test b/tests/default.nf.test index d4daad19..54c2e525 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -19,6 +19,30 @@ nextflow_pipeline { def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( { assert workflow.success}, + { //files exist + assert file("$launchDir/output/sample1/variants/clair3/merge_output.vcf.gz").exists() + assert file("$launchDir/output/sample1/variants/clair3/merge_output.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample1/variants/clairs/indel.vcf.gz").exists() + assert file("$launchDir/output/sample1/variants/clairs/indel.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample1/variants/clairs/snvs.vcf.gz").exists() + assert file("$launchDir/output/sample1/variants/clairs/snvs.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz").exists() + assert file("$launchDir/output/sample2/variants/clair3/merge_output.vcf.gz").exists() + assert file("$launchDir/output/sample2/variants/clair3/merge_output.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample2/variants/clairs/indel.vcf.gz").exists() + assert file("$launchDir/output/sample2/variants/clairs/indel.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample2/variants/clairs/snvs.vcf.gz").exists() + assert file("$launchDir/output/sample2/variants/clairs/snvs.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz").exists() + assert file("$launchDir/output/sample1/bamfiles/sample1_normal.bam").exists() + assert file("$launchDir/output/sample1/bamfiles/sample1_tumor.bam").exists() + assert file("$launchDir/output/sample1/bamfiles/sample1_normal.bam.bai").exists() + assert file("$launchDir/output/sample1/bamfiles/sample1_tumor.bam.bai").exists() + assert file("$launchDir/output/sample3/variants/clairsto/indel.vcf.gz").exists() + assert file("$launchDir/output/sample3/variants/clairsto/snv.vcf.gz").exists() + assert file("$launchDir/output/sample3/variants/clairsto/somatic.vcf.gz").exists() + assert file("$launchDir/output/sample3/variants/clairsto/germline.vcf.gz").exists() + }, { assert snapshot( // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions removeNextflowVersion("$outputDir/pipeline_info/lrsomatic_software_mqc_versions.yml"), diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 95ecedbb..6a1cd3ce 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,9 +2,18 @@ "-profile test": { "content": [ { + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, "CLAIR3": { "clair3": "1.2.0" }, + "CLAIRS": { + "clairs": "0.4.4" + }, "CLAIRSTO": { "clairsto": "0.4.2" }, @@ -113,6 +122,8 @@ "sample1/bamfiles", "sample1/bamfiles/sample1_normal.bam", "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", @@ -142,15 +153,39 @@ "sample1/variants/clair3", "sample1/variants/clair3/merge_output.vcf.gz", "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", "sample1/vep/germline", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample2", "sample2/bamfiles", "sample2/bamfiles/sample2_normal.bam", "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", @@ -180,11 +215,33 @@ "sample2/variants/clair3", "sample2/variants/clair3/merge_output.vcf.gz", "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", "sample2/vep/germline", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample3", "sample3/bamfiles", "sample3/bamfiles/sample3_tumor.bam", @@ -238,6 +295,8 @@ [ "sample1_normal.bam:md5,60838033f5f24aa90e16a5babcddd45b", "sample1_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", + "sample1_tumor.bam:md5,bd73e83253c95a5fdc4db39454ee2253", + "sample1_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", @@ -248,8 +307,12 @@ "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", + "breakpoints_double.csv:md5,57e4f0d5509db44179e7c5044c6bc259", + "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", "sample2_normal.bam:md5,554b89692e84b9ddd0615649e2b15820", "sample2_normal.bam.bai:md5,af193f1922d90b8741212d2bf690c418", + "sample2_tumor.bam:md5,26c4e52c12aa0e874fe52ae3b729beba", + "sample2_tumor.bam.bai:md5,e9e64e13328aa3621e7976f8e3f29a78", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", @@ -260,6 +323,8 @@ "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,defe74842396209b6cff4b32994287c7", + "breakpoints_double.csv:md5,b71bba578c126b9217765d854b21028a", + "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", @@ -275,6 +340,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-01-08T17:23:32.905484266" + "timestamp": "2026-01-09T17:08:56.493545818" } } \ No newline at end of file From 4541fb8e4c26776e5ce8f7a4d1f54af3cadeb45f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 9 Jan 2026 17:10:34 +0100 Subject: [PATCH 070/183] prettier --- tests/default.nf.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/default.nf.test b/tests/default.nf.test index 54c2e525..160dc01e 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -41,7 +41,7 @@ nextflow_pipeline { assert file("$launchDir/output/sample3/variants/clairsto/indel.vcf.gz").exists() assert file("$launchDir/output/sample3/variants/clairsto/snv.vcf.gz").exists() assert file("$launchDir/output/sample3/variants/clairsto/somatic.vcf.gz").exists() - assert file("$launchDir/output/sample3/variants/clairsto/germline.vcf.gz").exists() + assert file("$launchDir/output/sample3/variants/clairsto/germline.vcf.gz").exists() }, { assert snapshot( // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions From a53b2ef6cfa86ccc52b7b064bf3326b02f8bc1a5 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 12 Jan 2026 15:28:51 +0100 Subject: [PATCH 071/183] minor fixes --- subworkflows/local/tumor_normal_happhase.nf | 10 ++++------ subworkflows/local/tumor_only_happhase.nf | 2 +- workflows/lrsomatic.nf | 5 ++--- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index d9102cbd..81d08f91 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -21,6 +21,7 @@ workflow TUMOR_NORMAL_HAPPHASE { tumor_only_severus = channel.empty() somatic_vep = channel.empty() germline_vep = channel.empty() + // Branch input bams in normal and tumour mixed_bams .branch{ meta, bam, bai -> @@ -39,7 +40,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{downloaded_clair3_models} - mixed_bams.normal .map{ meta, bam, bai -> def new_meta = [id: meta.id, @@ -48,14 +48,13 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, clair3_model: meta.clair3_model, - clairS_model : meta.clairS_model, + clairS_model: meta.clairS_model, clairSTO_model: meta.clairSTO_model, kinetics: meta.kinetics] return [ new_meta, meta.clair3_model, bam, bai ] } .set { normal_bams_model } - normal_bams_model .combine(downloaded_clair3_models,by:1) .map {clair3_model, meta_bam, bam, bai, meta_model, model -> @@ -88,14 +87,13 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, clair3_model: meta.clair3_model, - clairS_model : meta.clairS_model, + clairS_model: meta.clairS_model, clairSTO_model: meta.clairSTO_model, kinetics: meta.kinetics] return[new_meta, bam, bai] } .set{ tumor_bams } - // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] // bam: list of concatenated aligned bams // bai: indexes for bam files @@ -241,7 +239,7 @@ workflow TUMOR_NORMAL_HAPPHASE { sex: meta.sex, fiber: meta.fiber, clair3_model: meta.clair3_model, - clairS_model : meta.clairS_model, + clairS_model: meta.clairS_model, clairSTO_model: meta.clairSTO_model, kinetics: meta.kinetics] return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 9cd71048..16b8ce90 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -168,7 +168,7 @@ workflow TUMOR_ONLY_HAPPHASE { sex: meta.sex, fiber: meta.fiber, clair3_model: meta.clair3_model, - clairS_model : meta.clairS_model, + clairS_model: meta.clairS_model, clairSTO_model: meta.clairSTO_model, kinetics: meta.kinetics] return [new_meta, hap_bam, hap_bai, [], [], vcf] diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 6767cfb8..a7eb1861 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -122,7 +122,7 @@ workflow LRSOMATIC { sex: meta.sex, fiber: meta.fiber, clair3_model: chosen_clair3_model, - clairS_model : chosen_clairS_model, + clairS_model: chosen_clairS_model, clairSTO_model: chosen_clairSTO_model, kinetics: kinetics_meta] return[ meta_new, bam ] @@ -214,8 +214,6 @@ workflow LRSOMATIC { ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai - - // ASCAT files allele_files = PREPARE_REFERENCE_FILES.out.allele_files loci_files = PREPARE_REFERENCE_FILES.out.loci_files @@ -341,6 +339,7 @@ workflow LRSOMATIC { // ch_minimap_bams into tumor and paired to phase the paired ones on normal // and add index + ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) .branch { meta, bams, bais -> From feea69d2a4d07ca832cbf25bd30c1bedea1fff4d Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 6 Feb 2026 17:20:38 +0100 Subject: [PATCH 072/183] ascat raw segments txt files added to output --- docs/output.md | 2 ++ modules/nf-core/ascat/ascat.diff | 4 +++- modules/nf-core/ascat/main.nf | 3 ++- modules/nf-core/ascat/tests/main.nf.test | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/output.md b/docs/output.md index 8974a1e7..9e2070b8 100644 --- a/docs/output.md +++ b/docs/output.md @@ -73,6 +73,7 @@ The directories listed below will be created in the results directory after the │ ├── sample.normal_alleleFrequencies_chr(1-22,X).txt │ ├── sample.purityploidy.txt │ ├── sample.segments.txt +│ ├── sample.segments_raw.txt │ ├── sample.tumour_alleleFrequencies_chr(1-22,X).txt │ ├── sample.tumour_normalBAF_rawBAF.txt │ ├── sample.tumour_normalBAF.txt @@ -92,6 +93,7 @@ The directories listed below will be created in the results directory after the | `sample.normal_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the normal sample at each position and their respective depths | | `sample.purityploidy.txt` | a tsv file describing the purity and ploidy values of the sample | | `sample.segments.txt` | a tsv file describing each chromosome segment and it's major and minor copy number | +| `sample.segments_raw.txt` | a tsv file describing each chromosome segment and it's major and minor rounded and raw copy number | | `sample.tumour_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the tumor sample at each position and their respective depths | | `sample.tumour_normalBAF_rawBAF.txt` | a tsv file with the raw BAF values in the normal sample | | `sample.tumour_normalBAF.txt` | a tsv file with the BAF values in the normal sample | diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index 7f939017..ced55570 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -342,7 +342,7 @@ Changes in 'ascat/main.nf': + tryCatch({ # In case segments_raw is not selected + write.table( + ascat.output[["segments_raw"]], -+ file = paste0(prefix, ".segments_raw.txt"), ++ file = paste0("$prefix", ".segments_raw.txt"), + sep = "\t", quote = FALSE, row.names = FALSE + ) + }, error = function(e) { @@ -400,6 +400,7 @@ Changes in 'ascat/main.nf': - touch ${prefix}.normal_alleleFrequencies_chr22.txt - touch ${prefix}.purityploidy.txt - touch ${prefix}.segments.txt +- touch ${prefix}.segments_raw.txt - touch ${prefix}.tumour.ASPCF.png - touch ${prefix}.tumour.sunrise.png - touch ${prefix}.tumour_alleleFrequencies_chr21.txt @@ -426,6 +427,7 @@ Changes in 'ascat/main.nf': + echo stub > ${prefix}.normal_alleleFrequencies_chr22.txt + echo stub > ${prefix}.purityploidy.txt + echo stub > ${prefix}.segments.txt ++ echo stub > ${prefix}.segments_raw.txt + echo stub > ${prefix}.tumour.ASPCF.png + echo stub > ${prefix}.tumour.sunrise.png + echo stub > ${prefix}.tumour_alleleFrequencies_chr21.txt diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index fb34f18e..1bbead2d 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -173,7 +173,7 @@ process ASCAT { tryCatch({ # In case segments_raw is not selected write.table( ascat.output[["segments_raw"]], - file = paste0(prefix, ".segments_raw.txt"), + file = paste0("$prefix", ".segments_raw.txt"), sep = "\t", quote = FALSE, row.names = FALSE ) }, error = function(e) { @@ -221,6 +221,7 @@ process ASCAT { echo stub > ${prefix}.normal_alleleFrequencies_chr22.txt echo stub > ${prefix}.purityploidy.txt echo stub > ${prefix}.segments.txt + echo stub > ${prefix}.segments_raw.txt echo stub > ${prefix}.tumour.ASPCF.png echo stub > ${prefix}.tumour.sunrise.png echo stub > ${prefix}.tumour_alleleFrequencies_chr21.txt diff --git a/modules/nf-core/ascat/tests/main.nf.test b/modules/nf-core/ascat/tests/main.nf.test index 527fbc26..759abb38 100644 --- a/modules/nf-core/ascat/tests/main.nf.test +++ b/modules/nf-core/ascat/tests/main.nf.test @@ -55,6 +55,7 @@ nextflow_process { process.out.png.collect{it[1].collect{file(it).name}}, process.out.purityploidy, process.out.segments, + process.out.segments_raw, process.out.versions, path(process.out.versions[0]).yaml ).match() } @@ -109,6 +110,7 @@ nextflow_process { process.out.png.collect{it[1].collect{file(it).name}}, process.out.purityploidy, process.out.segments, + process.out.segments_raw, process.out.versions, path(process.out.versions[0]).yaml ).match() } @@ -163,6 +165,7 @@ nextflow_process { process.out.png.collect{it[1].collect{file(it).name}}, process.out.purityploidy, process.out.segments, + process.out.segments_raw, process.out.versions, path(process.out.versions[0]).yaml ).match() } @@ -218,6 +221,7 @@ nextflow_process { process.out.png.collect{it[1].collect{file(it).name}}, process.out.purityploidy, process.out.segments, + process.out.segments_raw, process.out.versions, path(process.out.versions[0]).yaml ).match() } @@ -296,6 +300,7 @@ nextflow_process { process.out.png.collect{it[1].collect{file(it).name}}, process.out.purityploidy, process.out.segments, + process.out.segments_raw, process.out.versions, path(process.out.versions[0]).yaml ).match() } From 87debc2c1b67dd8e81f649ccff02edfea640ab80 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 6 Feb 2026 17:37:13 +0100 Subject: [PATCH 073/183] prettier --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 9e2070b8..9251e4e5 100644 --- a/docs/output.md +++ b/docs/output.md @@ -93,7 +93,7 @@ The directories listed below will be created in the results directory after the | `sample.normal_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the normal sample at each position and their respective depths | | `sample.purityploidy.txt` | a tsv file describing the purity and ploidy values of the sample | | `sample.segments.txt` | a tsv file describing each chromosome segment and it's major and minor copy number | -| `sample.segments_raw.txt` | a tsv file describing each chromosome segment and it's major and minor rounded and raw copy number | +| `sample.segments_raw.txt` | a tsv file describing each chromosome segment and it's major and minor rounded and raw copy number | | `sample.tumour_alleleFrequencies_chr(1-22,X).txt` | a tsv file describing the snp counts for the tumor sample at each position and their respective depths | | `sample.tumour_normalBAF_rawBAF.txt` | a tsv file with the raw BAF values in the normal sample | | `sample.tumour_normalBAF.txt` | a tsv file with the BAF values in the normal sample | From c34899f6fd2c409e004d9a226364a78953b240d3 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 6 Feb 2026 18:39:37 +0100 Subject: [PATCH 074/183] diff file restore --- modules/nf-core/ascat/ascat.diff | 76 ++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index ced55570..e6f71257 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -1,9 +1,7 @@ -Changes in component 'nf-core/ascat' -'modules/nf-core/ascat/meta.yml' is unchanged -Changes in 'ascat/main.nf': +Changes in module 'nf-core/ascat' --- modules/nf-core/ascat/main.nf +++ modules/nf-core/ascat/main.nf -@@ -1,211 +1,189 @@ +@@ -1,211 +1,190 @@ process ASCAT { - tag "${meta.id}" + tag "$meta.id" @@ -98,6 +96,7 @@ Changes in 'ascat/main.nf': + def penalty = args.penalty ? "$args.penalty" : "NULL" + def gc_input = gc_file ? "$gc_file" : "NULL" + def rt_input = rt_file ? "$rt_file" : "NULL" ++ def pdf_plots = args.pdf_plots ? ("$args.pdf_plots" == true ? "TRUE": "FALSE") : "NULL" + + def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" + def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" @@ -112,7 +111,7 @@ Changes in 'ascat/main.nf': + def normal_bam = input_normal ? ",normalseqfile = '$input_normal'" : "" + def normal_name = input_normal ? ",normalname = '${prefix}.normal'" : "" + def longread_bins = args.longread_bins ? ",loci_binsize = $args.longread_bins" : "" -+ def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" ++ def allele_counter_flags = args.allele_counter_flags ? ",additional_allelecounter_flags = '$args.allele_counter_flags'" : "" """ #!/usr/bin/env Rscript library(RColorBrewer) @@ -318,16 +317,19 @@ Changes in 'ascat/main.nf': + #Run ASCAT to fit every tumor to a model, inferring ploidy, normal cell contamination, and discrete copy numbers + #If psi and rho are manually set: + if (!is.null($purity) && !is.null($ploidy)){ -+ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy) ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, psi_manual=$ploidy, pdfPlot = $pdf_plots) + } else if(!is.null($purity) && is.null($ploidy)){ -+ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity) ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, rho_manual=$purity, pdfPlot = $pdf_plots) + } else if(!is.null($ploidy) && is.null($purity)){ -+ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy) ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, psi_manual=$ploidy, pdfPlot = $pdf_plots) } else { - ascat.output <- ascat.runAscat(ascat.bc, gamma=1) - } - +- ascat.output <- ascat.runAscat(ascat.bc, gamma=1) +- } +- - # Extract metrics from ASCAT profiles ++ ascat.output <- ascat.runAscat(ascat.bc, gamma=1, pdfPlot = $pdf_plots) ++ } ++ + #Extract metrics from ASCAT profiles QC = ascat.metrics(ascat.bc,ascat.output) @@ -360,7 +362,7 @@ Changes in 'ascat/main.nf': summary <- tryCatch({ matrix(c(ascat.output[["aberrantcellfraction"]], ascat.output[["ploidy"]]), ncol=2, byrow=TRUE)}, error = function(err) { # error handler picks up where error was generated -@@ -214,46 +192,47 @@ +@@ -214,46 +193,48 @@ } ) colnames(summary) <- c("AberrantCellFraction","Ploidy") @@ -400,7 +402,6 @@ Changes in 'ascat/main.nf': - touch ${prefix}.normal_alleleFrequencies_chr22.txt - touch ${prefix}.purityploidy.txt - touch ${prefix}.segments.txt -- touch ${prefix}.segments_raw.txt - touch ${prefix}.tumour.ASPCF.png - touch ${prefix}.tumour.sunrise.png - touch ${prefix}.tumour_alleleFrequencies_chr21.txt @@ -439,13 +440,52 @@ Changes in 'ascat/main.nf': + + echo "${task.process}:" > versions.yml + echo ' alleleCounter: 4.3.0' >> versions.yml -+ echo ' ascat: 3.0.0' >> versions.yml ++ echo ' ascat: 3.2.0' >> versions.yml + + """ + +} -'modules/nf-core/ascat/environment.yml' is unchanged -'modules/nf-core/ascat/tests/main.nf.test' is unchanged -'modules/nf-core/ascat/tests/main.nf.test.snap' is unchanged -'modules/nf-core/ascat/tests/nextflow.config' is unchanged +--- modules/nf-core/ascat/tests/main.nf.test ++++ modules/nf-core/ascat/tests/main.nf.test +@@ -55,6 +55,7 @@ + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, ++ process.out.segments_raw, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } +@@ -109,6 +110,7 @@ + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, ++ process.out.segments_raw, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } +@@ -163,6 +165,7 @@ + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, ++ process.out.segments_raw, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } +@@ -218,6 +221,7 @@ + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, ++ process.out.segments_raw, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } +@@ -296,6 +300,7 @@ + process.out.png.collect{it[1].collect{file(it).name}}, + process.out.purityploidy, + process.out.segments, ++ process.out.segments_raw, + process.out.versions, + path(process.out.versions[0]).yaml + ).match() } + ************************************************************ From db09cadb31abb669453116c0b5d6f0b5ac1dadd6 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Fri, 6 Feb 2026 19:05:27 +0100 Subject: [PATCH 075/183] fixed pdf plots arg --- modules/nf-core/ascat/ascat.diff | 7 +++---- modules/nf-core/ascat/main.nf | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/nf-core/ascat/ascat.diff b/modules/nf-core/ascat/ascat.diff index e6f71257..a0222866 100644 --- a/modules/nf-core/ascat/ascat.diff +++ b/modules/nf-core/ascat/ascat.diff @@ -1,7 +1,7 @@ Changes in module 'nf-core/ascat' --- modules/nf-core/ascat/main.nf +++ modules/nf-core/ascat/main.nf -@@ -1,211 +1,190 @@ +@@ -1,211 +1,189 @@ process ASCAT { - tag "${meta.id}" + tag "$meta.id" @@ -96,8 +96,7 @@ Changes in module 'nf-core/ascat' + def penalty = args.penalty ? "$args.penalty" : "NULL" + def gc_input = gc_file ? "$gc_file" : "NULL" + def rt_input = rt_file ? "$rt_file" : "NULL" -+ def pdf_plots = args.pdf_plots ? ("$args.pdf_plots" == true ? "TRUE": "FALSE") : "NULL" -+ ++ def pdf_plots = (args.pdf_plots ?: false) ? "TRUE" : "FALSE" + def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" + def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" + def chrom_names_arg = args.chrom_names ? ",chrom_names = $args.chrom_names" : "" @@ -362,7 +361,7 @@ Changes in module 'nf-core/ascat' summary <- tryCatch({ matrix(c(ascat.output[["aberrantcellfraction"]], ascat.output[["ploidy"]]), ncol=2, byrow=TRUE)}, error = function(err) { # error handler picks up where error was generated -@@ -214,46 +193,48 @@ +@@ -214,46 +192,48 @@ } ) colnames(summary) <- c("AberrantCellFraction","Ploidy") diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index 1bbead2d..01641e1e 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -42,8 +42,7 @@ process ASCAT { def penalty = args.penalty ? "$args.penalty" : "NULL" def gc_input = gc_file ? "$gc_file" : "NULL" def rt_input = rt_file ? "$rt_file" : "NULL" - def pdf_plots = args.pdf_plots ? ("$args.pdf_plots" == true ? "TRUE": "FALSE") : "NULL" - + def pdf_plots = (args.pdf_plots ?: false) ? "TRUE" : "FALSE" def minCounts_arg = args.minCounts ? ",minCounts = $args.minCounts" : "" def bed_file_arg = bed_file ? ",BED_file = '$bed_file'": "" def chrom_names_arg = args.chrom_names ? ",chrom_names = $args.chrom_names" : "" From 6dad5017f6c81a9db37bf7ae0afac982f6cbcf85 Mon Sep 17 00:00:00 2001 From: Amber Verhasselt Date: Mon, 9 Feb 2026 11:20:03 +0100 Subject: [PATCH 076/183] added pdf plots ascat to usage --- docs/usage.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/usage.md b/docs/usage.md index dc14d048..448cf7d3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -153,6 +153,7 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c | `--ascat_loci_files` | A full path to a zipped folder containing loci files for [ASCAT](https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Must be zipped and have `.zip` format. Default = `null` | | `--ascat_gc_file` | A full path to a GC correction file for [ASCAT](https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | | `--ascat_rt_file` | A full path to a replication timing correction file for [ASCAT](https://github.com/VanLoo-lab/ascat/tree/master/ReferenceFiles/WGS). Optionally can be zipped and have either `.txt` or `.txt.zip` format. Default = `null` | +| `--ascat_pdf_plots` | string to enable output pltos in pdf format. Default = `false` | ### Updating the pipeline From 9c19b9b39ac4374388d07d031ee54e3c4f77d14a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 2 Mar 2026 11:54:29 +0100 Subject: [PATCH 077/183] add skip_m6a param --- nextflow.config | 1 + workflows/lrsomatic.nf | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/nextflow.config b/nextflow.config index bdeccd83..b03dbed8 100644 --- a/nextflow.config +++ b/nextflow.config @@ -37,6 +37,7 @@ params { skip_ascat = false skip_wakhan = false skip_fiber = false + skip_m6a = false skip_vep = false // minimap2 options diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index a7eb1861..0f670505 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -255,13 +255,21 @@ workflow LRSOMATIC { } .set{pacbio_bams} - FIBERTOOLSRS_PREDICTM6A ( - pacbio_bams.kinetics - ) + if (!params.skip_m6a){ + FIBERTOOLSRS_PREDICTM6A ( + pacbio_bams.kinetics + ) + pacbio_bams.noKinetics + .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) + .set{predicted_bams} + } + else { + pacbio_bams.noKinetics + .mix(pacbio_bams.kinetics) + .set{predicted_bams} + } - pacbio_bams.noKinetics - .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) - .set{predicted_bams} + ch_cat_ubams_pacbio_ont_branching.ont .mix(predicted_bams) From ee1ba7fc976a3e701d3b577bbe618e0b1c566b5d Mon Sep 17 00:00:00 2001 From: Tim Yu Date: Fri, 6 Mar 2026 09:14:30 +0000 Subject: [PATCH 078/183] Fix path pattern for rephased VCF files Missing output file(s) `phasing_output/*.rephased.vcf.gz` expected by process `INTGENOMICSLAB_LRSOMATIC:LRSOMATIC:WAKHAN --- modules/local/wakhan/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 49c596c5..5e936296 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -32,8 +32,8 @@ process WAKHAN { tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf tuple val(meta), path("phasing_output/*.html") , emit: phasing_html tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf - tuple val(meta), path("phasing_output/*.rephased.vcf.gz") , emit: rephased_vcf - tuple val(meta), path("phasing_output/*.rephased.vcf.gz.csi") , emit: rephased_vcf_index + tuple val(meta), path("phasing_output/*rephased.vcf.gz") , emit: rephased_vcf + tuple val(meta), path("phasing_output/*rephased.vcf.gz.csi") , emit: rephased_vcf_index tuple val(meta), path("snps_loh_plots/*_genome_snps_ratio_loh.html") , emit: snps_loh_plot, optional: true tuple val(meta), path("solutions_ranks.tsv") , emit: solutions_ranks // WARN: Manually update version information as tool does not provide on CLI From 89a325e188e821dd6d3f77de8ace96a97c64772e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 9 Mar 2026 10:46:41 +0100 Subject: [PATCH 079/183] added updated wakhan version --- modules/local/wakhan/environment.yml | 2 +- modules/local/wakhan/main.nf | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/local/wakhan/environment.yml b/modules/local/wakhan/environment.yml index a1450d1b..e26b3ee4 100644 --- a/modules/local/wakhan/environment.yml +++ b/modules/local/wakhan/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::wakhan=0.1.1" + - "bioconda::wakhan=0.4.2" diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 5e936296..27a3b976 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -3,9 +3,9 @@ process WAKHAN { label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/wakhan:0.2.0--pyhdfd78af_1': - 'biocontainers/wakhan:0.2.0--pyhdfd78af_1' }" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/wakhan:0.4.2--pyhdfd78af_0': + 'biocontainers/wakhan:0.4.2--pyhdfd78af_0' }" input: tuple val(meta), path(tumor_input), path(tumor_index), path(normal_input), path(normal_index), path(vcf), path(breakpoints) From fefdf95b67905296a9583815110bf0839008cb34 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Mon, 9 Mar 2026 10:50:05 +0100 Subject: [PATCH 080/183] prettier --- modules/local/wakhan/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 27a3b976..d82d0205 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -3,8 +3,8 @@ process WAKHAN { label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/wakhan:0.4.2--pyhdfd78af_0': + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/wakhan:0.4.2--pyhdfd78af_0': 'biocontainers/wakhan:0.4.2--pyhdfd78af_0' }" input: From 2846eab72965148f54704d9c8304d1b9d2dd9282 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 13:51:19 +0100 Subject: [PATCH 081/183] initial syntax changes and bulk modules update --- modules.json | 44 +- modules/nf-core/bcftools/concat/main.nf | 75 +-- modules/nf-core/bcftools/concat/meta.yml | 26 +- .../bcftools/concat/tests/main.nf.test | 15 +- .../bcftools/concat/tests/main.nf.test.snap | 164 +++++-- modules/nf-core/bcftools/merge/main.nf | 81 ++-- modules/nf-core/bcftools/merge/meta.yml | 46 +- .../nf-core/bcftools/merge/tests/bcf.config | 3 - .../bcftools/merge/tests/bcf_gz.config | 3 - .../nf-core/bcftools/merge/tests/main.nf.test | 386 +++++---------- .../bcftools/merge/tests/main.nf.test.snap | 455 +++++++++--------- .../bcftools/merge/tests/nextflow.config | 2 +- .../bcftools/merge/tests/nextflow.gvcf.config | 5 - .../nf-core/bcftools/merge/tests/vcf.config | 3 - .../bcftools/merge/tests/vcf_gz.config | 3 - .../bcftools/merge/tests/vcf_gz_index.config | 3 - .../merge/tests/vcf_gz_index_csi.config | 3 - .../merge/tests/vcf_gz_index_tbi.config | 3 - modules/nf-core/bcftools/sort/main.nf | 74 +-- modules/nf-core/bcftools/sort/meta.yml | 26 +- .../nf-core/bcftools/sort/tests/main.nf.test | 14 +- .../bcftools/sort/tests/main.nf.test.snap | 154 ++++-- .../ensemblvep/download/environment.yml | 4 +- modules/nf-core/ensemblvep/download/main.nf | 17 +- modules/nf-core/ensemblvep/download/meta.yml | 52 +- .../ensemblvep/download/tests/main.nf.test | 8 +- .../download/tests/main.nf.test.snap | 191 ++------ .../ensemblvep/vep/ensemblvep-vep.diff | 25 +- .../nf-core/ensemblvep/vep/environment.yml | 3 +- modules/nf-core/ensemblvep/vep/main.nf | 39 +- modules/nf-core/ensemblvep/vep/meta.yml | 136 +++++- .../nf-core/ensemblvep/vep/tests/main.nf.test | 31 +- .../ensemblvep/vep/tests/main.nf.test.snap | 73 ++- .../ensemblvep/vep/tests/nextflow.config | 2 +- modules/nf-core/minimap2/align/main.nf | 36 +- modules/nf-core/minimap2/align/meta.yml | 26 +- .../nf-core/minimap2/align/tests/main.nf.test | 14 +- .../minimap2/align/tests/main.nf.test.snap | 208 +++++--- modules/nf-core/minimap2/index/main.nf | 12 +- modules/nf-core/minimap2/index/meta.yml | 29 +- .../nf-core/minimap2/index/tests/main.nf.test | 24 +- .../minimap2/index/tests/main.nf.test.snap | 61 ++- modules/nf-core/modkit/pileup/environment.yml | 2 +- modules/nf-core/modkit/pileup/main.nf | 16 +- modules/nf-core/modkit/pileup/meta.yml | 27 +- .../modkit/pileup/tests/main.nf.test.snap | 170 +++++-- modules/nf-core/mosdepth/environment.yml | 3 +- modules/nf-core/mosdepth/main.nf | 25 +- modules/nf-core/mosdepth/meta.yml | 28 +- modules/nf-core/mosdepth/tests/main.nf.test | 68 ++- .../nf-core/mosdepth/tests/main.nf.test.snap | 112 ++++- .../nf-core/mosdepth/tests/nextflow.config | 5 + .../nf-core/mosdepth/tests/quantized.config | 3 - .../nf-core/mosdepth/tests/threshold.config | 3 - modules/nf-core/mosdepth/tests/window.config | 3 - modules/nf-core/multiqc/main.nf | 27 +- modules/nf-core/multiqc/meta.yml | 168 ++++--- modules/nf-core/multiqc/tests/main.nf.test | 129 +++-- .../nf-core/multiqc/tests/main.nf.test.snap | 109 ++++- modules/nf-core/pigz/uncompress/main.nf | 1 - modules/nf-core/pigz/uncompress/meta.yml | 2 +- modules/nf-core/samtools/cat/main.nf | 12 +- modules/nf-core/samtools/cat/meta.yml | 26 +- .../nf-core/samtools/cat/tests/main.nf.test | 28 +- .../samtools/cat/tests/main.nf.test.snap | 142 +++--- modules/nf-core/samtools/faidx/main.nf | 3 +- modules/nf-core/samtools/faidx/meta.yml | 17 +- .../nf-core/samtools/faidx/tests/main.nf.test | 118 ++--- .../samtools/faidx/tests/main.nf.test.snap | 311 +----------- modules/nf-core/samtools/flagstat/main.nf | 12 +- modules/nf-core/samtools/flagstat/meta.yml | 33 +- .../samtools/flagstat/tests/main.nf.test.snap | 40 +- modules/nf-core/samtools/idxstats/main.nf | 12 +- modules/nf-core/samtools/idxstats/meta.yml | 29 +- .../samtools/idxstats/tests/main.nf.test | 10 +- .../samtools/idxstats/tests/main.nf.test.snap | 80 ++- modules/nf-core/samtools/index/main.nf | 12 +- modules/nf-core/samtools/index/meta.yml | 29 +- .../nf-core/samtools/index/tests/main.nf.test | 27 +- .../samtools/index/tests/main.nf.test.snap | 278 ++++------- modules/nf-core/samtools/stats/main.nf | 4 +- modules/nf-core/severus/main.nf | 40 +- modules/nf-core/severus/severus.diff | 88 +--- .../nf-core/severus/tests/main.nf.test.snap | 24 +- modules/nf-core/untar/main.nf | 11 +- modules/nf-core/untar/meta.yml | 28 +- modules/nf-core/untar/tests/main.nf.test | 20 +- modules/nf-core/untar/tests/main.nf.test.snap | 176 +++---- modules/nf-core/unzip/main.nf | 1 - subworkflows/local/prepare_reference_files.nf | 10 +- .../nf-core/bam_stats_samtools/main.nf | 6 - .../bam_stats_samtools/tests/main.nf.test | 9 +- .../tests/main.nf.test.snap | 60 +-- workflows/lrsomatic.nf | 10 +- 94 files changed, 2604 insertions(+), 2582 deletions(-) delete mode 100644 modules/nf-core/bcftools/merge/tests/bcf.config delete mode 100644 modules/nf-core/bcftools/merge/tests/bcf_gz.config delete mode 100644 modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config delete mode 100644 modules/nf-core/bcftools/merge/tests/vcf.config delete mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz.config delete mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz_index.config delete mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config delete mode 100644 modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config create mode 100644 modules/nf-core/mosdepth/tests/nextflow.config delete mode 100644 modules/nf-core/mosdepth/tests/quantized.config delete mode 100644 modules/nf-core/mosdepth/tests/threshold.config delete mode 100644 modules/nf-core/mosdepth/tests/window.config diff --git a/modules.json b/modules.json index a2a488e3..100cd8a1 100644 --- a/modules.json +++ b/modules.json @@ -13,28 +13,28 @@ }, "bcftools/concat": { "branch": "master", - "git_sha": "345b60fff6a192d55c2a220ae413c57f29b698b7", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["vcf_gather_bcftools"], + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", + "installed_by": ["modules", "vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", - "git_sha": "0567eee9276d4a358e5f9f01c810a149fbd241f8", + "git_sha": "90cdd21fd96ccbdb3bc90797ca69570d18391055", "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", - "git_sha": "48ca3de1737b0144aa9fe05bea2b681f0ae45a95", + "git_sha": "890fdcff71928fc1470d3e669d4c430c8c770297", "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, @@ -51,80 +51,80 @@ }, "minimap2/align": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "5c9f8d5b7671237c906abadc9ff732b301ca15ca", "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "14980f759266eec42dac401fcafeb83d6c957b41", "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", - "git_sha": "e8557b97c1e0e3751c5615e1fdbc5e8671eccc76", + "git_sha": "3d81317a30d1016b533982d6b84df07713ae520a", "installed_by": ["modules"] }, "mosdepth": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "6832b69ef7f98c54876d6436360b6b945370c615", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", + "git_sha": "2c73cc8fa92cf48de3da0b643fdf357a8a290b36", "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "f84336b7fa91a65aa61d215b8c109fbb8e4b4ac6", "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "f9edc59be2fe25bb6fc73ca4dfc0d28246f2a2d6", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", + "git_sha": "b2e78932ef01165fd85829513eaca29eff8e640a", "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", - "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", + "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", + "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", - "git_sha": "98a699d12b141aeb3d5da5c98ebd69a320ff350d", + "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", - "git_sha": "00ee87ebb541af0008596400ce6d5f66d79d5408", + "git_sha": "447f7bc0fa41dfc2400c8cad4c0291880dc060cf", "installed_by": ["modules"] }, "unzip": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", "installed_by": ["modules"] }, "wget": { @@ -138,7 +138,7 @@ "nf-core": { "bam_stats_samtools": { "branch": "master", - "git_sha": "0b2435805036a16dcdcf21533632d956b8273ac4", + "git_sha": "7ac6cbe7c17c2dad685da7f70496c8f48ea48687", "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf index 5415b069..269da8e0 100644 --- a/modules/nf-core/bcftools/concat/main.nf +++ b/modules/nf-core/bcftools/concat/main.nf @@ -1,72 +1,73 @@ process BCFTOOLS_CONCAT { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcfs), path(tbi) output: - tuple val(meta), path("${prefix}.${extension}") , emit: vcf + tuple val(meta), path("${prefix}.${extension}"), emit: vcf tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + 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") || tbi_names.contains(vcf.name + ".csi") ? "" : "tabix ${vcf}" }.join("\n ") - extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - def input = vcfs.sort{it.toString()}.join(" ") + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def input = vcfs.sort { vcf -> vcf.toString() }.join(" ") """ ${create_input_index} bcftools concat \\ --output ${prefix}.${extension} \\ - $args \\ - --threads $task.cpus \\ + ${args} \\ + --threads ${task.cpus} \\ ${input} - - 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}" - extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - def index_extension = 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 args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def index_extension = 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_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" def create_index = extension.endsWith(".gz") && index_extension.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index_extension}" : "" """ ${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/concat/meta.yml b/modules/nf-core/bcftools/concat/meta.yml index 5e14b5a3..1734a8c3 100644 --- a/modules/nf-core/bcftools/concat/meta.yml +++ b/modules/nf-core/bcftools/concat/meta.yml @@ -67,13 +67,27 @@ output: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] pattern: "*.csi" + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@abhi18av" - "@nvnieuwk" diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test b/modules/nf-core/bcftools/concat/tests/main.nf.test index 9c4e4baf..58e19991 100644 --- a/modules/nf-core/bcftools/concat/tests/main.nf.test +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test @@ -37,7 +37,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index") { @@ -69,12 +68,11 @@ nextflow_process { 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 + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi") { @@ -106,12 +104,11 @@ nextflow_process { 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 + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi") { @@ -143,12 +140,11 @@ nextflow_process { 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 + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } @@ -177,7 +173,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub") { @@ -209,7 +204,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub") { @@ -242,7 +236,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub") { @@ -275,7 +268,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub") { @@ -308,7 +300,6 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } diff --git a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap index 8d1a6363..5edf5beb 100644 --- a/modules/nf-core/bcftools/concat/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/concat/tests/main.nf.test.snap @@ -20,15 +20,21 @@ [ ], - [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.2" }, - "timestamp": "2025-11-26T16:53:25.503018154" + "timestamp": "2026-01-20T11:59:52.705734505" }, "homo_sapiens - [[vcf1, vcf2], []]": { "content": [ @@ -48,7 +54,11 @@ ], "3": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -64,16 +74,20 @@ "test3.vcf:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], - "versions": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.2" }, - "timestamp": "2025-11-26T16:56:01.364652383" + "timestamp": "2026-01-20T12:00:08.498123366" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { "content": [ @@ -93,7 +107,11 @@ ], "3": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -109,16 +127,20 @@ "test3.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-15T09:52:50.140505" + "timestamp": "2026-01-20T12:00:15.986212097" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index - stub": { "content": [ @@ -143,7 +165,11 @@ ] ], "3": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -164,16 +190,20 @@ "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-15T09:52:55.544079" + "timestamp": "2026-01-20T12:00:24.007593166" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi": { "content": [ @@ -196,15 +226,21 @@ "test3_vcf.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.2" }, - "timestamp": "2025-11-26T16:53:33.38516503" + "timestamp": "2026-01-20T12:00:00.937832062" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]]": { "content": [ @@ -224,7 +260,11 @@ ], "3": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -240,16 +280,20 @@ "test3.vcf:md5,0b4986bbb6bdc9e0ee12ba09e70092e9" ] ], - "versions": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.2" }, - "timestamp": "2025-11-26T16:55:30.850726912" + "timestamp": "2026-01-20T11:59:37.378838683" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index": { "content": [ @@ -272,15 +316,21 @@ [ ], - [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.2" }, - "timestamp": "2025-11-26T16:53:18.091429133" + "timestamp": "2026-01-20T11:59:45.296771646" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_tbi - stub": { "content": [ @@ -305,7 +355,11 @@ ], "3": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -326,16 +380,20 @@ "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-15T09:53:07.368971" + "timestamp": "2026-01-20T12:00:39.792930532" }, "homo_sapiens - [[vcf1, vcf2], [tbi1, tbi2]] - vcf_gz_index_csi - stub": { "content": [ @@ -360,7 +418,11 @@ ] ], "3": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -381,15 +443,19 @@ "test3_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,689f810ab8f069cb75cfebed99a52df8" + "versions_bcftools": [ + [ + "BCFTOOLS_CONCAT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-15T09:53:01.405995" + "timestamp": "2026-01-20T12:00:31.985353981" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf index c560a902..f1acbd3d 100644 --- a/modules/nf-core/bcftools/merge/main.nf +++ b/modules/nf-core/bcftools/merge/main.nf @@ -1,22 +1,20 @@ process BCFTOOLS_MERGE { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: - tuple val(meta), path(vcfs), path(tbis) - tuple val(meta2), path(fasta) - tuple val(meta3), path(fai) - tuple val(meta4), path(bed) + tuple val(meta), path(vcfs), path(tbis), path(bed) + tuple val(meta2), path(fasta), path(fai) output: tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf - tuple val(meta), path("*.{csi,tbi}") , emit: index, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.{csi,tbi}"), emit: index, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -25,50 +23,51 @@ process BCFTOOLS_MERGE { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input = (vcfs.collect().size() > 1) ? vcfs.sort{ it.name } : vcfs - def regions = bed ? "--regions-file $bed" : "" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" + def input = vcfs.collect().size() > 1 ? vcfs.sort { vcf -> vcf.name } : vcfs + def regions = bed ? "--regions-file ${bed}" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" """ bcftools merge \\ - $args \\ - $regions \\ - --threads $task.cpus \\ + ${args} \\ + ${regions} \\ + --threads ${task.cpus} \\ --output ${prefix}.${extension} \\ - $input - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${input} """ stub: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - 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 extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + 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_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/merge/meta.yml b/modules/nf-core/bcftools/merge/meta.yml index 09af245a..445e5c56 100644 --- a/modules/nf-core/bcftools/merge/meta.yml +++ b/modules/nf-core/bcftools/merge/meta.yml @@ -31,6 +31,11 @@ input: List containing the tbi index files corresponding to the vcfs input files e.g. [ 'file1.vcf.tbi', 'file2.vcf.tbi' ] ontologies: [] + - bed: + type: file + description: "(Optional) The bed regions to merge on" + pattern: "*.bed" + ontologies: [] - - meta2: type: map description: | @@ -42,27 +47,12 @@ input: FILE` parameter)" pattern: "*.{fasta,fa}" ontologies: [] - - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - fai: type: file description: "(Optional) The fasta reference file index (only necessary for the `--gvcf FILE` parameter)" pattern: "*.fai" ontologies: [] - - - meta4: - type: map - description: | - Groovy Map containing bed information - e.g. [ id:'genome' ] - - bed: - type: file - description: "(Optional) The bed regions to merge on" - pattern: "*.bed" - ontologies: [] output: vcf: - - meta: @@ -86,13 +76,27 @@ output: description: index of merged output pattern: "*.{csi,tbi}" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/merge/tests/bcf.config b/modules/nf-core/bcftools/merge/tests/bcf.config deleted file mode 100644 index 4467d07d..00000000 --- a/modules/nf-core/bcftools/merge/tests/bcf.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = '--output-type u --no-version' -} diff --git a/modules/nf-core/bcftools/merge/tests/bcf_gz.config b/modules/nf-core/bcftools/merge/tests/bcf_gz.config deleted file mode 100644 index 280de8db..00000000 --- a/modules/nf-core/bcftools/merge/tests/bcf_gz.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = '--output-type b --no-version' -} diff --git a/modules/nf-core/bcftools/merge/tests/main.nf.test b/modules/nf-core/bcftools/merge/tests/main.nf.test index 3995fc1a..3a1f1220 100644 --- a/modules/nf-core/bcftools/merge/tests/main.nf.test +++ b/modules/nf-core/bcftools/merge/tests/main.nf.test @@ -2,6 +2,8 @@ nextflow_process { name "Test Process BCFTOOLS_MERGE" script "../main.nf" + config "./nextflow.config" + process "BCFTOOLS_MERGE" tag "modules" @@ -11,9 +13,10 @@ nextflow_process { test("sarscov2 - [vcf, tbi], [], [], []") { - config "./nextflow.config" - when { + params { + args_modules = "--force-samples --force-single --no-version" + } process { """ input[0] = [ @@ -25,11 +28,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -40,18 +42,18 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, { assert snapshot( path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf output") { - config "./vcf.config" - when { + params { + args_modules = "--output-type v --no-version" + } process { """ input[0] = [ @@ -63,11 +65,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -78,18 +79,18 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, { assert snapshot( path(process.out.vcf.get(0).get(1)).md5, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output") { - config "./vcf_gz.config" - when { + params { + args_modules = "--output-type z --no-version" + } process { """ input[0] = [ @@ -101,11 +102,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -116,18 +116,18 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, { assert snapshot( path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - bcf output") { - config "./bcf.config" - when { + params { + args_modules = "--output-type u --no-version" + } process { """ input[0] = [ @@ -139,11 +139,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -154,18 +153,18 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("bcf") }, { assert snapshot( file(process.out.vcf.get(0).get(1)).name, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output") { - config "./bcf_gz.config" - when { + params { + args_modules = "--output-type b --no-version" + } process { """ input[0] = [ @@ -177,11 +176,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -192,18 +190,18 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("bcf.gz") }, { assert snapshot( file(process.out.vcf.get(0).get(1)).name, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index") { - config "./vcf_gz_index.config" - when { + params { + args_modules = "--output-type z --write-index --no-version" + } process { """ input[0] = [ @@ -215,11 +213,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -232,19 +229,18 @@ nextflow_process { { assert snapshot( path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, file(process.out.index.get(0).get(1)).name, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index") { - config "./vcf_gz_index_csi.config" - when { - + params { + args_modules = "--output-type z --write-index=csi --no-version" + } process { """ input[0] = [ @@ -256,11 +252,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -273,18 +268,18 @@ nextflow_process { { assert snapshot( path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, file(process.out.index.get(0).get(1)).name, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index") { - config "./vcf_gz_index_tbi.config" - when { + params { + args_modules = "--output-type z --write-index=tbi --no-version" + } process { """ input[0] = [ @@ -296,11 +291,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -313,18 +307,18 @@ nextflow_process { { assert snapshot( path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, file(process.out.index.get(0).get(1)).name, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], bed") { - config "./nextflow.config" - when { + params { + args_modules = "--force-samples --force-single --no-version" + } process { """ input[0] = [ @@ -336,14 +330,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] - ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [ - [ id:'test' ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) ] + ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) ] + input[1] = [[],[],[]] """ } } @@ -354,18 +344,18 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, { assert snapshot( path(process.out.vcf.get(0).get(1)).md5, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output") { - config "./nextflow.gvcf.config" - when { + params { + args_modules = "--force-samples --no-version --output-type z --gvcf genome.fasta" + } process { """ input[0] = [ @@ -377,20 +367,14 @@ nextflow_process { [ 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/gvcf/test2.genome.vcf.gz.tbi', checkIfExists: true), - ] + ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) ] input[1] = [ [ id:'test' ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] - ] - input[2] = [ - [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ], [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] ] - input[3] = [ - [ id:'test' ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) ] - ] """ } } @@ -401,17 +385,18 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, { assert snapshot( path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - one sample") { - config "./nextflow.config" when { + params { + args_modules = "--force-samples --force-single --no-version" + } process { """ input[0] = [ @@ -421,11 +406,10 @@ nextflow_process { ], [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -436,19 +420,20 @@ nextflow_process { { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, { assert snapshot( path(process.out.vcf.get(0).get(1)).md5, - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions") }, ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - stub") { options "-stub" - config "./nextflow.config" when { + params { + args_modules = "--force-samples --force-single --no-version" + } process { """ input[0] = [ @@ -460,11 +445,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -476,15 +460,16 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf output - stub") { options "-stub" - config "./vcf.config" when { + params { + args_modules = "--output-type v --no-version" + } process { """ input[0] = [ @@ -496,11 +481,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -512,15 +496,16 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - stub") { options "-stub" - config "./vcf_gz.config" when { + params { + args_modules = "--output-type z --no-version" + } process { """ input[0] = [ @@ -532,11 +517,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -548,15 +532,16 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - bcf output - stub") { options "-stub" - config "./bcf.config" when { + params { + args_modules = "--output-type u --no-version" + } process { """ input[0] = [ @@ -568,11 +553,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -584,15 +568,16 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output - stub") { options "-stub" - config "./bcf_gz.config" when { + params { + args_modules = "--output-type b --no-version" + } process { """ input[0] = [ @@ -604,11 +589,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -620,15 +604,16 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index - stub") { options "-stub" - config "./vcf_gz_index.config" when { + params { + args_modules = "--output-type z --write-index --no-version" + } process { """ input[0] = [ @@ -640,11 +625,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -657,15 +641,16 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index - stub") { options "-stub" - config "./vcf_gz_index_csi.config" when { + params { + args_modules = "--output-type z --write-index=csi --no-version" + } process { """ input[0] = [ @@ -677,11 +662,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] + ], + [] ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] + input[1] = [[],[],[]] """ } } @@ -694,52 +678,16 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index - stub") { options "-stub" - config "./vcf_gz_index_tbi.config" when { - process { - """ - input[0] = [ - [ id:'test' ], // meta map - [ - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) - ], - [ - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] - ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] - """ + params { + args_modules = "--output-type z --write-index=tbi --no-version" } - } - - then { - assertAll( - { assert process.success }, - { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, - { assert process.out.index.get(0).get(1).endsWith("tbi") }, - { assert snapshot(process.out).match() } - ) - } - - } - - test("sarscov2 - [vcf, tbi], [], [], bed - stub") { - - options "-stub" - config "./nextflow.config" - - when { process { """ input[0] = [ @@ -751,58 +699,10 @@ nextflow_process { [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi', checkIfExists: true), - ] - ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [ - [ id:'test' ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) ] - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, - { assert snapshot(process.out).match() } - ) - } - - } - - test("homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output - stub") { - - options "-stub" - config "./nextflow.gvcf.config" - when { - process { - """ - input[0] = [ - [ id:'test' ], // meta map - [ - 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/test2.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/gvcf/test2.genome.vcf.gz.tbi', checkIfExists: true), - ] - ] - input[1] = [ - [ id:'test' ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) ] - ] - input[2] = [ - [ id:'test' ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) ] - ] - input[3] = [ - [ id:'test' ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) ] + [] ] + input[1] = [[],[],[]] """ } } @@ -811,43 +711,9 @@ nextflow_process { assertAll( { assert process.success }, { assert process.out.vcf.get(0).get(1).endsWith("vcf.gz") }, + { assert process.out.index.get(0).get(1).endsWith("tbi") }, { assert snapshot(process.out).match() } ) } - - } - - test("sarscov2 - [vcf, tbi], [], [], [] - one sample - stub") { - - options "-stub" - config "./nextflow.config" - - when { - process { - """ - input[0] = [ - [ id:'test' ], // meta map - [ - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true) - ], - [ - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) - ] - ] - input[1] = [[],[]] - input[2] = [[],[]] - input[3] = [[],[]] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert process.out.vcf.get(0).get(1).endsWith("vcf") }, - { assert snapshot(process.out).match() } - ) - } - } } diff --git a/modules/nf-core/bcftools/merge/tests/main.nf.test.snap b/modules/nf-core/bcftools/merge/tests/main.nf.test.snap index d340b7b4..9dd09178 100644 --- a/modules/nf-core/bcftools/merge/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/merge/tests/main.nf.test.snap @@ -3,15 +3,21 @@ "content": [ "e0de448dc8e712956a03ce68d79a0b3a", "test.vcf.gz.tbi", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:16.859885" + "timestamp": "2026-01-20T12:05:01.453191274" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf output - stub": { "content": [ @@ -28,7 +34,11 @@ ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ @@ -41,29 +51,39 @@ "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:43.269991" + "timestamp": "2026-01-20T12:05:43.064165277" }, "sarscov2 - [vcf, tbi], [], [], bed": { "content": [ "febdcfb851dcfc83d8248520830aef10", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:21.848388" + "timestamp": "2026-01-20T12:05:09.906419282" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index - stub": { "content": [ @@ -85,7 +105,11 @@ ] ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ [ @@ -103,29 +127,39 @@ "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:21:03.763345" + "timestamp": "2026-01-20T12:06:17.06290054" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf output": { "content": [ "57bb84274f336465d0a0946b532093b0", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:19:47.331149" + "timestamp": "2026-01-20T12:04:14.044948834" }, "sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output - stub": { "content": [ @@ -142,7 +176,11 @@ ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ @@ -155,16 +193,20 @@ "test.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:59.170567" + "timestamp": "2026-01-20T12:06:08.633006073" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - tbi index - stub": { "content": [ @@ -186,7 +228,11 @@ ] ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ [ @@ -204,16 +250,20 @@ "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:21:13.022634" + "timestamp": "2026-01-20T12:06:33.897407991" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - stub": { "content": [ @@ -230,7 +280,11 @@ ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ @@ -243,95 +297,78 @@ "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:48.592261" + "timestamp": "2026-01-20T12:05:51.445673109" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index": { "content": [ "e0de448dc8e712956a03ce68d79a0b3a", "test.vcf.gz.csi", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:11.953139" + "timestamp": "2026-01-20T12:04:53.868676326" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output": { "content": [ "e0de448dc8e712956a03ce68d79a0b3a", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-11T14:19:51.935426" - }, - "sarscov2 - [vcf, tbi], [], [], bed - stub": { - "content": [ { - "0": [ + "versions_bcftools": [ [ - { - "id": "test" - }, - "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + "BCFTOOLS_MERGE", + "bcftools", + "1.22" ] - ], - "1": [ - - ], - "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ], - "index": [ - - ], - "vcf": [ - [ - { - "id": "test" - }, - "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:21:18.319666" + "timestamp": "2026-01-20T12:04:22.660557224" }, "sarscov2 - [vcf, tbi], [], [], [] - bcf output": { "content": [ "test.bcf", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:19:56.742352" + "timestamp": "2026-01-20T12:04:30.965022315" }, "sarscov2 - [vcf, tbi], [], [], [] - bcf output - stub": { "content": [ @@ -348,7 +385,11 @@ ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ @@ -361,134 +402,78 @@ "test.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:53.962449" + "timestamp": "2026-01-20T12:05:59.932077434" }, - "sarscov2 - [vcf, tbi], [], [], [] - one sample - stub": { + "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index": { "content": [ + "e0de448dc8e712956a03ce68d79a0b3a", + "test.vcf.gz.csi", { - "0": [ + "versions_bcftools": [ [ - { - "id": "test" - }, - "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + "BCFTOOLS_MERGE", + "bcftools", + "1.22" ] - ], - "1": [ - - ], - "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ], - "index": [ - - ], - "vcf": [ - [ - { - "id": "test" - }, - "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:21:29.155018" + "timestamp": "2026-01-20T12:04:46.41923299" }, - "homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output - stub": { + "homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output": { "content": [ + "645b7f7f9131bfe350a9ec3cf82c17fe", { - "0": [ + "versions_bcftools": [ [ - { - "id": "test" - }, - "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "BCFTOOLS_MERGE", + "bcftools", + "1.22" ] - ], - "1": [ - - ], - "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ], - "index": [ - - ], - "vcf": [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-11T14:21:23.944931" - }, - "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - index": { - "content": [ - "e0de448dc8e712956a03ce68d79a0b3a", - "test.vcf.gz.csi", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:06.894016" - }, - "homo_sapiens - [vcf, tbi], fasta, fai, bed - vcf.gz output": { - "content": [ - "645b7f7f9131bfe350a9ec3cf82c17fe", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-11T14:20:28.149857" + "timestamp": "2026-01-20T12:05:18.989455751" }, "sarscov2 - [vcf, tbi], [], [], [] - one sample": { "content": [ "2a374cf02f0c32cf607646167e7f153b", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:32.592911" + "timestamp": "2026-01-20T12:05:26.431607458" }, "sarscov2 - [vcf, tbi], [], [], [] - stub": { "content": [ @@ -505,7 +490,11 @@ ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ @@ -518,16 +507,20 @@ "test.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:37.830691" + "timestamp": "2026-01-20T12:05:34.692613749" }, "sarscov2 - [vcf, tbi], [], [], [] - vcf.gz output - csi index - stub": { "content": [ @@ -549,7 +542,11 @@ ] ], "2": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ], "index": [ [ @@ -567,41 +564,57 @@ "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:21:08.5748" + "timestamp": "2026-01-20T12:06:25.137261969" }, "sarscov2 - [vcf, tbi], [], [], []": { "content": [ "e0de448dc8e712956a03ce68d79a0b3a", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:19:41.986954" + "timestamp": "2026-01-20T12:04:05.637837157" }, "sarscov2 - [vcf, tbi], [], [], [] - bcf.gz output": { "content": [ "test.bcf.gz", - [ - "versions.yml:md5,46d60729adb9ea9a4e4ab722b487a56b" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_MERGE", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:20:01.801297" + "timestamp": "2026-01-20T12:04:38.467108836" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/merge/tests/nextflow.config b/modules/nf-core/bcftools/merge/tests/nextflow.config index c3f0b715..36f2fa1a 100644 --- a/modules/nf-core/bcftools/merge/tests/nextflow.config +++ b/modules/nf-core/bcftools/merge/tests/nextflow.config @@ -1,5 +1,5 @@ process { withName: BCFTOOLS_MERGE { - ext.args = '--force-samples --force-single --no-version' + ext.args = "${params.args_modules}" } } diff --git a/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config b/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config deleted file mode 100644 index 8c457b71..00000000 --- a/modules/nf-core/bcftools/merge/tests/nextflow.gvcf.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: BCFTOOLS_MERGE { - ext.args = { "--force-samples --no-version --output-type z --gvcf $fasta" } - } -} diff --git a/modules/nf-core/bcftools/merge/tests/vcf.config b/modules/nf-core/bcftools/merge/tests/vcf.config deleted file mode 100644 index 759222e5..00000000 --- a/modules/nf-core/bcftools/merge/tests/vcf.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = '--output-type v --no-version' -} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz.config b/modules/nf-core/bcftools/merge/tests/vcf_gz.config deleted file mode 100644 index 8b6ad8b4..00000000 --- a/modules/nf-core/bcftools/merge/tests/vcf_gz.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = '--output-type z --no-version' -} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config deleted file mode 100644 index 9f1e9b1d..00000000 --- a/modules/nf-core/bcftools/merge/tests/vcf_gz_index.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--output-type z --write-index --no-version" -} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config deleted file mode 100644 index 8308ee1a..00000000 --- a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_csi.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--output-type z --write-index=csi --no-version" -} diff --git a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config deleted file mode 100644 index 9be4075b..00000000 --- a/modules/nf-core/bcftools/merge/tests/vcf_gz_index_tbi.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--output-type z --write-index=tbi --no-version" -} diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 302c7311..e0dfad2d 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -1,20 +1,20 @@ process BCFTOOLS_SORT { - tag "$meta.id" + tag "${meta.id}" label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf) output: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi, optional: true - tuple val(meta), path("*.csi") , emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -22,49 +22,51 @@ process BCFTOOLS_SORT { script: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def max_memory = task.memory ? "--max-mem ${task.memory.toUnit('MB') * 0.9}M" : "" """ bcftools \\ sort \\ - --output ${prefix}.sorted.${extension} \\ + --output ${prefix}.${extension} \\ --temp-dir . \\ - $args \\ - $vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${max_memory} \\ + ${args} \\ + ${vcf} """ stub: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - 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 extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + 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_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 """ -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/sort/meta.yml b/modules/nf-core/bcftools/sort/meta.yml index c15487c7..1c3f2a54 100644 --- a/modules/nf-core/bcftools/sort/meta.yml +++ b/modules/nf-core/bcftools/sort/meta.yml @@ -58,13 +58,27 @@ output: description: Default VCF file index pattern: "*.csi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@Gwennid" maintainers: diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test b/modules/nf-core/bcftools/sort/tests/main.nf.test index 7d580e4f..bda7bace 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test @@ -27,7 +27,6 @@ nextflow_process { { assert snapshot(process.out).match("vcf") } ) } - } test("sarscov2 - vcf_gz_index") { @@ -52,12 +51,11 @@ nextflow_process { 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 + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi") { @@ -82,12 +80,11 @@ nextflow_process { 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 + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi") { @@ -112,12 +109,11 @@ nextflow_process { 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 + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } test("sarscov2 - vcf - stub") { @@ -139,7 +135,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - vcf_gz_index - stub") { @@ -165,7 +160,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi - stub") { @@ -191,7 +185,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi - stub") { @@ -217,6 +210,5 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } } diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap index 3cbca56c..9b9e4dc7 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap @@ -22,7 +22,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -43,16 +47,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:49:07.959267" + "timestamp": "2026-01-20T12:19:24.286732272" }, "vcf": { "content": [ @@ -72,7 +80,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -88,16 +100,20 @@ "test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:35.236174" + "timestamp": "2026-01-20T12:18:38.783455397" }, "sarscov2 - vcf_gz_index": { "content": [ @@ -120,15 +136,21 @@ [ ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:39.95133" + "timestamp": "2026-01-20T12:18:45.081447395" }, "sarscov2 - vcf_gz_index_csi": { "content": [ @@ -151,15 +173,21 @@ [ ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:44.50977" + "timestamp": "2026-01-20T12:18:51.194304667" }, "sarscov2 - vcf_gz_index - stub": { "content": [ @@ -184,7 +212,11 @@ ] ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -205,16 +237,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:58.749279" + "timestamp": "2026-01-20T12:19:11.413154111" }, "sarscov2 - vcf_gz_index_csi - stub": { "content": [ @@ -239,7 +275,11 @@ ] ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -260,16 +300,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:49:03.283017" + "timestamp": "2026-01-20T12:19:17.770087535" }, "sarscov2 - vcf - stub": { "content": [ @@ -289,7 +333,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -305,16 +353,20 @@ "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:54.113947" + "timestamp": "2026-01-20T12:19:04.409593559" }, "sarscov2 - vcf_gz_index_tbi": { "content": [ @@ -337,14 +389,20 @@ "test_vcf.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:48.979311" + "timestamp": "2026-01-20T12:18:57.536633502" } } \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/download/environment.yml b/modules/nf-core/ensemblvep/download/environment.yml index d9ed9b6b..7e60f7f9 100644 --- a/modules/nf-core/ensemblvep/download/environment.yml +++ b/modules/nf-core/ensemblvep/download/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - # renovate: datasource=conda depName=bioconda/ensembl-vep - - bioconda::ensembl-vep=115.2=pl5321h2a3209d_1 + - bioconda::ensembl-vep=115.2 + - bioconda::perl-math-cdf=0.1 diff --git a/modules/nf-core/ensemblvep/download/main.nf b/modules/nf-core/ensemblvep/download/main.nf index f7693216..7e1aeefe 100644 --- a/modules/nf-core/ensemblvep/download/main.nf +++ b/modules/nf-core/ensemblvep/download/main.nf @@ -4,15 +4,16 @@ process ENSEMBLVEP_DOWNLOAD { conda "${moduleDir}/environment.yml" container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4b/4b5a8c173dc9beaa93effec76b99687fc926b1bd7be47df5d6ce19d7d6b4d6b7/data' - : 'community.wave.seqera.io/library/ensembl-vep:115.2--90ec797ecb088e9a'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/3d/3da6e21cbf9803529421d7e136d1ebec5ff71ec50e0d996eda2ce11ec2c19bf9/data' + : 'community.wave.seqera.io/library/ensembl-vep_perl-math-cdf:1e13f65f931a6954'}" input: tuple val(meta), val(assembly), val(species), val(cache_version) output: tuple val(meta), path(prefix), emit: cache - path "versions.yml", emit: versions + tuple val("${task.process}"), val('ensemblvep'), eval("vep --help | sed -n '/ensembl-vep/s/.*: //p'"), topic: versions, emit: versions_ensemblvep + tuple val("${task.process}"), val('perl-math-cdf'), eval("perl -MMath::CDF -e 'print \$Math::CDF::VERSION'"), topic: versions, emit: versions_perlmathcdf when: task.ext.when == null || task.ext.when @@ -27,21 +28,11 @@ process ENSEMBLVEP_DOWNLOAD { --ASSEMBLY ${assembly} \\ --CACHE_VERSION ${cache_version} \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') - END_VERSIONS """ stub: prefix = task.ext.prefix ?: 'vep_cache' """ mkdir ${prefix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/ensemblvep/download/meta.yml b/modules/nf-core/ensemblvep/download/meta.yml index df7cf260..ae1b9c6f 100644 --- a/modules/nf-core/ensemblvep/download/meta.yml +++ b/modules/nf-core/ensemblvep/download/meta.yml @@ -1,6 +1,6 @@ name: ensemblvep_download -description: Ensembl Variant Effect Predictor (VEP). The cache downloading options - are controlled through `task.ext.args`. +description: Ensembl Variant Effect Predictor (VEP). The cache downloading + options are controlled through `task.ext.args`. keywords: - annotation - cache @@ -12,7 +12,8 @@ tools: or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. homepage: https://www.ensembl.org/info/docs/tools/vep/index.html documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html - licence: ["Apache-2.0"] + licence: + - "Apache-2.0" identifier: "" input: - - meta: @@ -44,13 +45,46 @@ output: description: cache pattern: "*" ontologies: [] + versions_ensemblvep: + - - ${task.process}: + type: string + description: The process the versions were collected from + - ensemblvep: + type: string + description: The tool name + - "vep --help | sed -n '/ensembl-vep/s/.*: //p'": + type: eval + description: The command used to generate the version of the tool + versions_perlmathcdf: + - - ${task.process}: + type: string + description: The process the versions were collected from + - perl-math-cdf: + type: string + description: The name of the tool + - perl -MMath::CDF -e 'print \$Math::CDF::VERSION': + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - ensemblvep: + type: string + description: The tool name + - "vep --help | sed -n '/ensembl-vep/s/.*: //p'": + type: eval + description: The command used to generate the version of the tool + - - ${task.process}: + type: string + description: The process the versions were collected from + - perl-math-cdf: + type: string + description: The name of the tool + - perl -MMath::CDF -e 'print \$Math::CDF::VERSION': + type: eval + description: The expression to obtain the version of the tool authors: - "@maxulysse" maintainers: diff --git a/modules/nf-core/ensemblvep/download/tests/main.nf.test b/modules/nf-core/ensemblvep/download/tests/main.nf.test index 496dbeca..0206fe11 100644 --- a/modules/nf-core/ensemblvep/download/tests/main.nf.test +++ b/modules/nf-core/ensemblvep/download/tests/main.nf.test @@ -10,7 +10,7 @@ nextflow_process { tag "ensemblvep" tag "ensemblvep/download" - test("celegans - download") { + test("ENSEMBLVEP download cache for 115_WBcel235") { when { process { @@ -28,12 +28,12 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } - test("celegans - download - stub") { + test("ENSEMBLVEP download cache for 115_WBcel235 - stub") { options "-stub" @@ -53,7 +53,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } diff --git a/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap index ee94eef6..e5618485 100644 --- a/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap +++ b/modules/nf-core/ensemblvep/download/tests/main.nf.test.snap @@ -1,8 +1,8 @@ { - "celegans - download": { + "ENSEMBLVEP download cache for 115_WBcel235": { "content": [ { - "0": [ + "cache": [ [ { "id": "115_WBcel235" @@ -135,157 +135,32 @@ ] ] ], - "1": [ - "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" - ], - "cache": [ + "versions_ensemblvep": [ [ - { - "id": "115_WBcel235" - }, - [ - [ - [ - [ - "1-1000000.gz:md5,f9cb33a3ddbb1b82597b3af3e9643dd3", - "10000001-11000000.gz:md5,71aa93ae6388be95fa5269be60236b95", - "1000001-2000000.gz:md5,956f858010c1346ee042ef0ea522043b", - "11000001-12000000.gz:md5,30274a3b8244e492cdf1f611a04848db", - "12000001-13000000.gz:md5,b28d20155f72c1261ba4bb08bea3d302", - "13000001-14000000.gz:md5,293a59ed7b397c1817d77412e124df53", - "14000001-15000000.gz:md5,5291aeb2805c8823b44562d875c7905e", - "15000001-16000000.gz:md5,7fd86078be5f3a400635b269a02185ea", - "2000001-3000000.gz:md5,7f6241cf8e3c91e1c882f3cc86d2dc3a", - "3000001-4000000.gz:md5,e77dc4834119301bbe19dc2a4a05348a", - "4000001-5000000.gz:md5,ac34c2980fea824b21e04874847904ad", - "5000001-6000000.gz:md5,3dfdb3bcd812de1e2b69cfca89a1c1f9", - "6000001-7000000.gz:md5,8446c31796e1aee447af2e353b3734a1", - "7000001-8000000.gz:md5,f84e88618cf747c774ddb98d971e2615", - "8000001-9000000.gz:md5,3094317bb21e35067424e9ad957dfcbe", - "9000001-10000000.gz:md5,3883799cae1ed356ecb416550a89ebde" - ], - [ - "1-1000000.gz:md5,c2393dd5d120068d496b8789bee91974", - "10000001-11000000.gz:md5,106ab30775ba5fa950f8df7909a163b2", - "1000001-2000000.gz:md5,beeda6a82ca6800093d96bbf2eaa81f9", - "11000001-12000000.gz:md5,27d27c0245dbbb270b2001ca75b03042", - "12000001-13000000.gz:md5,8eea54682f0ef9e1977527999f6bfe29", - "13000001-14000000.gz:md5,5f4581505ebf8c4488bff65b16f125e0", - "14000001-15000000.gz:md5,00e8035d7e179ee51faa7032db090fad", - "15000001-16000000.gz:md5,c8438ec1765eb98cfca60eb2165f4d70", - "2000001-3000000.gz:md5,cf3f572db267b4a8552b37d1c3a78b2d", - "3000001-4000000.gz:md5,ec7df072bf71748c26e25afc2ea353f1", - "4000001-5000000.gz:md5,9dd91cde9d18bae0c884dff7050abaef", - "5000001-6000000.gz:md5,1be8b286a79eebb80ff0684f5c110407", - "6000001-7000000.gz:md5,a0debd5341d3e5ba986225f0f45d01b9", - "7000001-8000000.gz:md5,fc2d82666540059fea44c14569208b14", - "8000001-9000000.gz:md5,0a75c0b27da2c4ae946fdae5e5d83e59", - "9000001-10000000.gz:md5,172900e4145c9a9aa783f01550f4d8a2" - ], - [ - "1-1000000.gz:md5,d1d97f733248a030e650a9bd1e7f41bc", - "10000001-11000000.gz:md5,429d681ffa8ca9dc23c62cdab4ffc42b", - "1000001-2000000.gz:md5,58be924f576c85b462df995b76074c9d", - "11000001-12000000.gz:md5,f789a4312ddd0bd423b3c55f66af782c", - "12000001-13000000.gz:md5,76a0fdd867ca559eaf5e8fe3e0f8ea94", - "13000001-14000000.gz:md5,867d9a3b7b6a720b634180efebf65658", - "2000001-3000000.gz:md5,e93c4b398494843b309abf71b218c14a", - "3000001-4000000.gz:md5,ff5b0d6680207d23490279c5f62ba33b", - "4000001-5000000.gz:md5,8b5e33878c599de252a931205a034446", - "5000001-6000000.gz:md5,25b9f4a4edafb9572c323ca1783dd7c1", - "6000001-7000000.gz:md5,c52c31d11ab225f7c9793f0c82ce72e6", - "7000001-8000000.gz:md5,a894863e34285ca3b042cd0eeed253c6", - "8000001-9000000.gz:md5,bcce1adf098aa44c0e55a2df2d801449", - "9000001-10000000.gz:md5,b27661dc26cd23c6a9c41cc885187b4f" - ], - [ - "1-1000000.gz:md5,70dfe9bedc7a87a063f9b6f2e48b846b", - "10000001-11000000.gz:md5,767a1bd59613ad669cbb835cc11d06ff", - "1000001-2000000.gz:md5,9e1276159b8a073611f048cf6c4a0738", - "11000001-12000000.gz:md5,93dcc27f1185c7af20489ce5796da68e", - "12000001-13000000.gz:md5,0bc55d7b3f7419adcdbf474b7192c5ba", - "13000001-14000000.gz:md5,2a8c5ee78d9d2b462ec889733f311c19", - "14000001-15000000.gz:md5,68e79d710886838294c8de27ea7c1c00", - "15000001-16000000.gz:md5,d975f06bf6f8f1722c29c7b8cce7095b", - "16000001-17000000.gz:md5,bf59b0b7461b4c97520762754a91e41c", - "17000001-18000000.gz:md5,3174d1bff1351ee17f632c6adec54c90", - "2000001-3000000.gz:md5,22ac8f1975b085ed3f5773bc220ff120", - "3000001-4000000.gz:md5,0a8a89f524f7955f3db2847344e688d9", - "4000001-5000000.gz:md5,648d45d681cc4cbe68db4638665122ca", - "5000001-6000000.gz:md5,dfe8c94f45221ed152874083ec0991e2", - "6000001-7000000.gz:md5,e9c705d31a7c1cac9d02c6a018a0d655", - "7000001-8000000.gz:md5,723513cca5842d5c238dc110075ad8dd", - "8000001-9000000.gz:md5,3703d6fbdad1f21a2c1f40c5d8ad5371", - "9000001-10000000.gz:md5,afb3ba977fc7cd18b47bb5fa6fc85832" - ], - [ - "1-1000000.gz:md5,397d664998c2dbfd56c0af94c385f5ee" - ], - [ - "1-1000000.gz:md5,ce88865c73633b2b57e6f3481a21b3f8", - "10000001-11000000.gz:md5,8f1f45979e56451d44a3887321910d30", - "1000001-2000000.gz:md5,c40b987ac5b22a6674055849e24204ad", - "11000001-12000000.gz:md5,4e5a2ba329951bd2e01738886766e777", - "12000001-13000000.gz:md5,0670c5ee8dbf7c5f497a948071f94026", - "13000001-14000000.gz:md5,24d4532d1e9c0839f750f6dc798beacd", - "14000001-15000000.gz:md5,3a3de4c21b35ae9cd349e4641d8023a8", - "15000001-16000000.gz:md5,d60e0088ed511f809d9f2137fe46731c", - "16000001-17000000.gz:md5,2ee41d67e7cc73cf0e1bf8e47c708436", - "17000001-18000000.gz:md5,87304db95265191a4368c51ee7993801", - "18000001-19000000.gz:md5,b943b2b6865fa97a04fac7e17ac7c789", - "19000001-20000000.gz:md5,4d1338b66252cbc28c9991967cc5805e", - "20000001-21000000.gz:md5,a81d47d38d78d30bb4575f7a65c9707e", - "2000001-3000000.gz:md5,2ff7e93b14741df46621a15840fa5276", - "3000001-4000000.gz:md5,1ff84c0fb7dd85b55a1f32954f3bd625", - "4000001-5000000.gz:md5,4079a7728625d842f231d1f664b50264", - "5000001-6000000.gz:md5,399986007f0bc002054aff687bce85fc", - "6000001-7000000.gz:md5,c97f0d1a323011c5eb59d2c09a12634e", - "7000001-8000000.gz:md5,0973af953b9632efa1813d0c1265902d", - "8000001-9000000.gz:md5,1c9695b7857c8494396edbf68e2d8095", - "9000001-10000000.gz:md5,7e3e78052518c97155260eba1975ec41" - ], - [ - "1-1000000.gz:md5,e5b943beee3102d4bbcf931618e4516f", - "10000001-11000000.gz:md5,2258cce59acc40383eba19df4adab977", - "1000001-2000000.gz:md5,48ffa67b4638d76f54feffeaf3ceb919", - "11000001-12000000.gz:md5,810e31cc6ef2995163dc4a249c73f131", - "12000001-13000000.gz:md5,0bf858719d427d5dcff6640dd0126ec0", - "13000001-14000000.gz:md5,f337fe31c4cf04d2b61c8cc4e65b3d31", - "14000001-15000000.gz:md5,51fa13d1ceefd98a6a093a41d565aa08", - "15000001-16000000.gz:md5,eaa3a4f3c8e447a78f482f8ff94ee488", - "16000001-17000000.gz:md5,95d704615bf688dea4fcf8916ea35326", - "17000001-18000000.gz:md5,356290a920138412ac131046246fe606", - "2000001-3000000.gz:md5,b32d23dedc91e0f05047cb3f75ab9679", - "3000001-4000000.gz:md5,304b9eb63522e575fb97a7c18e602c93", - "4000001-5000000.gz:md5,d2fa3e7f01321332dc5a65feef9defc0", - "5000001-6000000.gz:md5,d150eec8b35ccf2e136fdc6e7bd17481", - "6000001-7000000.gz:md5,fde4ba9ba1cbe463b65afd45f64d0809", - "7000001-8000000.gz:md5,40a5fe0f827dc040e851c5769896d4f5", - "8000001-9000000.gz:md5,0112761790ef2e78c5515bb3f9923277", - "9000001-10000000.gz:md5,f2d25d2a55f146875f0e5d51d3108341" - ], - "chr_synonyms.txt:md5,8a7e0941aa4f0e676ab5594f0226b2b5", - "info.txt:md5,33ccb74a030a9a345051628c337cb8af" - ] - ] - ] + "ENSEMBLVEP_DOWNLOAD", + "ensemblvep", + "115.2" ] ], - "versions": [ - "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" + "versions_perlmathcdf": [ + [ + "ENSEMBLVEP_DOWNLOAD", + "perl-math-cdf", + "" + ] ] } ], + "timestamp": "2026-02-13T13:36:59.060515944", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-29T09:49:32.824496" + "nf-test": "0.9.4", + "nextflow": "26.01.1" + } }, - "celegans - download - stub": { + "ENSEMBLVEP download cache for 115_WBcel235 - stub": { "content": [ { - "0": [ + "cache": [ [ { "id": "115_WBcel235" @@ -295,28 +170,26 @@ ] ] ], - "1": [ - "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" - ], - "cache": [ + "versions_ensemblvep": [ [ - { - "id": "115_WBcel235" - }, - [ - - ] + "ENSEMBLVEP_DOWNLOAD", + "ensemblvep", + "115.2" ] ], - "versions": [ - "versions.yml:md5,9b1253427e49a5cace6f8fe180f22347" + "versions_perlmathcdf": [ + [ + "ENSEMBLVEP_DOWNLOAD", + "perl-math-cdf", + "" + ] ] } ], + "timestamp": "2026-02-13T13:37:10.696285488", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-29T09:49:47.366588" + "nf-test": "0.9.4", + "nextflow": "26.01.1" + } } } \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff index 716edbbe..f4675ea2 100644 --- a/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff +++ b/modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff @@ -11,34 +11,21 @@ Changes in 'ensemblvep/vep/main.nf': conda "${moduleDir}/environment.yml" container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container -@@ -15,14 +15,16 @@ - path cache - tuple val(meta2), path(fasta) +@@ -15,6 +15,8 @@ + tuple val(meta2), path(cache) + tuple val(meta3), path(fasta) path extra_files + path custom_vep + path custom_vep_tbi output: -- tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true -- tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true -- tuple val(meta), path("*.tab.gz"), emit: tab, optional: true -- tuple val(meta), path("*.json.gz"), emit: json, optional: true -- path "*.html", emit: report, optional: true -- path "versions.yml", emit: versions -+ tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true -+ tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true -+ tuple val(meta), path("*.tab.gz"), emit: tab, optional: true -+ tuple val(meta), path("*.json.gz"), emit: json, optional: true -+ path "*.html", emit: report, optional: true -+ path "versions.yml", emit: versions - - when: - task.ext.when == null || task.ext.when -@@ -36,6 +38,7 @@ + tuple val(meta), path("${prefix}.vcf.gz"), emit: vcf, optional: true +@@ -38,6 +40,8 @@ def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" def reference = fasta ? "--fasta ${fasta}" : "" def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" + args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") ++ """ vep \\ -i ${vcf} \\ diff --git a/modules/nf-core/ensemblvep/vep/environment.yml b/modules/nf-core/ensemblvep/vep/environment.yml index d8e22f70..7e60f7f9 100644 --- a/modules/nf-core/ensemblvep/vep/environment.yml +++ b/modules/nf-core/ensemblvep/vep/environment.yml @@ -4,4 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::ensembl-vep=114.2 + - bioconda::ensembl-vep=115.2 + - bioconda::perl-math-cdf=0.1 diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index 9daaadab..6a9d676e 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -4,27 +4,29 @@ process ENSEMBLVEP_VEP { conda "${moduleDir}/environment.yml" container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'https://depot.galaxyproject.org/singularity/ensembl-vep:114.2--pl5321h2a3209d_0' - : 'biocontainers/ensembl-vep:114.2--pl5321h2a3209d_0'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/3d/3da6e21cbf9803529421d7e136d1ebec5ff71ec50e0d996eda2ce11ec2c19bf9/data' + : 'community.wave.seqera.io/library/ensembl-vep_perl-math-cdf:1e13f65f931a6954'}" input: tuple val(meta), path(vcf), path(custom_extra_files) val genome val species val cache_version - path cache - tuple val(meta2), path(fasta) + tuple val(meta2), path(cache) + tuple val(meta3), path(fasta) path extra_files path custom_vep path custom_vep_tbi output: - tuple val(meta), path("*.vcf.gz"), emit: vcf, optional: true - tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi, optional: true - tuple val(meta), path("*.tab.gz"), emit: tab, optional: true - tuple val(meta), path("*.json.gz"), emit: json, optional: true - path "*.html", emit: report, optional: true - path "versions.yml", emit: versions + tuple val(meta), path("${prefix}.vcf.gz"), emit: vcf, optional: true + tuple val(meta), path("${prefix}.vcf.gz.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.tab.gz"), emit: tab, optional: true + tuple val(meta), path("${prefix}.json.gz"), emit: json, optional: true + tuple val(meta), val("${task.process}"), val('ensemblvep'), path("*.html"), topic: multiqc_files, emit: report, optional: true + tuple val("${task.process}"), val('ensemblvep'), eval("vep --help | sed -n '/ensembl-vep/s/.*: //p'"), topic: versions, emit: versions_ensemblvep + tuple val("${task.process}"), val('tabix'), eval("tabix -h 2>&1 | grep -oP 'Version:\\s*\\K[^\\s]+'"), topic: versions, emit: versions_tabix + tuple val("${task.process}"), val('perl-math-cdf'), eval("perl -MMath::CDF -e 'print \\\$Math::CDF::VERSION'"), topic: versions, emit: versions_perlmathcdf when: task.ext.when == null || task.ext.when @@ -34,11 +36,12 @@ process ENSEMBLVEP_VEP { def args2 = task.ext.args2 ?: '' def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json") ? 'json' : args.contains("--tab") ? 'tab' : 'vcf' def compress_cmd = args.contains("--compress_output") ? '' : '--compress_output bgzip' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" def dir_cache = cache ? "\${PWD}/${cache}" : "/.vep" def reference = fasta ? "--fasta ${fasta}" : "" def create_index = file_extension == "vcf" ? "tabix ${args2} ${prefix}.${file_extension}.gz" : "" args = args.replaceAll(/--custom file=[^,]+/, "--custom file=${custom_vep}") + """ vep \\ -i ${vcf} \\ @@ -54,27 +57,15 @@ process ENSEMBLVEP_VEP { --fork ${task.cpus} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" def file_extension = args.contains("--vcf") ? 'vcf' : args.contains("--json") ? 'json' : args.contains("--tab") ? 'tab' : 'vcf' def create_index = file_extension == "vcf" ? "touch ${prefix}.${file_extension}.gz.tbi" : "" """ echo "" | gzip > ${prefix}.${file_extension}.gz ${create_index} touch ${prefix}_summary.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ensemblvep: \$( echo \$(vep --help 2>&1) | sed 's/^.*Versions:.*ensembl-vep : //;s/ .*\$//') - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/ensemblvep/vep/meta.yml b/modules/nf-core/ensemblvep/vep/meta.yml index 7d91a7d0..daa62526 100644 --- a/modules/nf-core/ensemblvep/vep/meta.yml +++ b/modules/nf-core/ensemblvep/vep/meta.yml @@ -1,6 +1,6 @@ name: ensemblvep_vep -description: Ensembl Variant Effect Predictor (VEP). The output-file-format is controlled - through `task.ext.args`. +description: Ensembl Variant Effect Predictor (VEP). The output-file-format is + controlled through `task.ext.args`. keywords: - annotation - vcf @@ -13,7 +13,8 @@ tools: or structural variants) on genes, transcripts, and protein sequence, as well as regulatory regions. homepage: https://www.ensembl.org/info/docs/tools/vep/index.html documentation: https://www.ensembl.org/info/docs/tools/vep/script/index.html - licence: ["Apache-2.0"] + licence: + - "Apache-2.0" identifier: "" input: - - meta: @@ -44,12 +45,17 @@ input: type: integer description: | which version of the cache to annotate with - - cache: - type: file - description: | - path to VEP cache (optional) - ontologies: [] - - meta2: + type: map + description: | + Groovy Map containing cache information + e.g. [ id:'test' ] + - cache: + type: file + description: | + path to VEP cache (optional) + ontologies: [] + - - meta3: type: map description: | Groovy Map containing fasta reference information @@ -71,19 +77,19 @@ output: type: map description: | Map with sample information - - "*.vcf.gz": + - ${prefix}.vcf.gz: type: file description: | annotated vcf (optional) pattern: "*.vcf.gz" ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format + - edam: http://edamontology.org/format_3989 tbi: - - meta: type: map description: | Map with sample information - - "*.vcf.gz.tbi": + - ${prefix}.vcf.gz.tbi: type: file description: | annotated vcf index (optional) @@ -94,38 +100,116 @@ output: type: map description: | Map with sample information - - "*.tab.gz": + - ${prefix}.tab.gz: type: file description: | tab file with annotated variants (optional) pattern: "*.ann.tab.gz" ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format + - edam: http://edamontology.org/format_3989 json: - - meta: type: map description: | Map with sample information - - "*.json.gz": + - ${prefix}.json.gz: type: file description: | json file with annotated variants (optional) pattern: "*.ann.json.gz" ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format + - edam: http://edamontology.org/format_3989 report: - - "*.html": - type: file - description: VEP report file - pattern: "*.html" - ontologies: [] + - - meta: + type: map + description: | + Map with sample information + - ${task.process}: + type: string + description: The process + - ensemblvep: + type: string + description: The tool name + - "*.html": + type: file + description: VEP report file + pattern: "*.html" + ontologies: [] + versions_ensemblvep: + - - ${task.process}: + type: string + description: The process + - ensemblvep: + type: string + description: The tool name + - "vep --help | sed -n '/ensembl-vep/s/.*: //p'": + type: eval + description: The command used to generate the version of the tool + versions_tabix: + - - ${task.process}: + type: string + description: The process + - tabix: + type: string + description: The tool name + - tabix -h 2>&1 | grep -oP 'Version:\s*\K[^\s]+': + type: eval + description: The expression to obtain the version of the tool + versions_perlmathcdf: + - - ${task.process}: + type: string + description: The process + - perl-math-cdf: + type: string + description: The tool name + - perl -MMath::CDF -e 'print \\$Math::CDF::VERSION': + type: eval + description: The expression to obtain the version of the tool +topics: + multiqc_files: + - - meta: + type: string + description: | + Map with sample information + - ${task.process}: + type: string + description: The process + - ensemblvep: + type: string + description: The tool name + - "*.html": + type: file + description: VEP report file + pattern: "*.html" + ontologies: [] versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process + - ensemblvep: + type: string + description: The tool name + - "vep --help | sed -n '/ensembl-vep/s/.*: //p'": + type: eval + description: The command used to generate the version of the tool + - - ${task.process}: + type: string + description: The process + - tabix: + type: string + description: The tool name + - tabix -h 2>&1 | grep -oP 'Version:\s*\K[^\s]+': + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The process + - perl-math-cdf: + type: string + description: The tool name + - perl -MMath::CDF -e 'print \\$Math::CDF::VERSION': + type: eval + description: The expression to obtain the version of the tool authors: - "@maxulysse" - "@matthdsm" diff --git a/modules/nf-core/ensemblvep/vep/tests/main.nf.test b/modules/nf-core/ensemblvep/vep/tests/main.nf.test index 4a62ffd5..63d91155 100644 --- a/modules/nf-core/ensemblvep/vep/tests/main.nf.test +++ b/modules/nf-core/ensemblvep/vep/tests/main.nf.test @@ -16,9 +16,12 @@ nextflow_process { when { process { """ - vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + vep_cache = channel.of([ + [ id:'115_WBcel235' ], + file('s3://annotation-cache/vep_cache/115_WBcel235/') + ]).collect() - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true), [] @@ -27,7 +30,7 @@ nextflow_process { input[2] = params.vep_species input[3] = params.vep_cache_version input[4] = vep_cache - input[5] = Channel.value([ + input[5] = channel.value([ [id:"fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ]) @@ -40,9 +43,9 @@ nextflow_process { assert process.success assertAll( { assert snapshot( - process.out.versions, - path(process.out.vcf.get(0).get(1)).vcf.variantsMD5, - file(process.out.tbi.get(0).get(1)).name + file(process.out.vcf[0][1]).name + ",variantsMD5:" + path(process.out.vcf[0][1]).vcf.variantsMD5, + file(process.out.tbi[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } @@ -55,9 +58,12 @@ nextflow_process { when { process { """ - vep_cache = Channel.of(file('s3://annotation-cache/vep_cache/113_WBcel235/')).collect() + vep_cache = channel.of([ + [ id:'115_WBcel235' ], + file('s3://annotation-cache/vep_cache/115_WBcel235/') + ]).collect() - input[0] = Channel.of([ + input[0] = channel.of([ [ id:'test' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf', checkIfExists: true), [] @@ -66,7 +72,7 @@ nextflow_process { input[2] = params.vep_species input[3] = params.vep_cache_version input[4] = vep_cache - input[5] = Channel.value([ + input[5] = channel.value([ [id:"fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ]) @@ -78,8 +84,11 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out.versions).match() }, - { assert path(process.out.tab.get(0).get(1)).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v114.2") } + { assert snapshot( + file(process.out.tab[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") + }).match() }, + { assert path(process.out.tab[0][1]).linesGzip.contains("## ENSEMBL VARIANT EFFECT PREDICTOR v115.2") } ) } } diff --git a/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap b/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap index bd80e401..6f834d3e 100644 --- a/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap +++ b/modules/nf-core/ensemblvep/vep/tests/main.nf.test.snap @@ -1,28 +1,69 @@ { "test_ensemblvep_vep_fasta_tab_gz": { "content": [ - [ - "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" - ] + "test.tab.gz", + { + "versions_ensemblvep": [ + [ + "ENSEMBLVEP_VEP", + "ensemblvep", + "115.2" + ] + ], + "versions_perlmathcdf": [ + [ + "ENSEMBLVEP_VEP", + "perl-math-cdf", + "0.1" + ] + ], + "versions_tabix": [ + [ + "ENSEMBLVEP_VEP", + "tabix", + "1.21" + ] + ] + } ], + "timestamp": "2026-02-06T12:47:57.03116265", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-08-21T13:16:46.760065318" + "nf-test": "0.9.3", + "nextflow": "25.10.3" + } }, "test_ensemblvep_vep_fasta_vcf - stub (not really but linting complains otherwise)": { "content": [ - [ - "versions.yml:md5,01653f5a713b20d56ed2468a2dab959a" - ], - "d41d8cd98f00b204e9800998ecf8427e", - "test.vcf.gz.tbi" + "test.vcf.gz,variantsMD5:d41d8cd98f00b204e9800998ecf8427e", + "test.vcf.gz.tbi", + { + "versions_ensemblvep": [ + [ + "ENSEMBLVEP_VEP", + "ensemblvep", + "115.2" + ] + ], + "versions_perlmathcdf": [ + [ + "ENSEMBLVEP_VEP", + "perl-math-cdf", + "0.1" + ] + ], + "versions_tabix": [ + [ + "ENSEMBLVEP_VEP", + "tabix", + "1.21" + ] + ] + } ], + "timestamp": "2026-02-06T12:47:34.421995264", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-08-21T13:16:00.65871573" + "nf-test": "0.9.3", + "nextflow": "25.10.3" + } } } \ No newline at end of file diff --git a/modules/nf-core/ensemblvep/vep/tests/nextflow.config b/modules/nf-core/ensemblvep/vep/tests/nextflow.config index f1f66774..8e68fe24 100644 --- a/modules/nf-core/ensemblvep/vep/tests/nextflow.config +++ b/modules/nf-core/ensemblvep/vep/tests/nextflow.config @@ -1,5 +1,5 @@ params { - vep_cache_version = "113" + vep_cache_version = "115" vep_genome = "WBcel235" vep_species = "caenorhabditis_elegans" } diff --git a/modules/nf-core/minimap2/align/main.nf b/modules/nf-core/minimap2/align/main.nf index 453d4566..df55071a 100644 --- a/modules/nf-core/minimap2/align/main.nf +++ b/modules/nf-core/minimap2/align/main.nf @@ -20,7 +20,7 @@ process MINIMAP2_ALIGN { tuple val(meta), path("*.paf") , optional: true, emit: paf tuple val(meta), path("*.bam") , optional: true, emit: bam tuple val(meta), path("*.bam.${bam_index_extension}"), optional: true, emit: index - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("minimap2"), eval("minimap2 --version"), topic: versions, emit: versions_minimap2 when: task.ext.when == null || task.ext.when @@ -38,25 +38,17 @@ process MINIMAP2_ALIGN { def bam_input = "${reads.extension}".matches('sam|bam|cram') def samtools_reset_fastq = bam_input ? "samtools reset --threads ${task.cpus-1} $args3 $reads | samtools fastq --threads ${task.cpus-1} $args4 |" : '' def query = bam_input ? "-" : reads - def target = reference ?: (bam_input ? error("BAM input requires reference") : reads) - + def target = reference ?: (bam_input ? error("Error: minimap2/align BAM input mode requires reference") : reads) """ $samtools_reset_fastq \\ minimap2 \\ - $args \\ - -t $task.cpus \\ - $target \\ - $query \\ - $cigar_paf \\ - $set_cigar_bam \\ - $bam_output - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - minimap2: \$(minimap2 --version 2>&1) - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${args} \\ + -t ${task.cpus} \\ + ${target} \\ + ${query} \\ + ${cigar_paf} \\ + ${set_cigar_bam} \\ + ${bam_output} """ stub: @@ -64,15 +56,11 @@ process MINIMAP2_ALIGN { def output_file = bam_format ? "${prefix}.bam" : "${prefix}.paf" def bam_index = bam_index_extension ? "touch ${prefix}.bam.${bam_index_extension}" : "" def bam_input = "${reads.extension}".matches('sam|bam|cram') - def target = reference ?: (bam_input ? error("BAM input requires reference") : reads) - + if(bam_input && !reference) { + error("Error: minimap2/align BAM input mode requires reference!") + } """ touch $output_file ${bam_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - minimap2: \$(minimap2 --version 2>&1) - END_VERSIONS """ } diff --git a/modules/nf-core/minimap2/align/meta.yml b/modules/nf-core/minimap2/align/meta.yml index b501526e..40bb20ad 100644 --- a/modules/nf-core/minimap2/align/meta.yml +++ b/modules/nf-core/minimap2/align/meta.yml @@ -85,13 +85,27 @@ output: description: BAM alignment index pattern: "*.bam.*" ontologies: [] + versions_minimap2: + - - ${task.process}: + type: string + description: The process name + - minimap2: + type: string + description: The tool name + - minimap2 --version: + type: eval + description: The tool version +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process name + - minimap2: + type: string + description: The tool name + - minimap2 --version: + type: eval + description: The tool version authors: - "@heuermh" - "@sofstam" diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test b/modules/nf-core/minimap2/align/tests/main.nf.test index 4072c171..34597d6f 100644 --- a/modules/nf-core/minimap2/align/tests/main.nf.test +++ b/modules/nf-core/minimap2/align/tests/main.nf.test @@ -36,7 +36,7 @@ nextflow_process { { assert snapshot( bam(process.out.bam[0][1]).getHeader(), bam(process.out.bam[0][1]).getReadsMD5(), - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions_") } ).match() } ) } @@ -71,7 +71,7 @@ nextflow_process { bam(process.out.bam[0][1]).getHeader(), bam(process.out.bam[0][1]).getReadsMD5(), file(process.out.index[0][1]).name, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions_") } ).match() } ) } @@ -108,7 +108,7 @@ nextflow_process { { assert snapshot( bam(process.out.bam[0][1]).getHeader(), bam(process.out.bam[0][1]).getReadsMD5(), - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions_") } ).match() } ) } @@ -142,7 +142,7 @@ nextflow_process { { assert snapshot( bam(process.out.bam[0][1]).getHeader(), bam(process.out.bam[0][1]).getReadsMD5(), - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions_") } ).match() } ) } @@ -176,7 +176,7 @@ nextflow_process { { assert snapshot( bam(process.out.bam[0][1]).getHeader(), bam(process.out.bam[0][1]).getReadsMD5(), - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions_") } ).match() } ) } @@ -211,7 +211,7 @@ nextflow_process { bam(process.out.bam[0][1]).getHeader(), bam(process.out.bam[0][1]).getReadsMD5(), file(process.out.index[0][1]).name, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions_") } ).match() } ) } @@ -438,4 +438,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test.snap b/modules/nf-core/minimap2/align/tests/main.nf.test.snap index 89f20336..93e0eb3b 100644 --- a/modules/nf-core/minimap2/align/tests/main.nf.test.snap +++ b/modules/nf-core/minimap2/align/tests/main.nf.test.snap @@ -9,15 +9,21 @@ ], "5d426b9a5f5b2c54f1d7f1e4c238ae94", "test.bam.bai", - [ - "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" - ] + { + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:23.829797899" + "timestamp": "2026-01-22T15:02:10.851485367" }, "sarscov2 - bam, fasta, true, 'bai', false, false - stub": { "content": [ @@ -44,7 +50,11 @@ ] ], "3": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ], "bam": [ [ @@ -67,16 +77,20 @@ "paf": [ ], - "versions": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:54.665655242" + "timestamp": "2026-01-22T15:02:56.708796666" }, "sarscov2 - fastq, fasta, true, 'bai', false, false - stub": { "content": [ @@ -103,7 +117,11 @@ ] ], "3": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ], "bam": [ [ @@ -126,16 +144,20 @@ "paf": [ ], - "versions": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:38.492212433" + "timestamp": "2026-01-22T15:02:32.614463827" }, "sarscov2 - fastq, fasta, false, [], false, false - stub": { "content": [ @@ -156,7 +178,11 @@ ], "3": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ], "bam": [ @@ -173,16 +199,20 @@ "test.paf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:43.879647142" + "timestamp": "2026-01-22T15:02:40.02163098" }, "sarscov2 - fastq, fasta, true, [], false, false - stub": { "content": [ @@ -203,7 +233,11 @@ ], "3": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ], "bam": [ [ @@ -220,16 +254,20 @@ "paf": [ ], - "versions": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:33.262333471" + "timestamp": "2026-01-22T15:02:25.102539679" }, "sarscov2 - [fastq1, fastq2], fasta, true, false, false": { "content": [ @@ -240,15 +278,21 @@ "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "1bc392244f228bf52cf0b5a8f6a654c9", - [ - "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" - ] + { + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:07.571731983" + "timestamp": "2026-01-22T15:01:46.456636022" }, "sarscov2 - fastq, fasta, true, [], false, false": { "content": [ @@ -259,15 +303,21 @@ "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "f194745c0ccfcb2a9c0aee094a08750", - [ - "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" - ] + { + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:47:56.497792473" + "timestamp": "2026-01-22T15:01:30.525133177" }, "sarscov2 - fastq, fasta, true, 'bai', false, false": { "content": [ @@ -279,15 +329,21 @@ ], "f194745c0ccfcb2a9c0aee094a08750", "test.bam.bai", - [ - "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" - ] + { + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:01.888544427" + "timestamp": "2026-01-22T15:01:38.84829029" }, "sarscov2 - bam, fasta, true, [], false, false": { "content": [ @@ -298,15 +354,21 @@ "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "5d426b9a5f5b2c54f1d7f1e4c238ae94", - [ - "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" - ] + { + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:18.376062313" + "timestamp": "2026-01-22T15:02:02.351060285" }, "sarscov2 - bam, fasta, true, [], false, false - stub": { "content": [ @@ -327,7 +389,11 @@ ], "3": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ], "bam": [ [ @@ -344,16 +410,20 @@ "paf": [ ], - "versions": [ - "versions.yml:md5,231f31609e2b72661af6a11b7aee3cfe" + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:49.268693724" + "timestamp": "2026-01-22T15:02:47.579634041" }, "sarscov2 - fastq, [], true, false, false": { "content": [ @@ -463,14 +533,20 @@ "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.21\tCL:samtools sort -@ 1 -o test.bam" ], "16c1c651f8ec67383bcdee3c55aed94f", - [ - "versions.yml:md5,660fcf8ff66d4dce2045ffa0e325eed8" - ] + { + "versions_minimap2": [ + [ + "MINIMAP2_ALIGN", + "minimap2", + "2.29-r1283" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-04-22T14:48:12.942360555" + "timestamp": "2026-01-22T15:01:54.090788633" } } \ No newline at end of file diff --git a/modules/nf-core/minimap2/index/main.nf b/modules/nf-core/minimap2/index/main.nf index 56cb0efd..dd81eab0 100644 --- a/modules/nf-core/minimap2/index/main.nf +++ b/modules/nf-core/minimap2/index/main.nf @@ -12,7 +12,7 @@ process MINIMAP2_INDEX { output: tuple val(meta), path("*.mmi"), emit: index - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("minimap2"), eval("minimap2 --version"), topic: versions, emit: versions_minimap2 when: task.ext.when == null || task.ext.when @@ -25,20 +25,10 @@ process MINIMAP2_INDEX { -d ${fasta.baseName}.mmi \\ $args \\ $fasta - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - minimap2: \$(minimap2 --version 2>&1) - END_VERSIONS """ stub: """ touch ${fasta.baseName}.mmi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - minimap2: \$(minimap2 --version 2>&1) - END_VERSIONS """ } diff --git a/modules/nf-core/minimap2/index/meta.yml b/modules/nf-core/minimap2/index/meta.yml index 0d6a2d86..6985fb0c 100644 --- a/modules/nf-core/minimap2/index/meta.yml +++ b/modules/nf-core/minimap2/index/meta.yml @@ -10,7 +10,8 @@ tools: A versatile pairwise aligner for genomic and spliced nucleotide sequences. homepage: https://github.com/lh3/minimap2 documentation: https://github.com/lh3/minimap2#uguide - licence: ["MIT"] + licence: + - "MIT" identifier: "" input: - - meta: @@ -35,13 +36,27 @@ output: description: Minimap2 fasta index. pattern: "*.mmi" ontologies: [] + versions_minimap2: + - - ${task.process}: + type: string + description: The name of the process + - minimap2: + type: string + description: The name of the tool + - minimap2 --version: + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - minimap2: + type: string + description: The name of the tool + - minimap2 --version: + type: eval + description: The expression to obtain the version of the tool authors: - "@yuukiiwa" - "@drpatelh" diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test b/modules/nf-core/minimap2/index/tests/main.nf.test index 97840ff7..79b7cc55 100644 --- a/modules/nf-core/minimap2/index/tests/main.nf.test +++ b/modules/nf-core/minimap2/index/tests/main.nf.test @@ -29,4 +29,26 @@ nextflow_process { } -} \ No newline at end of file + test("minimap2 index - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ] + """ + } + } + + then { + assert process.success + assert snapshot(process.out).match() + } + + } + +} diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test.snap b/modules/nf-core/minimap2/index/tests/main.nf.test.snap index dbb32049..a3ec750b 100644 --- a/modules/nf-core/minimap2/index/tests/main.nf.test.snap +++ b/modules/nf-core/minimap2/index/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,2c3e19022653b28d77646b2e9cc9bdb3" + [ + "MINIMAP2_INDEX", + "minimap2", + "2.29-r1283" + ] ], "index": [ [ @@ -21,15 +25,60 @@ "genome.mmi:md5,72e450f12dc691e763c697463bdb1571" ] ], - "versions": [ - "versions.yml:md5,2c3e19022653b28d77646b2e9cc9bdb3" + "versions_minimap2": [ + [ + "MINIMAP2_INDEX", + "minimap2", + "2.29-r1283" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-09T16:12:10.625322" + }, + "minimap2 index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "genome.mmi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + "MINIMAP2_INDEX", + "minimap2", + "2.29-r1283" + ] + ], + "index": [ + [ + { + "id": "test" + }, + "genome.mmi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_minimap2": [ + [ + "MINIMAP2_INDEX", + "minimap2", + "2.29-r1283" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-04-22T14:50:37.213379742" + "timestamp": "2026-02-09T16:12:15.244242" } } \ No newline at end of file diff --git a/modules/nf-core/modkit/pileup/environment.yml b/modules/nf-core/modkit/pileup/environment.yml index 67c67438..62b97863 100644 --- a/modules/nf-core/modkit/pileup/environment.yml +++ b/modules/nf-core/modkit/pileup/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - ont-modkit=0.6.0 + - ont-modkit=0.6.1 diff --git a/modules/nf-core/modkit/pileup/main.nf b/modules/nf-core/modkit/pileup/main.nf index 462f8973..e610efb7 100644 --- a/modules/nf-core/modkit/pileup/main.nf +++ b/modules/nf-core/modkit/pileup/main.nf @@ -4,8 +4,8 @@ process MODKIT_PILEUP { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ont-modkit:0.6.0--hcdda2d0_0': - 'biocontainers/ont-modkit:0.6.0--hcdda2d0_0' }" + 'https://depot.galaxyproject.org/singularity/ont-modkit:0.6.1--hcdda2d0_0': + 'biocontainers/ont-modkit:0.6.1--hcdda2d0_0' }" input: tuple val(meta), path(bam), path(bai) @@ -15,7 +15,7 @@ process MODKIT_PILEUP { output: tuple val(meta), path("*.bed.gz") , emit: bedgz , optional: true tuple val(meta), path("*.log") , emit: log , optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('modkit'), eval("modkit --version | sed 's/modkit //'"), emit: versions_modkit, topic: versions when: task.ext.when == null || task.ext.when @@ -48,11 +48,6 @@ process MODKIT_PILEUP { else mv ${prefix}.tmp ${prefix}.bed.gz fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - modkit: \$( modkit --version | sed 's/mod_kit //' ) - END_VERSIONS """ stub: @@ -63,10 +58,5 @@ process MODKIT_PILEUP { echo | gzip > ${prefix}.bed.gz touch ${prefix}.log - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - modkit: \$( modkit --version | sed 's/mod_kit //' ) - END_VERSIONS """ } diff --git a/modules/nf-core/modkit/pileup/meta.yml b/modules/nf-core/modkit/pileup/meta.yml index 3d7d9fd5..262a1067 100644 --- a/modules/nf-core/modkit/pileup/meta.yml +++ b/modules/nf-core/modkit/pileup/meta.yml @@ -79,13 +79,28 @@ output: description: File for debug logs to be written to pattern: "*.log" ontologies: [] + versions_modkit: + - - ${task.process}: + type: string + description: The name of the process + - modkit: + type: string + description: The name of the tool + - modkit --version | sed 's/modkit //': + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - modkit: + type: string + description: The name of the tool + - modkit --version | sed 's/modkit //': + type: eval + description: The expression to obtain the version of the tool authors: - "@Michal-Babins" - "@fellen31" diff --git a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap index 3f30af70..55ba8d79 100644 --- a/modules/nf-core/modkit/pileup/tests/main.nf.test.snap +++ b/modules/nf-core/modkit/pileup/tests/main.nf.test.snap @@ -14,7 +14,11 @@ ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -27,16 +31,20 @@ "log": [ ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.04.2" }, - "timestamp": "2025-12-11T14:18:34.613472799" + "timestamp": "2026-01-22T11:46:15.943030058" }, "[bam, bai], [fasta, fai], [] - stub": { "content": [ @@ -58,7 +66,11 @@ ] ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -76,8 +88,12 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], @@ -85,7 +101,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.2" }, - "timestamp": "2025-12-19T09:56:52.060201127" + "timestamp": "2026-01-22T11:46:32.126118262" }, "[bam, bai], [fasta, fai], [], phased": { "content": [ @@ -106,7 +122,11 @@ ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -123,16 +143,20 @@ "log": [ ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.04.2" }, - "timestamp": "2025-12-11T14:18:42.290304403" + "timestamp": "2026-01-22T11:46:20.026595076" }, "[bam, bai], [fasta, fai], [], phased - stub": { "content": [ @@ -154,7 +178,11 @@ ] ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -172,8 +200,12 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], @@ -181,7 +213,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.2" }, - "timestamp": "2025-12-19T09:57:00.458022339" + "timestamp": "2026-01-22T11:46:40.051078689" }, "[bam, bai], [fasta, fai], []": { "content": [ @@ -198,7 +230,11 @@ ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -211,16 +247,20 @@ "log": [ ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.04.2" }, - "timestamp": "2025-12-11T14:18:26.964056871" + "timestamp": "2026-01-22T11:46:11.978364755" }, "[bam, bai], [], []": { "content": [ @@ -237,7 +277,11 @@ ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -250,16 +294,20 @@ "log": [ ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.04.2" }, - "timestamp": "2025-12-11T14:18:19.273553787" + "timestamp": "2026-01-22T11:46:07.765200083" }, "[bam, bai], [fasta, fai], bed, phased": { "content": [ @@ -280,7 +328,11 @@ ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -297,16 +349,20 @@ "log": [ ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.04.2" }, - "timestamp": "2025-12-11T14:18:50.043853179" + "timestamp": "2026-01-22T11:46:24.273720433" }, "[bam, bai], [fasta, fai], bed, phased - stub": { "content": [ @@ -328,7 +384,11 @@ ] ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -346,8 +406,12 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], @@ -355,7 +419,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.2" }, - "timestamp": "2025-12-19T09:57:04.868976217" + "timestamp": "2026-01-22T11:46:44.034301557" }, "[bam, bai], [], [] - stub": { "content": [ @@ -377,7 +441,11 @@ ] ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -395,8 +463,12 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], @@ -404,7 +476,7 @@ "nf-test": "0.9.3", "nextflow": "25.04.2" }, - "timestamp": "2025-12-19T09:56:47.829913052" + "timestamp": "2026-01-22T11:46:28.153658113" }, "[bam, bai], [fasta, fai], bed - stub": { "content": [ @@ -426,7 +498,11 @@ ] ], "2": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ], "bedgz": [ [ @@ -444,8 +520,12 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e6cca757b0a2786ae34eaa213d95edc3" + "versions_modkit": [ + [ + "MODKIT_PILEUP", + "modkit", + "0.6.1" + ] ] } ], @@ -453,6 +533,6 @@ "nf-test": "0.9.3", "nextflow": "25.04.2" }, - "timestamp": "2025-12-19T09:56:56.290093996" + "timestamp": "2026-01-22T11:46:36.173040315" } } \ No newline at end of file diff --git a/modules/nf-core/mosdepth/environment.yml b/modules/nf-core/mosdepth/environment.yml index 97c93721..1c7f3ee8 100644 --- a/modules/nf-core/mosdepth/environment.yml +++ b/modules/nf-core/mosdepth/environment.yml @@ -5,6 +5,5 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/mosdepth - - mosdepth=0.3.11=h0ec343a_1 - # renovate: datasource=conda depName=bioconda/htslib - htslib=1.22.1 + - mosdepth=0.3.11=h0ec343a_1 diff --git a/modules/nf-core/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf index 72ba5e48..63739bfa 100644 --- a/modules/nf-core/mosdepth/main.nf +++ b/modules/nf-core/mosdepth/main.nf @@ -24,7 +24,7 @@ process MOSDEPTH { tuple val(meta), path('*.quantized.bed.gz.csi') , optional:true, emit: quantized_csi tuple val(meta), path('*.thresholds.bed.gz') , optional:true, emit: thresholds_bed tuple val(meta), path('*.thresholds.bed.gz.csi'), optional:true, emit: thresholds_csi - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('mosdepth'), eval("mosdepth --version | sed 's/mosdepth //g'"), topic: versions, emit: versions_mosdepth when: task.ext.when == null || task.ext.when @@ -34,11 +34,11 @@ process MOSDEPTH { def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--fasta ${fasta}" : "" def interval = bed ? "--by ${bed}" : "" - if (bed && args.contains("--by")) { + if (bed && (args.contains("--by") || args.contains("-b "))) { error "'--by' can only be specified once when running mosdepth! Either remove input BED file definition or remove '--by' from 'ext.args' definition" } - if (!bed && args.contains("--thresholds")) { - error "'--thresholds' can only be specified in conjunction with '--by'" + if (args.contains("--thresholds") && !(bed || args.contains("--by") || args.contains("-b "))) { + error "'--thresholds' can only be specified in conjunction with '--by' or an input bed file" } """ @@ -49,15 +49,17 @@ process MOSDEPTH { $args \\ $prefix \\ $bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') - END_VERSIONS """ stub: + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + if (bed && (args.contains("--by") || args.contains("-b "))) { + error "'--by' can only be specified once when running mosdepth! Either remove input BED file definition or remove '--by' from 'ext.args' definition" + } + if (args.contains("--thresholds") && !(bed || args.contains("--by") || args.contains("-b "))) { + error "'--thresholds' can only be specified in conjunction with '--by' or an input bed file" + } """ touch ${prefix}.global.dist.txt touch ${prefix}.region.dist.txt @@ -71,10 +73,5 @@ process MOSDEPTH { touch ${prefix}.quantized.bed.gz.csi echo "" | gzip > ${prefix}.thresholds.bed.gz touch ${prefix}.thresholds.bed.gz.csi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - mosdepth: \$(mosdepth --version 2>&1 | sed 's/^.*mosdepth //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/mosdepth/meta.yml b/modules/nf-core/mosdepth/meta.yml index af1ea44a..04c8bfe1 100644 --- a/modules/nf-core/mosdepth/meta.yml +++ b/modules/nf-core/mosdepth/meta.yml @@ -178,13 +178,28 @@ output: description: Index file for BED file with threshold coverage pattern: "*.{thresholds.bed.gz.csi}" ontologies: [] + versions_mosdepth: + - - ${task.process}: + type: string + description: The process the versions were collected from + - mosdepth: + type: string + description: The tool name + - "mosdepth --version | sed 's/mosdepth //g'": + type: string + description: The command used to generate the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - mosdepth: + type: string + description: The tool name + - "mosdepth --version | sed 's/mosdepth //g'": + type: string + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" @@ -192,6 +207,5 @@ authors: - "@matthdsm" maintainers: - "@joseespinosa" - - "@drpatelh" - "@ramprasadn" - "@matthdsm" diff --git a/modules/nf-core/mosdepth/tests/main.nf.test b/modules/nf-core/mosdepth/tests/main.nf.test index 0b3c860d..b05dde5b 100644 --- a/modules/nf-core/mosdepth/tests/main.nf.test +++ b/modules/nf-core/mosdepth/tests/main.nf.test @@ -7,10 +7,14 @@ nextflow_process { tag "modules" tag "modules_nfcore" tag "mosdepth" + config "./nextflow.config" test("homo_sapiens - bam, bai, []") { when { + params { + module_args = "" + } process { """ input[0] = [ @@ -25,9 +29,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } @@ -36,6 +40,9 @@ nextflow_process { test("homo_sapiens - bam, bai, bed") { when { + params { + module_args = "" + } process { """ input[0] = [ @@ -50,9 +57,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } @@ -61,6 +68,9 @@ nextflow_process { test("homo_sapiens - cram, crai, []") { when { + params { + module_args = "" + } process { """ input[0] = [ @@ -78,9 +88,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } @@ -89,6 +99,9 @@ nextflow_process { test("homo_sapiens - cram, crai, bed") { when { + params { + module_args = "" + } process { """ input[0] = [ @@ -106,9 +119,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } @@ -116,8 +129,10 @@ nextflow_process { test("homo_sapiens - bam, bai, [] - window") { - config "./window.config" when { + params { + module_args = "--by 100" + } process { """ input[0] = [ @@ -132,9 +147,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } @@ -142,8 +157,10 @@ nextflow_process { test("homo_sapiens - bam, bai, [] - quantized") { - config "./quantized.config" when { + params { + module_args = "--quantize 0:1:4:100:200" + } process { """ input[0] = [ @@ -158,9 +175,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } @@ -168,8 +185,10 @@ nextflow_process { test("homo_sapiens - bam, bai, bed - thresholds") { - config "./threshold.config" when { + params { + module_args = "--thresholds 1,10,20,30" + } process { """ input[0] = [ @@ -184,9 +203,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } @@ -194,8 +213,10 @@ nextflow_process { test("homo_sapiens - bam, bai, bed - fail") { - config "./window.config" when { + params { + module_args = "--by 100" + } process { """ input[0] = [ @@ -210,9 +231,7 @@ nextflow_process { } then { - assertAll( - { assert process.failed } - ) + assert process.failed } } @@ -221,6 +240,9 @@ nextflow_process { options "-stub" when { + params { + module_args = "" + } process { """ input[0] = [ @@ -235,9 +257,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } diff --git a/modules/nf-core/mosdepth/tests/main.nf.test.snap b/modules/nf-core/mosdepth/tests/main.nf.test.snap index a063dd9f..c27fcc79 100644 --- a/modules/nf-core/mosdepth/tests/main.nf.test.snap +++ b/modules/nf-core/mosdepth/tests/main.nf.test.snap @@ -39,7 +39,11 @@ ] ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ [ @@ -221,8 +225,12 @@ "test.thresholds.bed.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], @@ -260,7 +268,11 @@ ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ [ @@ -394,8 +406,12 @@ "thresholds_csi": [ ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], @@ -433,7 +449,11 @@ ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ @@ -555,8 +575,12 @@ "thresholds_csi": [ ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], @@ -594,7 +618,11 @@ ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ [ @@ -728,8 +756,12 @@ "thresholds_csi": [ ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], @@ -767,7 +799,11 @@ ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ [ @@ -901,8 +937,12 @@ "thresholds_csi": [ ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], @@ -940,7 +980,11 @@ ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ @@ -1038,8 +1082,12 @@ "thresholds_csi": [ ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], @@ -1077,7 +1125,11 @@ ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ @@ -1175,8 +1227,12 @@ "thresholds_csi": [ ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], @@ -1226,7 +1282,11 @@ ] ], "12": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ], "2": [ [ @@ -1372,8 +1432,12 @@ "test.thresholds.bed.gz.csi:md5,2c52ab89e7496af475de3cb2ca04c7b3" ] ], - "versions": [ - "versions.yml:md5,74f14bf8082836f8dc941b8c77c176fb" + "versions_mosdepth": [ + [ + "MOSDEPTH", + "mosdepth", + "0.3.11" + ] ] } ], diff --git a/modules/nf-core/mosdepth/tests/nextflow.config b/modules/nf-core/mosdepth/tests/nextflow.config new file mode 100644 index 00000000..b21c05b5 --- /dev/null +++ b/modules/nf-core/mosdepth/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: "MOSDEPTH" { + ext.args = params.module_args + } +} diff --git a/modules/nf-core/mosdepth/tests/quantized.config b/modules/nf-core/mosdepth/tests/quantized.config deleted file mode 100644 index c208a4ce..00000000 --- a/modules/nf-core/mosdepth/tests/quantized.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--quantize 0:1:4:100:200" -} diff --git a/modules/nf-core/mosdepth/tests/threshold.config b/modules/nf-core/mosdepth/tests/threshold.config deleted file mode 100644 index 3302da60..00000000 --- a/modules/nf-core/mosdepth/tests/threshold.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--thresholds 1,10,20,30" -} diff --git a/modules/nf-core/mosdepth/tests/window.config b/modules/nf-core/mosdepth/tests/window.config deleted file mode 100644 index 7f0d08d6..00000000 --- a/modules/nf-core/mosdepth/tests/window.config +++ /dev/null @@ -1,3 +0,0 @@ -process { - ext.args = "--by 100" -} diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 3b0e975b..5376aea1 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -1,25 +1,21 @@ process MULTIQC { + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data' : - 'community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data' + : 'community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b'}" input: - path multiqc_files, stageAs: "?/*" - path(multiqc_config) - path(extra_multiqc_config) - path(multiqc_logo) - path(replace_names) - path(sample_names) + tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) output: - path "*.html" , emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + tuple val(meta), path("*.html"), emit: report + tuple val(meta), path("*_data"), emit: data + tuple val(meta), path("*_plots"), emit: plots, optional: true // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions when: task.ext.when == null || task.ext.when @@ -27,8 +23,7 @@ process MULTIQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config ${multiqc_config}" : '' - def extra_config = extra_multiqc_config ? "--config ${extra_multiqc_config}" : '' + def config = multiqc_config ? multiqc_config instanceof List ? "--config ${multiqc_config.join(' --config ')}" : "--config ${multiqc_config}" : "" def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' def replace = replace_names ? "--replace-names ${replace_names}" : '' def samples = sample_names ? "--sample-names ${sample_names}" : '' @@ -38,7 +33,6 @@ process MULTIQC { ${args} \\ ${config} \\ ${prefix} \\ - ${extra_config} \\ ${logo} \\ ${replace} \\ ${samples} \\ @@ -50,6 +44,7 @@ process MULTIQC { mkdir multiqc_data touch multiqc_data/.stub mkdir multiqc_plots + touch multiqc_plots/.stub touch multiqc_report.html """ } diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index f790cab0..ef434a9a 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -1,6 +1,6 @@ name: multiqc -description: Aggregate results from bioinformatics analyses across many samples into - a single report +description: Aggregate results from bioinformatics analyses across many samples + into a single report keywords: - QC - bioinformatics tools @@ -12,67 +12,81 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ - licence: ["GPL-3.0-or-later"] + licence: + - "GPL-3.0-or-later" identifier: biotools:multiqc input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC - ontologies: [] - - multiqc_config: - type: file - description: Optional config yml for MultiQC - pattern: "*.{yml,yaml}" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML - - extra_multiqc_config: - type: file - description: Second optional config yml for MultiQC. Will override common sections - in multiqc_config. - pattern: "*.{yml,yaml}" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML - - multiqc_logo: - type: file - description: Optional logo file for MultiQC - pattern: "*.{png}" - ontologies: [] - - replace_names: - type: file - description: | - Optional two-column sample renaming file. First column a set of - patterns, second column a set of corresponding replacements. Passed via - MultiQC's `--replace-names` option. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV - - sample_names: - type: file - description: | - Optional TSV file with headers, passed to the MultiQC --sample_names - argument. - pattern: "*.{tsv}" - ontologies: - - edam: http://edamontology.org/format_3475 # TSV -output: - report: - - "*.html": + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - multiqc_files: type: file - description: MultiQC report file - pattern: ".html" + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC ontologies: [] - data: - - "*_data": - type: directory - description: MultiQC data dir - pattern: "multiqc_data" - plots: - - "*_plots": + - multiqc_config: type: file - description: Plots created by MultiQC - pattern: "*_data" + description: Optional config yml for MultiQC + pattern: "*.{yml,yaml}" + ontologies: + - edam: http://edamontology.org/format_3750 + - multiqc_logo: + type: file + description: Optional logo file for MultiQC + pattern: "*.{png}" ontologies: [] + - replace_names: + type: file + description: | + Optional two-column sample renaming file. First column a set of + patterns, second column a set of corresponding replacements. Passed via + MultiQC's `--replace-names` option. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 + - sample_names: + type: file + description: | + Optional TSV file with headers, passed to the MultiQC --sample_names + argument. + pattern: "*.{tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 +output: + report: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*.html": + type: file + description: MultiQC report file + pattern: ".html" + ontologies: [] + data: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_data": + type: directory + description: MultiQC data dir + pattern: "multiqc_data" + plots: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1', single_end:false ] + - "*_plots": + type: file + description: Plots created by MultiQC + pattern: "*_plots" + ontologies: [] versions: - - ${task.process}: type: string @@ -95,25 +109,25 @@ maintainers: - "@jfy133" containers: conda: - linux_amd64: - lock_file: https://wave.seqera.io/v1alpha1/builds/bd-d58f60e4deb769bf_1/condalock - linux_arm64: - lock_file: https://wave.seqera.io/v1alpha1/builds/bd-193776baee4194db_1/condalock + linux/amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-ee7739d47738383b_1/condalock + linux/arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-58d7dee710ab3aa8_1/condalock docker: - linux_amd64: - build_id: bd-d58f60e4deb769bf_1 - name: community.wave.seqera.io/library/multiqc:1.32--d58f60e4deb769bf - scanId: sc-d76ac07493e940b4_6 - linux_arm64: - build_id: bd-193776baee4194db_1 - name: community.wave.seqera.io/library/multiqc:1.32--193776baee4194db - scanId: sc-86caded0bff8246e_3 + linux/amd64: + build_id: bd-ee7739d47738383b_1 + name: community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b + scanId: sc-6ddec592dcadd583_4 + linux/arm64: + build_id: bd-58d7dee710ab3aa8_1 + name: community.wave.seqera.io/library/multiqc:1.33--58d7dee710ab3aa8 + scanId: sc-a04c42273e34c55c_2 singularity: - linux_amd64: - build_id: bd-e649ffa094d1ef4a_1 - name: oras://community.wave.seqera.io/library/multiqc:1.32--e649ffa094d1ef4a - https: https://community.wave.seqera.io/v2/library/multiqc/blobs/sha256:8c6c120d559d7ee04c7442b61ad7cf5a9e8970be5feefb37d68eeaa60c1034eb - linux_arm64: - build_id: bd-aee0064f5570ef22_1 - name: oras://community.wave.seqera.io/library/multiqc:1.32--aee0064f5570ef22 - https: https://community.wave.seqera.io/v2/library/multiqc/blobs/sha256:f02c59ebf6e9a00aa954ee8188a4ecc5c743e18f40b9215a242f67606a00f9cf + linux/amd64: + build_id: bd-e3576ddf588fa00d_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data + name: oras://community.wave.seqera.io/library/multiqc:1.33--e3576ddf588fa00d + linux/arm64: + build_id: bd-2537ca5f8445e3c2_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/78/78b89e91d89e9cc99ad5ade5be311f347838cb2acbfb4f13bc343b170be09ce4/data + name: oras://community.wave.seqera.io/library/multiqc:1.33--2537ca5f8445e3c2 diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index d1ae8b06..0e422eaa 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -15,25 +15,28 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = [] - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) """ } } then { + assert process.success assertAll( - { assert process.success }, - { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, - { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } + { assert snapshot( + file(process.out.report[0][1]).name, + file(process.out.data[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") + }).match() } ) } - } test("sarscov2 single-end [fastqc] - custom prefix") { @@ -42,24 +45,28 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = [] - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) """ } } then { + assert process.success assertAll( - { assert process.success }, - { assert process.out.report[0] ==~ ".*/custom_prefix.html" }, - { assert process.out.data[0] ==~ ".*/custom_prefix_data" } + { assert snapshot( + file(process.out.report[0][1]).name, + file(process.out.data[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") + }).match() } ) } - } test("sarscov2 single-end [fastqc] [config]") { @@ -67,22 +74,60 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = Channel.of(file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true)) - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true), + [], + [], + [] + ]) """ } } then { + assert process.success assertAll( - { assert process.success }, - { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, - { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } + { assert snapshot( + file(process.out.report[0][1]).name, + file(process.out.data[0][1]).name, + file(process.out.plots[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") + }).match() } + ) + } + } + + test("sarscov2 single-end [fastqc] [multiple configs]") { + + when { + process { + """ + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [ + file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true), + file("https://github.com/nf-core/tools/raw/dev/nf_core/pipeline-template/assets/multiqc_config.yml", checkIfExists: true) + ], + [], + [], + [] + ]) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + file(process.out.report[0][1]).name, + file(process.out.data[0][1]).name, + file(process.out.plots[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") + }).match() } ) } } @@ -94,25 +139,23 @@ nextflow_process { when { process { """ - input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) - input[1] = [] - input[2] = [] - input[3] = [] - input[4] = [] - input[5] = [] + input[0] = channel.of([ + [ id: 'FASTQC' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true), + [], + [], + [], + [] + ]) """ } } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out.report.collect { file(it).getName() } + - process.out.data.collect { file(it).getName() } + - process.out.plots.collect { file(it).getName() } + - process.out.findAll { key, val -> key.startsWith("versions")} ).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } - } } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index d72d35b7..c022701f 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -1,6 +1,9 @@ { - "sarscov2 single-end [fastqc]": { + "sarscov2 single-end [fastqc] [multiple configs]": { "content": [ + "multiqc_report.html", + "multiqc_data", + "multiqc_plots", { "versions": [ [ @@ -13,35 +16,81 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-26T20:21:35.851707" + }, + "sarscov2 single-end [fastqc]": { + "content": [ + "multiqc_report.html", + "multiqc_data", + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" }, - "timestamp": "2025-12-09T10:10:43.020315838" + "timestamp": "2026-02-26T15:10:36.019680076" }, "sarscov2 single-end [fastqc] - stub": { "content": [ - [ - "multiqc_report.html", - "multiqc_data", - "multiqc_plots", - { - "versions": [ + { + "data": [ + [ + { + "id": "FASTQC" + }, [ - "MULTIQC", - "multiqc", - "1.33" + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] - } - ] + ], + "plots": [ + [ + { + "id": "FASTQC" + }, + [ + ".stub:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "report": [ + [ + { + "id": "FASTQC" + }, + "multiqc_report.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.4", + "nextflow": "25.10.4" }, - "timestamp": "2025-12-09T10:11:14.131950776" + "timestamp": "2026-02-26T15:14:39.789193051" }, "sarscov2 single-end [fastqc] [config]": { "content": [ + "multiqc_report.html", + "multiqc_data", + "multiqc_plots", { "versions": [ [ @@ -53,9 +102,29 @@ } ], "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.4", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-26T15:21:29.116129274" + }, + "sarscov2 single-end [fastqc] - custom prefix": { + "content": [ + "custom_prefix.html", + "custom_prefix_data", + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.4", + "nextflow": "25.10.4" }, - "timestamp": "2025-12-09T10:11:07.15692209" + "timestamp": "2026-02-26T15:10:43.419877592" } } \ No newline at end of file diff --git a/modules/nf-core/pigz/uncompress/main.nf b/modules/nf-core/pigz/uncompress/main.nf index db712811..51162836 100644 --- a/modules/nf-core/pigz/uncompress/main.nf +++ b/modules/nf-core/pigz/uncompress/main.nf @@ -36,7 +36,6 @@ process PIGZ_UNCOMPRESS { """ stub: - def args = task.ext.args ?: '' uncompressed_filename = zip.toString() - '.gz' """ touch $uncompressed_filename diff --git a/modules/nf-core/pigz/uncompress/meta.yml b/modules/nf-core/pigz/uncompress/meta.yml index cddd0a3b..bbc6a945 100644 --- a/modules/nf-core/pigz/uncompress/meta.yml +++ b/modules/nf-core/pigz/uncompress/meta.yml @@ -10,7 +10,7 @@ tools: description: "Parallel implementation of the gzip algorithm." homepage: "https://zlib.net/pigz/" documentation: "https://zlib.net/pigz/pigz.pdf" - + licence: ["Zlib"] identifier: "" input: - - meta: diff --git a/modules/nf-core/samtools/cat/main.nf b/modules/nf-core/samtools/cat/main.nf index 824d6911..6df7aa76 100644 --- a/modules/nf-core/samtools/cat/main.nf +++ b/modules/nf-core/samtools/cat/main.nf @@ -13,7 +13,7 @@ process SAMTOOLS_CAT { output: tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: @@ -29,11 +29,6 @@ process SAMTOOLS_CAT { $args \\ -o ${prefix}.${file_type} \\ $input_files - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -41,10 +36,5 @@ process SAMTOOLS_CAT { def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() """ touch ${prefix}.${file_type} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/cat/meta.yml b/modules/nf-core/samtools/cat/meta.yml index a2ac0e21..3c4e2fbb 100644 --- a/modules/nf-core/samtools/cat/meta.yml +++ b/modules/nf-core/samtools/cat/meta.yml @@ -51,13 +51,27 @@ output: description: Concatenated CRAM file pattern: "*.{cram}" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@matthdsm" maintainers: diff --git a/modules/nf-core/samtools/cat/tests/main.nf.test b/modules/nf-core/samtools/cat/tests/main.nf.test index dad80b83..7910f65d 100644 --- a/modules/nf-core/samtools/cat/tests/main.nf.test +++ b/modules/nf-core/samtools/cat/tests/main.nf.test @@ -14,22 +14,18 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map + input[0] = [ + [id: 'test'], [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.unaligned.bam', checkIfExists: true) ] - ]) + ] """ } } then { - assertAll( - { assert process.success }, - { assert snapshot(file(process.out.bam[0][1]).name).match("bams_bam") }, - { assert snapshot(process.out.cram).match("bams_cram") }, - { assert snapshot(process.out.versions).match("bams_versions") } - ) + assert process.success + assert snapshot(process.out).match() } } @@ -40,22 +36,18 @@ nextflow_process { when { process { """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map + input[0] = [ + [id: 'test'], [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.unaligned.bam', checkIfExists: true) ] - ]) + ] """ } } then { - assertAll( - { assert process.success }, - { assert snapshot(file(process.out.bam[0][1]).name).match("bams_stub_bam") }, - { assert snapshot(process.out.cram).match("bams_stub_cram") }, - { assert snapshot(process.out.versions).match("bams_stub_versions") } - ) + assert process.success + assert snapshot(process.out).match() } } } diff --git a/modules/nf-core/samtools/cat/tests/main.nf.test.snap b/modules/nf-core/samtools/cat/tests/main.nf.test.snap index 2143309a..1b341c7b 100644 --- a/modules/nf-core/samtools/cat/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/cat/tests/main.nf.test.snap @@ -1,70 +1,96 @@ { - "bams_stub_cram": { + "bams_stub": { "content": [ - [ - - ] + { + "0": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + [ + "SAMTOOLS_CAT", + "samtools", + "1.22.1" + ] + ], + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "cram": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_CAT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "23.04.3" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2024-02-02T16:45:42.587418" + "timestamp": "2026-02-04T14:52:02.961050797" }, - "bams_stub_versions": { + "bams": { "content": [ - [ - "versions.yml:md5,99695cce7873f354da5dd8660522cb4f" - ] + { + "0": [ + [ + { + "id": "test" + }, + "test.bam:md5,ceee7822994e89e29d42cad03be8d54b" + ] + ], + "1": [ + + ], + "2": [ + [ + "SAMTOOLS_CAT", + "samtools", + "1.22.1" + ] + ], + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,ceee7822994e89e29d42cad03be8d54b" + ] + ], + "cram": [ + + ], + "versions_samtools": [ + [ + "SAMTOOLS_CAT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-09-10T13:02:09.79415" - }, - "bams_bam": { - "content": [ - "test.bam" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.04.3" - }, - "timestamp": "2024-02-02T16:45:37.965199" - }, - "bams_cram": { - "content": [ - [ - - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.04.3" - }, - "timestamp": "2024-02-02T16:45:37.96805" - }, - "bams_stub_bam": { - "content": [ - "test.bam" - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.04.3" - }, - "timestamp": "2024-02-02T16:45:42.583881" - }, - "bams_versions": { - "content": [ - [ - "versions.yml:md5,99695cce7873f354da5dd8660522cb4f" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-10T13:02:05.668116" + "timestamp": "2026-02-04T14:51:56.905803472" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index 57a03497..97bfb578 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -8,8 +8,7 @@ process SAMTOOLS_FAIDX { 'biocontainers/samtools:1.22.1--h96c455f_0' }" input: - tuple val(meta), path(fasta) - tuple val(meta2), path(fai) + tuple val(meta), path(fasta), path(fai) val get_sizes output: diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index 163c3015..80aae1da 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -1,5 +1,6 @@ name: samtools_faidx -description: Index FASTA file, and optionally generate a file of chromosome sizes +description: Index FASTA file, and optionally generate a file of chromosome + sizes keywords: - index - fasta @@ -14,7 +15,8 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:samtools input: - - meta: @@ -27,11 +29,6 @@ input: description: FASTA file pattern: "*.{fa,fasta}" ontologies: [] - - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'test' ] - fai: type: file description: FASTA index file @@ -40,7 +37,6 @@ input: - get_sizes: type: boolean description: use cut to get the sizes of the index (true) or not (false) - output: fa: - - meta: @@ -94,9 +90,8 @@ output: type: string description: The tool name - "samtools version | sed '1!d;s/.* //'": - type: string + type: eval description: The command used to generate the version of the tool - topics: versions: - - ${task.process}: @@ -106,7 +101,7 @@ topics: type: string description: The tool name - "samtools version | sed '1!d;s/.* //'": - type: string + type: eval description: The command used to generate the version of the tool authors: - "@drpatelh" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test index 02ba5040..9a86db86 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -18,10 +18,12 @@ nextflow_process { } process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [[],[]] - input[2] = false + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = false """ } } @@ -29,7 +31,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -42,10 +44,12 @@ nextflow_process { } process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true)] - input[1] = [[],[]] - input[2] = false + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true), + [] + ] + input[1] = false """ } } @@ -53,7 +57,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -66,11 +70,12 @@ nextflow_process { } process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] - input[2] = false + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + input[1] = false """ } } @@ -78,7 +83,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -92,11 +97,12 @@ nextflow_process { } process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) ] - input[2] = false + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + input[1] = false """ } } @@ -104,7 +110,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -118,10 +124,12 @@ nextflow_process { } process { """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) ] - input[1] = [[],[]] - input[2] = false + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = false """ } } @@ -129,7 +137,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -142,12 +150,12 @@ nextflow_process { } process { """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ]) - input[1] = [[],[]] - input[2] = true + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = true """ } } @@ -155,7 +163,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -168,12 +176,12 @@ nextflow_process { } process { """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) - ]) - input[1] = [[],[]] - input[2] = true + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true), + [] + ] + input[1] = true """ } } @@ -181,7 +189,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -196,12 +204,12 @@ nextflow_process { } process { """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ]) - input[1] = [[],[]] - input[2] = true + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + [] + ] + input[1] = true """ } } @@ -209,7 +217,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } @@ -224,12 +232,12 @@ nextflow_process { } process { """ - input[0] = Channel.of([ - [ id:'test' ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) - ]) - input[1] = [[],[]] - input[2] = true + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true), + [] + ] + input[1] = true """ } } @@ -237,7 +245,7 @@ nextflow_process { then { assert process.success assertAll( - { assert snapshot(process.out).match()} + { assert snapshot(sanitizeOutput(process.out)).match()} ) } } diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap index 565d20e7..41697444 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -2,39 +2,13 @@ "test_samtools_faidx": { "content": [ { - "0": [ - - ], - "1": [ - - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" - ] - ], - "3": [ - - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ ], "fai": [ [ { - "id": "test", - "single_end": false + "id": "test" }, "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" ] @@ -56,47 +30,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T14:02:40.159309157" + "timestamp": "2026-02-10T15:39:12.541649151" }, "test_samtools_faidx_get_sizes_bgzip - stub": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test" - }, - "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test" - }, - "genome.fasta.gz.fai:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "test" - }, - "genome.fasta.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ ], @@ -135,42 +75,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T14:03:39.550619177" + "timestamp": "2026-02-10T15:41:44.040426987" }, "test_samtools_faidx_get_sizes": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test" - }, - "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" - ] - ], - "2": [ - [ - { - "id": "test" - }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" - ] - ], - "3": [ - - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ ], @@ -204,52 +115,20 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T14:03:16.844965756" + "timestamp": "2026-02-10T15:47:03.653912015" }, "test_samtools_faidx_bgzip": { "content": [ { - "0": [ - - ], - "1": [ - - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" - ] - ], - "3": [ - [ - { - "id": "test", - "single_end": false - }, - "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" - ] - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ ], "fai": [ [ { - "id": "test", - "single_end": false + "id": "test" }, "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" ] @@ -257,8 +136,7 @@ "gzi": [ [ { - "id": "test", - "single_end": false + "id": "test" }, "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" ] @@ -277,43 +155,17 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T14:02:47.301476131" + "timestamp": "2026-02-10T15:50:04.023566795" }, "test_samtools_faidx_fasta": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ [ { - "id": "test", - "single_end": false + "id": "test" }, "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" ] @@ -338,42 +190,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T09:44:40.559583279" + "timestamp": "2026-02-10T15:39:23.529404162" }, "test_samtools_faidx_get_sizes - stub": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test" - }, - "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test" - }, - "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ ], @@ -407,43 +230,17 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T14:03:31.989929281" + "timestamp": "2026-02-10T15:41:39.039834304" }, "test_samtools_faidx_stub_fasta": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ [ { - "id": "test", - "single_end": false + "id": "test" }, "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" ] @@ -468,46 +265,20 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T09:44:48.295693103" + "timestamp": "2026-02-10T15:39:28.961701609" }, "test_samtools_faidx_stub_fai": { "content": [ { - "0": [ - - ], - "1": [ - - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ ], "fai": [ [ { - "id": "test", - "single_end": false + "id": "test" }, "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" ] @@ -529,47 +300,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T14:03:09.784289542" + "timestamp": "2026-02-10T15:39:34.471028474" }, "test_samtools_faidx_get_sizes_bgzip": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test" - }, - "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" - ] - ], - "2": [ - [ - { - "id": "test" - }, - "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" - ] - ], - "3": [ - [ - { - "id": "test" - }, - "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" - ] - ], - "4": [ - [ - "SAMTOOLS_FAIDX", - "samtools", - "1.22.1" - ] - ], "fa": [ ], @@ -608,8 +345,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2025-12-23T14:03:24.814967939" + "timestamp": "2026-02-10T15:39:45.439016495" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf index f148f56b..0cfb7e87 100644 --- a/modules/nf-core/samtools/flagstat/main.nf +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -12,7 +12,7 @@ process SAMTOOLS_FLAGSTAT { output: tuple val(meta), path("*.flagstat"), emit: flagstat - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -25,11 +25,6 @@ process SAMTOOLS_FLAGSTAT { --threads ${task.cpus} \\ $bam \\ > ${prefix}.flagstat - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -48,10 +43,5 @@ process SAMTOOLS_FLAGSTAT { 850000 + 0 with mate mapped to a different chr 50000 + 0 with mate mapped to a different chr (mapQ>=5) END_FLAGSTAT - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/flagstat/meta.yml b/modules/nf-core/samtools/flagstat/meta.yml index ebbc15f2..8caa1bcc 100644 --- a/modules/nf-core/samtools/flagstat/meta.yml +++ b/modules/nf-core/samtools/flagstat/meta.yml @@ -1,6 +1,6 @@ name: samtools_flagstat -description: Counts the number of alignments in a BAM/CRAM/SAM file for each FLAG - type +description: Counts the number of alignments in a BAM/CRAM/SAM file for each + FLAG type keywords: - stats - mapping @@ -17,7 +17,8 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:samtools input: - - meta: @@ -47,13 +48,27 @@ output: description: File containing samtools flagstat output pattern: "*.{flagstat}" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" maintainers: diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap index 0a0a9b15..f5c882da 100644 --- a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -12,7 +12,11 @@ ] ], "1": [ - "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" + [ + "SAMTOOLS_FLAGSTAT", + "samtools", + "1.22.1" + ] ], "flagstat": [ [ @@ -23,16 +27,20 @@ "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], - "versions": [ - "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" + "versions_samtools": [ + [ + "SAMTOOLS_FLAGSTAT", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-09-15T15:02:00.813612" + "timestamp": "2026-02-03T11:14:30.820969684" }, "BAM": { "content": [ @@ -47,7 +55,11 @@ ] ], "1": [ - "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" + [ + "SAMTOOLS_FLAGSTAT", + "samtools", + "1.22.1" + ] ], "flagstat": [ [ @@ -58,15 +70,19 @@ "test.flagstat:md5,4f7ffd1e6a5e85524d443209ac97d783" ] ], - "versions": [ - "versions.yml:md5,bdc0bfb2b0542580e7cd65e80d8570bc" + "versions_samtools": [ + [ + "SAMTOOLS_FLAGSTAT", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-09-15T15:01:55.232954" + "timestamp": "2026-02-03T11:14:25.581619424" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/idxstats/main.nf b/modules/nf-core/samtools/idxstats/main.nf index 9181a1a5..d5b70a7f 100644 --- a/modules/nf-core/samtools/idxstats/main.nf +++ b/modules/nf-core/samtools/idxstats/main.nf @@ -12,7 +12,7 @@ process SAMTOOLS_IDXSTATS { output: tuple val(meta), path("*.idxstats"), emit: idxstats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process SAMTOOLS_IDXSTATS { --threads ${task.cpus-1} \\ $bam \\ > ${prefix}.idxstats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -39,10 +34,5 @@ process SAMTOOLS_IDXSTATS { """ touch ${prefix}.idxstats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/idxstats/meta.yml b/modules/nf-core/samtools/idxstats/meta.yml index 96d42746..fd153841 100644 --- a/modules/nf-core/samtools/idxstats/meta.yml +++ b/modules/nf-core/samtools/idxstats/meta.yml @@ -17,7 +17,8 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:samtools input: - - meta: @@ -47,13 +48,27 @@ output: description: File containing samtools idxstats output pattern: "*.{idxstats}" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" maintainers: diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test b/modules/nf-core/samtools/idxstats/tests/main.nf.test index 5fd1fc78..c990cd55 100644 --- a/modules/nf-core/samtools/idxstats/tests/main.nf.test +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test @@ -25,7 +25,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.idxstats, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } ) } } @@ -47,7 +50,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.idxstats, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } ) } }} diff --git a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap index d3e785e0..19a54c7c 100644 --- a/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/idxstats/tests/main.nf.test.snap @@ -1,72 +1,56 @@ { "bam - stub": { "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - "versions.yml:md5,6da44e5235401559cea62052bdc0197b" - ], - "idxstats": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_IDXSTATS", + "samtools", + "1.22.1" ] - ], - "versions": [ - "versions.yml:md5,6da44e5235401559cea62052bdc0197b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-09-10T13:47:35.796569" + "timestamp": "2026-02-02T16:21:46.333090477" }, "bam": { "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + ] + ], { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" - ] - ], - "1": [ - "versions.yml:md5,6da44e5235401559cea62052bdc0197b" - ], - "idxstats": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.idxstats:md5,df60a8c8d6621100d05178c93fb053a2" + "SAMTOOLS_IDXSTATS", + "samtools", + "1.22.1" ] - ], - "versions": [ - "versions.yml:md5,6da44e5235401559cea62052bdc0197b" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-09-10T13:47:31.86415" + "timestamp": "2026-02-02T16:21:41.063422521" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index a77ad821..e2a0e56d 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -14,7 +14,7 @@ process SAMTOOLS_INDEX { tuple val(meta), path("*.bai") , optional:true, emit: bai tuple val(meta), path("*.csi") , optional:true, emit: csi tuple val(meta), path("*.crai"), optional:true, emit: crai - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -27,11 +27,6 @@ process SAMTOOLS_INDEX { -@ ${task.cpus} \\ $args \\ $input - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -40,10 +35,5 @@ process SAMTOOLS_INDEX { "crai" : args.contains("-c") ? "csi" : "bai" """ touch ${input}.${extension} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml index 1bed6bca..c6d4ce25 100644 --- a/modules/nf-core/samtools/index/meta.yml +++ b/modules/nf-core/samtools/index/meta.yml @@ -14,7 +14,8 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:samtools input: - - meta: @@ -60,13 +61,27 @@ output: description: BAM/CRAM/SAM index file pattern: "*.{bai,crai,sai}" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - samtools version | sed '1!d;s/.* //': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/index/tests/main.nf.test b/modules/nf-core/samtools/index/tests/main.nf.test index ca34fb5c..c96cec86 100644 --- a/modules/nf-core/samtools/index/tests/main.nf.test +++ b/modules/nf-core/samtools/index/tests/main.nf.test @@ -23,7 +23,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.bai, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } ) } } @@ -43,7 +46,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.crai, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } ) } } @@ -67,7 +73,7 @@ nextflow_process { { assert process.success }, { assert snapshot( file(process.out.csi[0][1]).name, - process.out.versions + process.out.findAll { key, val -> key.startsWith('versions') } ).match() } ) } @@ -89,7 +95,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.bai, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } ) } } @@ -110,7 +119,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.crai, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } ) } } @@ -133,7 +145,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot( + process.out.csi, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } ) } } diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap index 3836c6bf..afc8a1ff 100644 --- a/modules/nf-core/samtools/index/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -1,250 +1,156 @@ { "csi - stub": { "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], { - "0": [ - - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" - ], - "bai": [ - - ], - "crai": [ - - ], - "csi": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.sorted.bam.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_INDEX", + "samtools", + "1.22.1" ] - ], - "versions": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T14:13:38.25787" + "timestamp": "2026-01-28T17:52:10.030187" }, "crai - stub": { "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], { - "0": [ - - ], - "1": [ - - ], - "2": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_INDEX", + "samtools", + "1.22.1" ] - ], - "3": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" - ], - "bai": [ - - ], - "crai": [ - [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.recalibrated.sorted.cram.crai:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T14:13:34.496412" + "timestamp": "2026-01-28T17:51:59.125484" }, "bai - stub": { "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], { - "0": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_INDEX", + "samtools", + "1.22.1" ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" - ], - "bai": [ - [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.sorted.bam.bai:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "crai": [ - - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T14:13:25.934431" + "timestamp": "2026-01-28T17:51:47.277042" }, "csi": { "content": [ "test.paired_end.sorted.bam.csi", - [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_INDEX", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T14:13:22.262088" + "timestamp": "2026-01-28T17:51:35.758735" }, "crai": { "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ], { - "0": [ - - ], - "1": [ - - ], - "2": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + "SAMTOOLS_INDEX", + "samtools", + "1.22.1" ] - ], - "3": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" - ], - "bai": [ - - ], - "crai": [ - [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" - ] - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T14:13:18.191664" + "timestamp": "2026-01-28T17:51:26.561965" }, "bai": { "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ], { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" - ], - "bai": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + "SAMTOOLS_INDEX", + "samtools", + "1.22.1" ] - ], - "crai": [ - - ], - "csi": [ - - ], - "versions": [ - "versions.yml:md5,b8717818c91b07de87c2a5590bad02e6" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T14:13:08.51539" + "timestamp": "2026-01-28T17:51:15.299035" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index a1a05510..40dbf661 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -19,11 +19,13 @@ process SAMTOOLS_STATS { task.ext.when == null || task.ext.when script: - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" """ samtools \\ stats \\ + ${args} \\ --threads ${task.cpus} \\ ${reference} \\ ${input} \\ diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 75770c34..628b5034 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -8,25 +8,25 @@ process SEVERUS { 'biocontainers/severus:1.6--pyhdfd78af_0' }" input: - tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) + tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf), path(tbi) tuple val(meta2), path(bed), path(pon_path) output: - tuple val(meta), path("${prefix}/severus.log") , emit: log - tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual - tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double - tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true - tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true - tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true - tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("all_SVs/severus_all.vcf") , emit: all_vcf , optional: true + tuple val(meta), path("all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true + tuple val(meta), path("somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions when: @@ -50,12 +50,7 @@ process SEVERUS { $pon \\ $control \\ $phasing_vcf \\ - --out-dir ${prefix} - - bgzip ${prefix}/somatic_SVs/severus_somatic.vcf - tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz - bgzip ${prefix}/all_SVs/severus_all.vcf - tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz + --out-dir . cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -64,7 +59,6 @@ process SEVERUS { """ stub: - def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" """ diff --git a/modules/nf-core/severus/severus.diff b/modules/nf-core/severus/severus.diff index d5e967c7..455c26e3 100644 --- a/modules/nf-core/severus/severus.diff +++ b/modules/nf-core/severus/severus.diff @@ -3,14 +3,8 @@ Changes in component 'nf-core/severus' Changes in 'severus/main.nf': --- modules/nf-core/severus/main.nf +++ modules/nf-core/severus/main.nf -@@ -4,30 +4,32 @@ - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? -- 'https://depot.galaxyproject.org/singularity/severus:1.3--pyhdfd78af_0': -- 'biocontainers/severus:1.3--pyhdfd78af_0' }" -+ 'https://depot.galaxyproject.org/singularity/severus:1.6--pyhdfd78af_0': -+ 'biocontainers/severus:1.6--pyhdfd78af_0' }" +@@ -8,25 +8,25 @@ + 'biocontainers/severus:1.6--pyhdfd78af_0' }" input: - tuple val(meta), path(target_input), path(target_index), path(control_input), path(control_index), path(vcf) @@ -30,11 +24,10 @@ Changes in 'severus/main.nf': - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true -- tuple val(meta), path("${prefix}/somatic_SVs/severus_all.vcf") , emit: somatic_vcf , optional: true +- tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true -- path "versions.yml" , emit: versions + tuple val(meta), path("severus.log") , emit: log + tuple val(meta), path("read_qual.txt") , emit: read_qual + tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double @@ -42,25 +35,23 @@ Changes in 'severus/main.nf': + tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true -+ tuple val(meta), path("all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true -+ tuple val(meta), path("all_SVs/severus_all.vcf.gz.tbi") , emit: all_tbi , optional: true -+ tuple val(meta), path("all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true -+ tuple val(meta), path("all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true ++ tuple val(meta), path("all_SVs/severus_all.vcf") , emit: all_vcf , optional: true ++ tuple val(meta), path("all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true ++ tuple val(meta), path("all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true -+ tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf //, optional: true -+ tuple val(meta), path("somatic_SVs/severus_somatic.vcf.gz.tbi") , emit: somatic_tbi , optional: true -+ tuple val(meta), path("somatic_SVs/breakpoint_clusters_list.tsv") , emit: somatic_breakpoints_clusters_list, optional: true -+ tuple val(meta), path("somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true ++ tuple val(meta), path("somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true ++ tuple val(meta), path("somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true ++ tuple val(meta), path("somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true -+ path "versions.yml" , emit: versions + path "versions.yml" , emit: versions when: - task.ext.when == null || task.ext.when -@@ -39,15 +41,23 @@ +@@ -39,15 +39,18 @@ def control = control_input ? "--control-bam ${control_input}" : "" def vntr_bed = bed ? "--vntr-bed ${bed}" : "" def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" + def pon = pon_path && (!control_input) ? "--PON ${pon_path}" : "" ++ """ severus \\ $args \\ @@ -72,66 +63,11 @@ Changes in 'severus/main.nf': $phasing_vcf \\ - --out-dir ${prefix} + --out-dir . -+ -+ bgzip somatic_SVs/severus_somatic.vcf -+ tabix -p vcf somatic_SVs/severus_somatic.vcf.gz -+ bgzip all_SVs/severus_all.vcf -+ tabix -p vcf all_SVs/severus_all.vcf.gz -+ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -@@ -60,26 +70,28 @@ - prefix = task.ext.prefix ?: "${meta.id}" - - """ -- mkdir -p ${prefix}/all_SVs/plots -- mkdir -p ${prefix}/somatic_SVs/plots -+ mkdir -p all_SVs/plots -+ mkdir -p somatic_SVs/plots - -- touch ${prefix}/severus_collaped_dup.bed -- touch ${prefix}/severus.log -- touch ${prefix}/severus_LOH.bed -- touch ${prefix}/read_alignments -- touch ${prefix}/read_ids.csv -- touch ${prefix}/read_qual.txt -- touch ${prefix}/breakpoints_double.csv -- touch ${prefix}/all_SVs/severus_all.vcf -- touch ${prefix}/all_SVs/breakpoints_clusters_list.tsv -- touch ${prefix}/all_SVs/breakpoints_clusters.tsv -- touch ${prefix}/all_SVs/plots/severus_0.html -- touch ${prefix}/all_SVs/plots/severus_1.html -- touch ${prefix}/somatic_SVs/severus_somatic.vcf -- touch ${prefix}/somatic_SVs/breakpoints_clusters_list.tsv -- touch ${prefix}/somatic_SVs/breakpoints_clusters.tsv -- touch ${prefix}/somatic_SVs/plots/severus_0.html -- touch ${prefix}/somatic_SVs/plots/severus_1.html -+ touch severus_collaped_dup.bed -+ touch severus.log -+ touch severus_LOH.bed -+ touch read_alignments -+ touch read_ids.csv -+ touch read_qual.txt -+ touch breakpoints_double.csv -+ touch all_SVs/severus_all.vcf.gz -+ touch all_SVs/severus_all.vcf.gz.tbi -+ touch all_SVs/breakpoints_clusters_list.tsv -+ touch all_SVs/breakpoints_clusters.tsv -+ touch all_SVs/plots/severus_0.html -+ touch all_SVs/plots/severus_1.html -+ touch somatic_SVs/severus_somatic.vcf.gz -+ touch somatic_SVs/severus_somatic.vcf.gz.tbi -+ touch somatic_SVs/breakpoints_clusters_list.tsv -+ touch somatic_SVs/breakpoints_clusters.tsv -+ touch somatic_SVs/plots/severus_0.html -+ touch somatic_SVs/plots/severus_1.html cat <<-END_VERSIONS > versions.yml "${task.process}": 'modules/nf-core/severus/environment.yml' is unchanged -'modules/nf-core/severus/tests/tags.yml' is unchanged 'modules/nf-core/severus/tests/main.nf.test' is unchanged 'modules/nf-core/severus/tests/main.nf.test.snap' is unchanged 'modules/nf-core/severus/tests/nextflow.config' is unchanged diff --git a/modules/nf-core/severus/tests/main.nf.test.snap b/modules/nf-core/severus/tests/main.nf.test.snap index 16d4466b..a6b09ed1 100644 --- a/modules/nf-core/severus/tests/main.nf.test.snap +++ b/modules/nf-core/severus/tests/main.nf.test.snap @@ -67,7 +67,7 @@ { "id": "test" }, - "severus_somatic.vcf:md5,ce1bbdc8006bf77cf0241341b8031034" + "severus_somatic.vcf:md5,d977e35947a1294be9795880c5d7ef14" ] ], [ @@ -81,10 +81,10 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-10-23T10:30:20.686848066" + "timestamp": "2026-01-26T13:03:25.015885535" }, "homo_sapiens - [ bam, bai, [], [], [] ], [[],[]] - stub": { "content": [ @@ -387,7 +387,7 @@ { "id": "test" }, - "severus_somatic.vcf:md5,10d304342aa0adc19bc85b67645c9820" + "severus_somatic.vcf:md5,7d69ee117bd032a31166cf2cf7a3ff8c" ] ], [ @@ -401,10 +401,10 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-10-23T10:30:16.766604348" + "timestamp": "2026-01-26T13:03:18.532828432" }, "homo_sapiens - [ bam, bai, bam, bai, vcf ], [ bed ]": { "content": [ @@ -438,7 +438,7 @@ { "id": "test" }, - "severus_somatic.vcf:md5,d759aea3770c7d074d34c3c469f8ff14" + "severus_somatic.vcf:md5,e8f4f5d77f5a17692ce82cde5cd7c833" ] ], [ @@ -452,9 +452,9 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-10-23T10:30:24.866674264" + "timestamp": "2026-01-26T13:03:31.514266729" } } \ No newline at end of file diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf index e712ebe6..b9c324da 100644 --- a/modules/nf-core/untar/main.nf +++ b/modules/nf-core/untar/main.nf @@ -12,7 +12,7 @@ process UNTAR { output: tuple val(meta), path("${prefix}"), emit: untar - path "versions.yml", emit: versions + tuple val("${task.process}"), val('untar'), eval('tar --version 2>&1 | head -1 | sed "s/tar (GNU tar) //; s/ Copyright.*//"'), emit: versions_untar, topic: versions when: task.ext.when == null || task.ext.when @@ -43,10 +43,6 @@ process UNTAR { ${args2} fi - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: @@ -75,10 +71,5 @@ process UNTAR { fi done fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/untar/meta.yml b/modules/nf-core/untar/meta.yml index 1603e382..571d8078 100644 --- a/modules/nf-core/untar/meta.yml +++ b/modules/nf-core/untar/meta.yml @@ -38,13 +38,29 @@ output: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] pattern: "*/" + versions_untar: + - - ${task.process}: + type: string + description: The name of the process + - untar: + type: string + description: The name of the tool + - tar --version 2>&1 | head -1 | sed "s/tar (GNU tar) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - untar: + type: string + description: The name of the tool + - tar --version 2>&1 | head -1 | sed "s/tar (GNU tar) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/untar/tests/main.nf.test b/modules/nf-core/untar/tests/main.nf.test index c957517a..fde8db16 100644 --- a/modules/nf-core/untar/tests/main.nf.test +++ b/modules/nf-core/untar/tests/main.nf.test @@ -20,7 +20,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, ) } } @@ -38,7 +41,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, ) } } @@ -58,7 +64,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, ) } } @@ -78,7 +87,10 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() }, + { assert snapshot( + process.out.untar, + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() }, ) } } diff --git a/modules/nf-core/untar/tests/main.nf.test.snap b/modules/nf-core/untar/tests/main.nf.test.snap index ceb91b79..51a414dd 100644 --- a/modules/nf-core/untar/tests/main.nf.test.snap +++ b/modules/nf-core/untar/tests/main.nf.test.snap @@ -1,158 +1,118 @@ { "test_untar_onlyfiles": { "content": [ - { - "0": [ + [ + [ + [ + + ], [ - [ - - ], - [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" - ] + "hello.txt:md5,e59ff97941044f85df5297e1c302d260" ] - ], - "1": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" - ], - "untar": [ + ] + ], + { + "versions_untar": [ [ - [ - - ], - [ - "hello.txt:md5,e59ff97941044f85df5297e1c302d260" - ] + "UNTAR", + "untar", + "1.34" ] - ], - "versions": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.3" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-07-10T12:04:28.231047" + "timestamp": "2026-01-28T17:49:32.000491" }, "test_untar_onlyfiles - stub": { "content": [ - { - "0": [ + [ + [ + [ + + ], [ - [ - - ], - [ - "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - "1": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" - ], - "untar": [ + ] + ], + { + "versions_untar": [ [ - [ - - ], - [ - "hello.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "UNTAR", + "untar", + "1.34" ] - ], - "versions": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.3" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-07-10T12:04:45.773103" + "timestamp": "2026-01-28T17:49:58.812479" }, "test_untar - stub": { "content": [ - { - "0": [ + [ + [ + [ + + ], [ - [ - - ], - [ - "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", - "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", - "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", + "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - "1": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" - ], - "untar": [ + ] + ], + { + "versions_untar": [ [ - [ - - ], - [ - "hash.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", - "opts.k2d:md5,d41d8cd98f00b204e9800998ecf8427e", - "taxo.k2d:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "UNTAR", + "untar", + "1.34" ] - ], - "versions": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.3" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-07-10T12:04:36.777441" + "timestamp": "2026-01-28T17:49:48.119456" }, "test_untar": { "content": [ - { - "0": [ + [ + [ + [ + + ], [ - [ - - ], - [ - "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", - "opts.k2d:md5,a033d00cf6759407010b21700938f543", - "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" - ] + "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", + "opts.k2d:md5,a033d00cf6759407010b21700938f543", + "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" ] - ], - "1": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" - ], - "untar": [ + ] + ], + { + "versions_untar": [ [ - [ - - ], - [ - "hash.k2d:md5,8b8598468f54a7087c203ad0190555d9", - "opts.k2d:md5,a033d00cf6759407010b21700938f543", - "taxo.k2d:md5,094d5891cdccf2f1468088855c214b2c" - ] + "UNTAR", + "untar", + "1.34" ] - ], - "versions": [ - "versions.yml:md5,6063247258c56fd271d076bb04dd7536" ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.3" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-07-10T12:04:19.377674" + "timestamp": "2026-01-28T17:49:17.252494" } } \ No newline at end of file diff --git a/modules/nf-core/unzip/main.nf b/modules/nf-core/unzip/main.nf index a0c02109..b977ff6d 100644 --- a/modules/nf-core/unzip/main.nf +++ b/modules/nf-core/unzip/main.nf @@ -35,7 +35,6 @@ process UNZIP { """ stub: - def args = task.ext.args ?: '' if ( archive instanceof List && archive.name.size > 1 ) { error "[UNZIP] error: 7za only accepts a single archive as input. Please check module input." } prefix = task.ext.prefix ?: ( meta.id ? "${meta.id}" : archive.baseName) """ diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 6bd11959..bf1e3377 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -69,8 +69,6 @@ workflow PREPARE_REFERENCE_FILES { WGET.out.outfile ) - ch_versions = ch_versions.mix(UNTAR.out.versions) - UNTAR.out.untar.set { downloaded_clair3_models } // @@ -94,28 +92,28 @@ workflow PREPARE_REFERENCE_FILES { if (!ascat_alleles) allele_files = channel.empty() else if (ascat_alleles.endsWith(".zip")) { UNZIP_ALLELES(channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) } else allele_files = channel.fromPath(ascat_alleles).collect() if (!ascat_loci) loci_files = channel.empty() else if (ascat_loci.endsWith(".zip")) { UNZIP_LOCI(channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) } else loci_files = channel.fromPath(ascat_loci).collect() if (!ascat_loci_gc) gc_file = channel.value([]) else if ( ascat_loci_gc.endsWith(".zip") ) { UNZIP_GC(channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_GC.out.versions) } else gc_file = channel.fromPath(ascat_loci_gc).collect() if (!ascat_loci_rt) rt_file = channel.value([]) else if (ascat_loci_rt.endsWith(".zip")) { UNZIP_RT(channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) - rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it[1].listFiles() }.collect() + rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() ch_versions = ch_versions.mix(UNZIP_RT.out.versions) } else rt_file = channel.fromPath(ascat_loci_rt).collect() } diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index 90fcbf80..34e8fe10 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -12,20 +12,14 @@ workflow BAM_STATS_SAMTOOLS { ch_fasta // channel: [ val(meta), path(fasta) ] main: - ch_versions = Channel.empty() - SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) - ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) SAMTOOLS_IDXSTATS ( ch_bam_bai ) - ch_versions = ch_versions.mix(SAMTOOLS_IDXSTATS.out.versions) emit: stats = SAMTOOLS_STATS.out.stats // channel: [ val(meta), path(stats) ] flagstat = SAMTOOLS_FLAGSTAT.out.flagstat // channel: [ val(meta), path(flagstat) ] idxstats = SAMTOOLS_IDXSTATS.out.idxstats // channel: [ val(meta), path(idxstats) ] - - versions = ch_versions // channel: [ path(versions.yml) ] } diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test index 76e7a40a..2f329695 100644 --- a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test @@ -36,8 +36,7 @@ nextflow_workflow { { assert snapshot( workflow.out.flagstat, workflow.out.idxstats, - workflow.out.stats, - workflow.out.versions).match() } + workflow.out.stats).match() } ) } } @@ -66,8 +65,7 @@ nextflow_workflow { { assert snapshot( workflow.out.flagstat, workflow.out.idxstats, - workflow.out.stats, - workflow.out.versions).match() } + workflow.out.stats).match() } ) } } @@ -96,8 +94,7 @@ nextflow_workflow { { assert snapshot( workflow.out.flagstat, workflow.out.idxstats, - workflow.out.stats, - workflow.out.versions).match() } + workflow.out.stats).match() } ) } } diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap index 3c543191..9c8ff1b5 100644 --- a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -29,10 +29,6 @@ "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "3": [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" - ], "flagstat": [ [ { @@ -59,18 +55,14 @@ }, "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - "versions": [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.3" }, - "timestamp": "2025-11-01T02:39:28.707989" + "timestamp": "2026-02-03T11:10:30.076183827" }, "test_bam_stats_samtools_single_end - stub": { "content": [ @@ -102,10 +94,6 @@ "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "3": [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" - ], "flagstat": [ [ { @@ -132,18 +120,14 @@ }, "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - "versions": [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.3" }, - "timestamp": "2025-11-01T02:39:20.473816" + "timestamp": "2026-02-03T11:10:24.379362883" }, "test_bam_stats_samtools_paired_end_cram - stub": { "content": [ @@ -175,10 +159,6 @@ "test.idxstats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "3": [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" - ], "flagstat": [ [ { @@ -205,18 +185,14 @@ }, "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - "versions": [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.3" }, - "timestamp": "2025-11-01T02:39:37.697552" + "timestamp": "2026-02-03T11:10:35.91658956" }, "test_bam_stats_samtools_single_end": { "content": [ @@ -246,17 +222,13 @@ }, "test.stats:md5,7a05a22bdb17e8df6e8c2d100ff09a31" ] - ], - [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.3" }, - "timestamp": "2025-11-01T02:38:50.143087" + "timestamp": "2026-02-03T11:32:20.243663217" }, "test_bam_stats_samtools_paired_end": { "content": [ @@ -286,17 +258,13 @@ }, "test.stats:md5,a391612b5ef5b181e854ccaad8c8a068" ] - ], - [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.3" }, - "timestamp": "2025-11-01T02:39:01.02311" + "timestamp": "2026-02-03T11:32:26.434187887" }, "test_bam_stats_samtools_paired_end_cram": { "content": [ @@ -326,16 +294,12 @@ }, "test.stats:md5,2b0e31ab01b867a6ff312023ae03838d" ] - ], - [ - "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.0" + "nextflow": "25.10.3" }, - "timestamp": "2025-11-01T02:39:12.503355" + "timestamp": "2026-02-03T11:32:32.441454186" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index a7eb1861..258e8463 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -646,12 +646,12 @@ workflow LRSOMATIC { ) // Collect MultiQC files - ch_multiqc_files = ch_multiqc_files.mix(ch_bam_stats.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_bam_flagstat.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_bam_idxstats.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_stats.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_flagstat.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_bam_idxstats.collect{it -> it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it -> it[1]}.ifEmpty([])) MULTIQC ( From ae09ca57d708a348d24822d6e81d2c7d220a03b5 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 15:30:51 +0100 Subject: [PATCH 082/183] manual version bump as instructed --- .nf-core.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.nf-core.yml b/.nf-core.yml index f15c6cf9..07124956 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -27,7 +27,7 @@ lint: - validation.summary.beforeText - validation.summary.afterText schema_params: false -nf_core_version: 3.5.1 +nf_core_version: 3.5.2 repository_type: pipeline template: author: Jonas Demeulemeester From 9e513a9720617dc17cdd091b2657faa0b9aa66bc Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 15:32:07 +0100 Subject: [PATCH 083/183] mostly channel structure changes to adhere to new module input requirements and removing versioning where it is done with topic channels --- subworkflows/local/prepare_annotation.nf | 17 +++++----- subworkflows/local/prepare_reference_files.nf | 4 +-- subworkflows/local/tumor_normal_happhase.nf | 25 +++++++-------- subworkflows/local/tumor_only_happhase.nf | 7 ++-- workflows/lrsomatic.nf | 32 ++++++------------- 5 files changed, 33 insertions(+), 52 deletions(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index b5503a5d..4d8dca26 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -15,9 +15,17 @@ workflow PREPARE_ANNOTATION { ch_versions = channel.empty() ensemblvep_cache = channel.empty() + // + // MODULE: ENSEMBLVEP_DOWNLOAD + // + if (download_vep_cache) { vep_download_info = channel.of([[],vep_genome, vep_species, vep_cache_version]) - ENSEMBLVEP_DOWNLOAD(vep_download_info) + + ENSEMBLVEP_DOWNLOAD ( + vep_download_info + ) + ensemblvep_cache = ENSEMBLVEP_DOWNLOAD.out.cache ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) @@ -38,13 +46,6 @@ workflow PREPARE_ANNOTATION { ensemblvep_cache = channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() } - - - // - // MODULE: ENSEMBLVEP_DOWNLOAD - // - - emit: vep_cache = ensemblvep_cache versions = ch_versions diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index bf1e3377..17f8079d 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -74,10 +74,8 @@ workflow PREPARE_REFERENCE_FILES { // // MODULE: Index the fasta // - SAMTOOLS_FAIDX ( - ch_prepared_fasta, - [ [:], [] ], + ch_prepared_fasta.map { meta, fasta -> [meta, fasta, []] }, false ) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 81d08f91..84fba84c 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -220,7 +220,6 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_hapbams ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) // Add index to channel mixed_bams_vcf .join(mixed_hapbams) @@ -254,17 +253,19 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] } .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE.out.snv_vcf_index) .set{tumor_normal_severus} - // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] - // tumor_bam: haplotagged aligned bam for tumor - // tumor_bai: indexes for tumor bam files - // normal_bam: haplotagged aligned bam files for normal - // normal_bai: indexes for normal bam files - // phased_vcf: phased small variant vcf for normal + // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] + // tumor_bam: haplotagged aligned bam for tumor + // tumor_bai: indexes for tumor bam files + // normal_bam: haplotagged aligned bam files for normal + // normal_bai: indexes for normal bam files + // phased_vcf: phased small variant vcf for normal + // phased_vcf_index: phased small variant vcf index for normal // Get ClairS input channel tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] } .set { clairs_input } @@ -286,22 +287,18 @@ workflow TUMOR_NORMAL_HAPPHASE { // MODULE: BCFTOOLS_CONCAT // - BCFTOOLS_CONCAT( + BCFTOOLS_CONCAT ( clairs_out ) - ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) - // // MODULE: BCFTOOLS_SORT // - BCFTOOLS_SORT( + BCFTOOLS_SORT ( BCFTOOLS_CONCAT.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_SORT.out.versions) - BCFTOOLS_SORT.out.vcf .map { meta, vcf -> def extra = [] diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 16b8ce90..f96676b8 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -155,13 +155,12 @@ workflow TUMOR_ONLY_HAPPHASE { haplotagged_bams ) - ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions) - // join information and the phased VCF file haplotagged_bams .join(SAMTOOLS_INDEX.out.bai) .join(LONGPHASE_PHASE.out.snv_vcf) - .map{ meta, hap_bam, hap_bai, vcf -> + .join(LONGPHASE_PHASE.out.snv_vcf_index) + .map{ meta, hap_bam, hap_bai, vcf, tbi -> def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, @@ -171,7 +170,7 @@ workflow TUMOR_ONLY_HAPPHASE { clairS_model: meta.clairS_model, clairSTO_model: meta.clairSTO_model, kinetics: meta.kinetics] - return [new_meta, hap_bam, hap_bai, [], [], vcf] + return [new_meta, hap_bam, hap_bai, [], [], vcf, tbi] } .set{ tumor_only_severus } diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 258e8463..0ef7eae1 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -173,8 +173,6 @@ workflow LRSOMATIC { // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated unaligned bams - ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) - // // MODULE: CRAMINO // @@ -206,7 +204,7 @@ workflow LRSOMATIC { params.download_vep_cache ) ch_versions = ch_versions.mix(PREPARE_ANNOTATION.out.versions) - vep_cache = PREPARE_ANNOTATION.out.vep_cache + vep_cache = PREPARE_ANNOTATION.out.vep_cache.map {cache -> [[:], cache] } } @@ -334,9 +332,6 @@ workflow LRSOMATIC { // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, fiber,basecall_model] // bam: list of concatenated aligned bams - ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) - - // ch_minimap_bams into tumor and paired to phase the paired ones on normal // and add index @@ -420,8 +415,6 @@ workflow LRSOMATIC { vep_custom_tbi ) - ch_versions = ch_versions.mix(GERMLINE_VEP.out.versions) - // // MODULE: SOMATIC_VEP // @@ -437,16 +430,16 @@ workflow LRSOMATIC { vep_custom, vep_custom_tbi ) - - ch_versions = ch_versions.mix(SOMATIC_VEP.out.versions) } - ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) // Get Severus input channel TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi] + } .set { severus_reformat } // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] @@ -480,8 +473,6 @@ workflow LRSOMATIC { vep_custom, vep_custom_tbi ) - - ch_versions = ch_versions.mix(SV_VEP.out.versions) } // @@ -515,8 +506,6 @@ workflow LRSOMATIC { ch_mosdepth_global = MOSDEPTH.out.global_txt ch_mosdepth_summary = MOSDEPTH.out.summary_txt - - ch_versions = ch_versions.mix(MOSDEPTH.out.versions) } // @@ -536,8 +525,6 @@ workflow LRSOMATIC { bam_stats_ch = BAM_STATS_SAMTOOLS.out.stats bam_flagstat_ch = BAM_STATS_SAMTOOLS.out.flagstat bam_idxstats_ch = BAM_STATS_SAMTOOLS.out.idxstats - - ch_versions = ch_versions.mix(BAM_STATS_SAMTOOLS.out.versions) } // @@ -655,12 +642,11 @@ workflow LRSOMATIC { MULTIQC ( - ch_multiqc_files.collect(), - ch_multiqc_config.toList(), - ch_multiqc_custom_config.toList(), - ch_multiqc_logo.toList(), - [], - [] + ch_multiqc_files + .collect() + .combine(ch_multiqc_config.mix(ch_multiqc_custom_config).toList()) + .combine(ch_multiqc_logo.toList()) + .map { files, config, logo -> [[id: 'multiqc'], files, config, logo, [], []] } ) emit: From cda4aa4a9b37bc1dbbbae554f418e82884a9f7b1 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 11 Mar 2026 15:41:54 +0100 Subject: [PATCH 084/183] add replicates, perform QC on individual replicates before merge --- assets/schema_input.json | 8 ++ conf/modules.config | 3 +- .../utils_nfcore_lrsomatic_pipeline/main.nf | 35 +++++- tests/default.nf.test.snap | 117 ++++++++++++++++-- workflows/lrsomatic.nf | 72 +++++++---- 5 files changed, 192 insertions(+), 43 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 89ccc0bb..d078dd00 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -50,6 +50,14 @@ }, "clairS_model": { "type": "string" + }, + "tumor_replicate": { + "type": "integer", + "default": 1 + }, + "normal_replicate": { + "type": "integer", + "default": 1 } }, "required": ["sample", "bam_tumor", "platform", "sex", "fiber"] diff --git a/conf/modules.config b/conf/modules.config index 5072b8d6..d0c742ff 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -41,11 +41,10 @@ process { ] } - withName: '.*:CRAMINO_PRE' { ext.args = '--ubam' publishDir = [ - path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_ubam" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_ubam_${meta.replicate}/" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index d7d151a1..fc7d8f1d 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -86,25 +86,56 @@ workflow PIPELINE_INITIALISATION { channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) - .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model -> + .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model, tumor_replicate, normal_replicate -> def real_clair3_model = (clair3_model == null ) ? null : clair3_model def real_clairS_model = (clairS_model == null ) ? null : clairS_model def real_clairSTO_model = (clairSTO_model == null ) ? null : clairSTO_model def paired_data = bam_normal ? true : false - def meta_info = meta + [ paired_data: paired_data, platform: method, sex: sex, fiber: fiber, clair3_model: real_clair3_model, clairS_model : real_clairS_model, clairSTO_model: real_clairSTO_model] + def meta_info = meta + [ paired_data: paired_data, + platform: method, + sex: sex, + fiber: fiber, + clair3_model: real_clair3_model, + clairS_model : real_clairS_model, + clairSTO_model: real_clairSTO_model, + tumor_replicate : tumor_replicate, + normal_replicate : normal_replicate] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } .map { meta, bam_tumor, bam_normal -> [ meta, bam_tumor.flatten(), bam_normal.flatten() ] } + .view() .flatMap { meta, tumor_bam, normal_bam -> def meta_tumor = meta.clone() meta_tumor.type = 'tumor' + meta_tumor.replicate = meta_tumor.tumor_replicate + meta_tumor = meta_tumor.subMap('id', + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'replicate') def result = [[meta_tumor, tumor_bam]] if (normal_bam) { def meta_normal = meta.clone() meta_normal.type = 'normal' + meta_normal.replicate = meta_normal.normal_replicate + meta_normal = meta_normal.subMap('id', + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'replicate') result << [meta_normal, normal_bam] } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 6a1cd3ce..2881d980 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -128,8 +128,8 @@ "sample1/qc/normal", "sample1/qc/normal/cramino_aln", "sample1/qc/normal/cramino_aln/sample1_cramino.txt", - "sample1/qc/normal/cramino_ubam", - "sample1/qc/normal/cramino_ubam/sample1_cramino.txt", + "sample1/qc/normal/cramino_ubam_1", + "sample1/qc/normal/cramino_ubam_1/sample1_cramino.txt", "sample1/qc/normal/mosdepth", "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", @@ -140,8 +140,8 @@ "sample1/qc/tumor", "sample1/qc/tumor/cramino_aln", "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", - "sample1/qc/tumor/cramino_ubam", - "sample1/qc/tumor/cramino_ubam/sample1_cramino.txt", + "sample1/qc/tumor/cramino_ubam_1", + "sample1/qc/tumor/cramino_ubam_1/sample1_cramino.txt", "sample1/qc/tumor/mosdepth", "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", @@ -190,8 +190,8 @@ "sample2/qc/normal", "sample2/qc/normal/cramino_aln", "sample2/qc/normal/cramino_aln/sample2_cramino.txt", - "sample2/qc/normal/cramino_ubam", - "sample2/qc/normal/cramino_ubam/sample2_cramino.txt", + "sample2/qc/normal/cramino_ubam_1", + "sample2/qc/normal/cramino_ubam_1/sample2_cramino.txt", "sample2/qc/normal/mosdepth", "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", @@ -202,8 +202,8 @@ "sample2/qc/tumor", "sample2/qc/tumor/cramino_aln", "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", - "sample2/qc/tumor/cramino_ubam", - "sample2/qc/tumor/cramino_ubam/sample2_cramino.txt", + "sample2/qc/tumor/cramino_ubam_1", + "sample2/qc/tumor/cramino_ubam_1/sample2_cramino.txt", "sample2/qc/tumor/mosdepth", "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", @@ -250,8 +250,8 @@ "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", - "sample3/qc/tumor/cramino_ubam", - "sample3/qc/tumor/cramino_ubam/sample3_cramino.txt", + "sample3/qc/tumor/cramino_ubam_1", + "sample3/qc/tumor/cramino_ubam_1/sample3_cramino.txt", "sample3/qc/tumor/mosdepth", "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", @@ -290,18 +290,86 @@ "sample3/vep/somatic", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html", + "sample4", + "sample4/bamfiles", + "sample4/bamfiles/sample4_normal.bam", + "sample4/bamfiles/sample4_normal.bam.bai", + "sample4/bamfiles/sample4_tumor.bam", + "sample4/bamfiles/sample4_tumor.bam.bai", + "sample4/qc", + "sample4/qc/normal", + "sample4/qc/normal/cramino_aln", + "sample4/qc/normal/cramino_aln/sample4_cramino.txt", + "sample4/qc/normal/cramino_ubam_1", + "sample4/qc/normal/cramino_ubam_1/sample4_cramino.txt", + "sample4/qc/normal/cramino_ubam_2", + "sample4/qc/normal/cramino_ubam_2/sample4_cramino.txt", + "sample4/qc/normal/mosdepth", + "sample4/qc/normal/mosdepth/sample4.mosdepth.global.dist.txt", + "sample4/qc/normal/mosdepth/sample4.mosdepth.summary.txt", + "sample4/qc/normal/samtools", + "sample4/qc/normal/samtools/sample4.flagstat", + "sample4/qc/normal/samtools/sample4.idxstats", + "sample4/qc/normal/samtools/sample4.stats", + "sample4/qc/tumor", + "sample4/qc/tumor/cramino_aln", + "sample4/qc/tumor/cramino_aln/sample4_cramino.txt", + "sample4/qc/tumor/cramino_ubam_1", + "sample4/qc/tumor/cramino_ubam_1/sample4_cramino.txt", + "sample4/qc/tumor/cramino_ubam_2", + "sample4/qc/tumor/cramino_ubam_2/sample4_cramino.txt", + "sample4/qc/tumor/mosdepth", + "sample4/qc/tumor/mosdepth/sample4.mosdepth.global.dist.txt", + "sample4/qc/tumor/mosdepth/sample4.mosdepth.summary.txt", + "sample4/qc/tumor/samtools", + "sample4/qc/tumor/samtools/sample4.flagstat", + "sample4/qc/tumor/samtools/sample4.idxstats", + "sample4/qc/tumor/samtools/sample4.stats", + "sample4/variants", + "sample4/variants/clair3", + "sample4/variants/clair3/merge_output.vcf.gz", + "sample4/variants/clair3/merge_output.vcf.gz.tbi", + "sample4/variants/clairs", + "sample4/variants/clairs/indel.vcf.gz", + "sample4/variants/clairs/indel.vcf.gz.tbi", + "sample4/variants/clairs/snvs.vcf.gz", + "sample4/variants/clairs/snvs.vcf.gz.tbi", + "sample4/variants/severus", + "sample4/variants/severus/all_SVs", + "sample4/variants/severus/all_SVs/severus_all.vcf.gz", + "sample4/variants/severus/breakpoints_double.csv", + "sample4/variants/severus/read_ids.csv", + "sample4/variants/severus/read_qual.txt", + "sample4/variants/severus/severus.log", + "sample4/variants/severus/somatic_SVs", + "sample4/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample4/vep", + "sample4/vep/SVs", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz.tbi", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz_summary.html", + "sample4/vep/germline", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz.tbi", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz_summary.html", + "sample4/vep/somatic", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz.tbi", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz_summary.html" ], [ "sample1_normal.bam:md5,60838033f5f24aa90e16a5babcddd45b", "sample1_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", "sample1_tumor.bam:md5,bd73e83253c95a5fdc4db39454ee2253", "sample1_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", + "sample1_cramino.txt:md5,ae3afdf316806ae18e43ca45de39b330", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", "sample1.stats:md5,cf4b23c58e65cb55b31463db14ed6fd3", + "sample1_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", @@ -313,11 +381,13 @@ "sample2_normal.bam.bai:md5,af193f1922d90b8741212d2bf690c418", "sample2_tumor.bam:md5,26c4e52c12aa0e874fe52ae3b729beba", "sample2_tumor.bam.bai:md5,e9e64e13328aa3621e7976f8e3f29a78", + "sample2_cramino.txt:md5,3bf932a1656c5997f48006fefc4418b7", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", "sample2.stats:md5,2b7f1a2833840d350d2a4d54fed70cf7", + "sample2_cramino.txt:md5,c1842ccc06010e0d282a5f1470547c84", "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", @@ -327,19 +397,40 @@ "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", + "sample3_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813" + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", + "sample4_normal.bam:md5,b1fca5de53966e0927c557afad3d8df3", + "sample4_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", + "sample4_tumor.bam:md5,493ba7936ae34d0f06d65d416fefb435", + "sample4_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", + "sample4_cramino.txt:md5,ae3afdf316806ae18e43ca45de39b330", + "sample4_cramino.txt:md5,ae3afdf316806ae18e43ca45de39b330", + "sample4.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", + "sample4.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", + "sample4.flagstat:md5,815a5385bd57ef44847714130b80d630", + "sample4.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", + "sample4.stats:md5,8830836e19681287abd7eabfc8ac10bd", + "sample4_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", + "sample4_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", + "sample4.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", + "sample4.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "sample4.flagstat:md5,34e851b5504d961632f26991160ded5a", + "sample4.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", + "sample4.stats:md5,dc8fec65923bf23826689ec1865f6fff", + "breakpoints_double.csv:md5,eafc71d123fb6ea562b5dd1fba243bd7", + "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-01-09T17:08:56.493545818" + "timestamp": "2026-03-11T15:36:10.03288147" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index a7eb1861..3892ba2f 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -13,23 +13,24 @@ include { getGenomeAttribute } from '../subworkflows/local/utils_nfcore_lrso // // IMPORT MODULES // -include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' -include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' -include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' -include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' -include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' -include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' -include { ASCAT } from '../modules/nf-core/ascat/main' -include { SEVERUS } from '../modules/nf-core/severus/main.nf' -include { METAEXTRACT } from '../modules/local/metaextract/main' -include { WAKHAN } from '../modules/local/wakhan/main' -include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' -include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' -include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' -include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' -include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' -include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' -include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/cat/main' +include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' +include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' +include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_PRE_REPLICATES } from '../modules/local/cramino/main' +include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' +include { ASCAT } from '../modules/nf-core/ascat/main' +include { SEVERUS } from '../modules/nf-core/severus/main.nf' +include { METAEXTRACT } from '../modules/local/metaextract/main' +include { WAKHAN } from '../modules/local/wakhan/main' +include { FIBERTOOLSRS_PREDICTM6A } from '../modules/local/fibertoolsrs/predictm6a' +include { FIBERTOOLSRS_FIRE } from '../modules/local/fibertoolsrs/fire' +include { FIBERTOOLSRS_NUCLEOSOMES } from '../modules/local/fibertoolsrs/nucleosomes' +include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsrs/qc' +include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' // // IMPORT SUBWORKFLOWS // @@ -121,6 +122,7 @@ workflow LRSOMATIC { platform: meta.platform, sex: meta.sex, fiber: meta.fiber, + replicate: meta.replicate, clair3_model: chosen_clair3_model, clairS_model: chosen_clairS_model, clairSTO_model: chosen_clairSTO_model, @@ -134,6 +136,7 @@ workflow LRSOMATIC { .set{ch_samplesheet} + // // SUBWORKFLOW: PREPARE_REFERENCE_FILES // @@ -150,11 +153,35 @@ workflow LRSOMATIC { downloaded_clair3_models = PREPARE_REFERENCE_FILES.out.downloaded_clair3_models + ch_samplesheet.view() + + + if (!params.skip_qc && !params.skip_cramino) { + CRAMINO_PRE( ch_samplesheet ) + } + + + ch_samplesheet + .map{ meta, bam -> + def new_meta = meta.subMap('id', + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, bam] + } + .set{ch_samplesheet_no_rep} + // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of unaligned bams - ch_split = ch_samplesheet + ch_split = ch_samplesheet_no_rep .branch { meta, bam -> single: bam.size() == 1 multiple: bam.size() > 1 @@ -170,19 +197,12 @@ workflow LRSOMATIC { .mix ( ch_split.single ) .set { ch_cat_ubams } + ch_cat_ubams.view() // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated unaligned bams ch_versions = ch_versions.mix(SAMTOOLS_CAT.out.versions) - // - // MODULE: CRAMINO - // - // QC the unaligned bams - if (!params.skip_qc && !params.skip_cramino) { - CRAMINO_PRE ( ch_cat_ubams ) - } - vep_cache = channel.empty() if (!params.skip_vep) { From 5bfe509ef9e7f441473a391954a965a81591e8e5 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 11 Mar 2026 15:43:53 +0100 Subject: [PATCH 085/183] precommit --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 0f670505..b2e285ee 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -269,7 +269,7 @@ workflow LRSOMATIC { .set{predicted_bams} } - + ch_cat_ubams_pacbio_ont_branching.ont .mix(predicted_bams) From 3ee366b56365015bd1eb1cae5773bfffc14f75e7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 15:47:26 +0100 Subject: [PATCH 086/183] added new prefix to fix same output name issue --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index 5072b8d6..ce3ec749 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -234,6 +234,7 @@ process { ] } withName: '.*:BCFTOOLS_SORT' { + ext.prefix = { "${meta.id}_sorted" } ext.arge = '--output-type z' publishDir = [ enabled: false From 6fcfadce1f96db71913e1fa525aa1dbac5fd0561 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 15:50:59 +0100 Subject: [PATCH 087/183] fix bam stats output channel structure --- workflows/lrsomatic.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 0ef7eae1..93e41f35 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -522,9 +522,9 @@ workflow LRSOMATIC { ch_fasta ) - bam_stats_ch = BAM_STATS_SAMTOOLS.out.stats - bam_flagstat_ch = BAM_STATS_SAMTOOLS.out.flagstat - bam_idxstats_ch = BAM_STATS_SAMTOOLS.out.idxstats + ch_bam_stats = BAM_STATS_SAMTOOLS.out.stats + ch_bam_flagstat = BAM_STATS_SAMTOOLS.out.flagstat + ch_bam_idxstats = BAM_STATS_SAMTOOLS.out.idxstats } // From 90acf3398fa02cdd8d2af3f89b8e7f3ff07e60ce Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 17:07:20 +0100 Subject: [PATCH 088/183] strict syntax changes --- modules/local/clair3/main.nf | 13 +++--- modules/local/clairs/main.nf | 11 ++--- modules/local/clairsto/main.nf | 25 +++++------- modules/local/cramino/main.nf | 1 - modules/local/fibertoolsrs/fire/main.nf | 1 - .../local/fibertoolsrs/nucleosomes/main.nf | 1 - modules/local/fibertoolsrs/predictm6a/main.nf | 1 - modules/local/fibertoolsrs/qc/main.nf | 1 - modules/local/metaextract/main.nf | 7 ++-- modules/local/vcfsplit/main.nf | 4 -- modules/local/wakhan/main.nf | 1 - subworkflows/local/prepare_reference_files.nf | 4 +- subworkflows/local/tumor_normal_happhase.nf | 16 ++++---- subworkflows/local/tumor_only_happhase.nf | 5 +-- .../utils_nfcore_lrsomatic_pipeline/main.nf | 4 +- workflows/lrsomatic.nf | 40 ++++++++----------- 16 files changed, 54 insertions(+), 81 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 37121522..6c46353e 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -13,10 +13,10 @@ process CLAIR3 { tuple val(meta3), path(index) output: - tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf - tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi - tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true - tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + tuple val(meta), path("${prefix}/*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("${prefix}/*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("${prefix}/*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("${prefix}/*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true tuple val("${task.process}"), val('clair3'), eval("run_clair3.sh --version |& sed '1!d ; s/Clair3 v//'"), topic: versions, emit: versions_clair3 when: @@ -25,20 +25,19 @@ process CLAIR3 { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ run_clair3.sh \\ --bam_fn=$bam \\ --ref_fn=$reference \\ --threads=$task.cpus \\ - --output=. \\ + --output=${prefix} \\ --platform=$platform \\ --model=$model \\ $args """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ echo "" | gzip > ${prefix}.phased_merge_output.vcf.gz diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 65489e0c..3a67892b 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -12,8 +12,8 @@ process CLAIRS { tuple val(meta3), path(index) output: - tuple val(meta), path("*.vcf.gz"), emit: vcfs - tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("${prefix}/*.vcf.gz"), emit: vcfs + tuple val(meta), path("${prefix}/*.vcf.gz.tbi"), emit: tbi tuple val("${task.process}"), val('clairs'), eval("/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //'"), topic: versions, emit: versions_clairs when: @@ -21,7 +21,7 @@ process CLAIRS { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ /opt/bin/run_clairs \ @@ -30,7 +30,7 @@ process CLAIRS { --ref_fn $reference \\ --threads $task.cpus \\ --platform $model \\ - --output_dir . \\ + --output_dir ${prefix} \\ --output_prefix snvs \\ $args @@ -41,9 +41,6 @@ process CLAIRS { """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ echo "" | gzip > snvs.vcf.gz touch snvs.vcf.gz.tbi diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 091a4920..1d19484d 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -17,10 +17,10 @@ process CLAIRSTO { path(gnomad) output: - tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf - tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi - tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf - tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi + tuple val(meta), path("${prefix}/indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("${prefix}/indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("${prefix}/snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("${prefix}/snv.vcf.gz.tbi"), emit: snv_tbi tuple val("${task.process}"), val('clairsto'), eval("run_clairs_to --version |& sed '1!d ; s/run_clairs_to //'"), topic: versions, emit: versions_clairsto when: @@ -28,12 +28,12 @@ process CLAIRSTO { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' - def gnomad = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' - def dbSNP = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' - def onekgenomes = onekgenomes ?: '1000g-pon.sites.vcf.gz' - def colors = colors ?: 'colors-pon.sites.vcf.gz' + def gnomad_arg = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' + def dbSNP_arg = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' + def onekgenomes_arg = onekgenomes ?: '1000g-pon.sites.vcf.gz' + def colors_arg = colors ?: 'colors-pon.sites.vcf.gz' """ @@ -42,17 +42,14 @@ process CLAIRSTO { --ref_fn $reference \\ --platform $model \\ --threads $task.cpus \\ - --output_dir . \\ - --panel_of_normals "${gnomad},${dbSNP},${onekgenomes},${colors}" \\ + --output_dir ${prefix} \\ + --panel_of_normals "${gnomad_arg},${dbSNP_arg},${onekgenomes_arg},${colors_arg}" \\ --panel_of_normals_require_allele_matching 'True,True,False,False' \\ $conda_prefix \\ $args \\ """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ mkdir -p output echo "" | gzip > snv.vcf.gz diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index eff34a00..bc255995 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -26,7 +26,6 @@ process CRAMINO { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_cramino.txt diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index f79bbaf0..1240f0d5 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -31,7 +31,6 @@ process FIBERTOOLSRS_FIRE { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_fire.bam diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index a23e883a..33a6c5ea 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -32,7 +32,6 @@ process FIBERTOOLSRS_NUCLEOSOMES { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_nuc.bam diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index f5c20930..5aa174b0 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -32,7 +32,6 @@ process FIBERTOOLSRS_PREDICTM6A { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ diff --git a/modules/local/fibertoolsrs/qc/main.nf b/modules/local/fibertoolsrs/qc/main.nf index 60081f7a..db89d71a 100644 --- a/modules/local/fibertoolsrs/qc/main.nf +++ b/modules/local/fibertoolsrs/qc/main.nf @@ -30,7 +30,6 @@ process FIBERTOOLSRS_QC { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ diff --git a/modules/local/metaextract/main.nf b/modules/local/metaextract/main.nf index 954449e7..fb3c474d 100644 --- a/modules/local/metaextract/main.nf +++ b/modules/local/metaextract/main.nf @@ -20,9 +20,11 @@ process METAEXTRACT { script: def args = task.ext.args ?: '' def ont = meta.platform == 'ont' + basecall_model = '' + kinetics = '' """ - basecall_model="" - kinetics="" + export basecall_model="${basecall_model}" + export kinetics="${kinetics}" if [ $ont = 'true' ]; then basecall_model=\$(samtools view -H "${bam}" ${args} | awk -F'basecall_model=' '/basecall_model=/ {print \$2; exit}' | awk '{print \$1}' | tr -d '[:space:]') else @@ -32,7 +34,6 @@ process METAEXTRACT { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.bam diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index ae84f17d..df7ce318 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -22,8 +22,6 @@ process VCFSPLIT { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" """ bcftools view -i 'FILTER="PASS"' $indel_vcf | bgzip -c > indels_pass.vcf.gz @@ -50,8 +48,6 @@ process VCFSPLIT { """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" """ echo "" | gzip > somatic.vcf.gz echo "" | gzip > germline.vcf.gz diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index d82d0205..85562abe 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -62,7 +62,6 @@ process WAKHAN { """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 17f8079d..f2fbb00b 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -42,7 +42,7 @@ workflow PREPARE_REFERENCE_FILES { // if clair3 model is specified, then download that // otherwise use info in bam header and download that - basecall_meta.map { meta, basecall_model_meta, kinetics_meta -> + basecall_meta.map { meta, basecall_model_meta, _kinetics_meta -> def id_new = basecall_model_meta ? clair3_modelMap.get(basecall_model_meta) : basecall_model_meta def meta_new = [id: id_new] def model = (!meta.clair3_model || meta.clair3_model.toString().trim() in ['', '[]']) ? clair3_modelMap.get(basecall_model_meta) : meta.clair3_model @@ -75,7 +75,7 @@ workflow PREPARE_REFERENCE_FILES { // MODULE: Index the fasta // SAMTOOLS_FAIDX ( - ch_prepared_fasta.map { meta, fasta -> [meta, fasta, []] }, + ch_prepared_fasta.map { meta, fa -> [meta, fa, []] }, false ) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 84fba84c..6abe9941 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -11,20 +11,18 @@ workflow TUMOR_NORMAL_HAPPHASE { mixed_bams fasta fai - clair3_modelMap - clairs_modelMap downloaded_clair3_models main: ch_versions = channel.empty() - tumor_only_severus = channel.empty() + tumor_normal_severus = channel.empty() somatic_vep = channel.empty() germline_vep = channel.empty() // Branch input bams in normal and tumour mixed_bams - .branch{ meta, bam, bai -> + .branch{ meta, _bam, _bai -> normal: meta.type == "normal" tumor: meta.type == "tumor" } @@ -57,7 +55,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams_model .combine(downloaded_clair3_models,by:1) - .map {clair3_model, meta_bam, bam, bai, meta_model, model -> + .map {_clair3_model, meta_bam, bam, bai, _meta_model, model -> def platform = (meta_bam.platform == 'pb') ? 'hifi' : meta_bam.platform return [meta_bam, bam, bai, model, platform] } @@ -113,7 +111,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams .join(CLAIR3.out.vcf) - .map { meta, bam, bai, clair3_model, platform, vcf -> + .map { meta, bam, bai, _clair3_model, _platform, vcf -> def svs = [] def mods = [] return [meta, bam, bai, vcf, svs, mods] @@ -153,7 +151,7 @@ workflow TUMOR_NORMAL_HAPPHASE { normal_bams .join(LONGPHASE_PHASE.out.snv_vcf) - .map { meta, bam, bai, clair3_model, platform, vcf -> + .map { meta, bam, bai, _clair3_model, _platform, vcf -> def new_meta = meta + [type: "normal"] def svs = [] def mods = [] @@ -231,7 +229,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Group everything back together in one channel mixed_hapbams - .map { meta, bam, bai, vcf, snvs, mods, hapbam, hapbai -> + .map { meta, _bam, _bai, _vcf, _snvs, _mods, hapbam, hapbai -> def new_meta = [id: meta.id, paired_data: meta.paired_data, platform: meta.platform, @@ -265,7 +263,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Get ClairS input channel tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf, _tbi -> return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] } .set { clairs_input } diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index f96676b8..2e09f750 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -10,7 +10,6 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams fasta fai - clairSTO_modelMap dbsnp colors onekgenomes @@ -67,7 +66,7 @@ workflow TUMOR_ONLY_HAPPHASE { // remove model info tumor_bams .join(VCFSPLIT.out.germline_vcf) - .map{ meta, bam, bai, model, snps -> + .map{ meta, bam, bai, _model, snps -> def svs = [] def mods = [] return[meta, bam, bai, snps, svs, mods] @@ -112,7 +111,7 @@ workflow TUMOR_ONLY_HAPPHASE { // remove model info tumor_bams .join(LONGPHASE_PHASE.out.snv_vcf) - .map { meta, bam, bai, model, vcf -> + .map { meta, bam, bai, _model, vcf -> def new_meta = meta + [type: "tumor"] def svs = [] def mods = [] diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index d7d151a1..10e20c42 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -29,10 +29,10 @@ workflow PIPELINE_INITIALISATION { take: version // boolean: Display version and exit validate_params // boolean: Boolean whether to validate parameters against the schema at runtime - monochrome_logs // boolean: Do not use coloured log outputs + _monochrome_logs // boolean: Do not use coloured log outputs nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved - input // string: Path to input samplesheet + _input // string: Path to input samplesheet help // boolean: Display help message and exit help_full // boolean: Show the full help message show_hidden // boolean: Show hidden parameters in the help message diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 93e41f35..b7c377a3 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -155,7 +155,7 @@ workflow LRSOMATIC { // bam: list of unaligned bams ch_split = ch_samplesheet - .branch { meta, bam -> + .branch { _meta, bam -> single: bam.size() == 1 multiple: bam.size() > 1 } @@ -226,7 +226,7 @@ workflow LRSOMATIC { if (!params.skip_fiber) { if(!params.normal_fiber){ ch_cat_ubams - .branch { meta, bams -> + .branch { meta, _bams -> normal: meta.type == "normal" tumor: meta.type == "tumor" } @@ -239,7 +239,7 @@ workflow LRSOMATIC { ubams = ch_cat_ubams } ubams - .branch{ meta, bams -> + .branch{ meta, _bams -> pacBio: meta.platform == "pb" ont: meta.platform == "ont" } @@ -247,7 +247,7 @@ workflow LRSOMATIC { pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio pacbio_bams - .branch{meta, bams -> + .branch{meta, _bams -> kinetics: meta.kinetics == "true" noKinetics: meta.kinetics == "false" } @@ -266,7 +266,7 @@ workflow LRSOMATIC { .set{fiber_branch} fiber_branch - .branch{ meta, bams -> + .branch{ meta, _bams -> fiber: meta.fiber == "y" nonFiber: meta.fiber == "n" } @@ -337,7 +337,7 @@ workflow LRSOMATIC { ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) - .branch { meta, bams, bais -> + .branch { meta, _bams, _bais -> paired: meta.paired_data tumor_only: !meta.paired_data } @@ -357,8 +357,6 @@ workflow LRSOMATIC { branched_minimap.paired, ch_fasta, ch_fai, - clair3_modelMap, - clairs_modelMap, downloaded_clair3_models ) @@ -374,12 +372,10 @@ workflow LRSOMATIC { onekgenomes = file(params.onekgenomes) gnomad = file(params.gnomad) - TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, ch_fasta, ch_fai, - clairs_modelMap, dbsnp, colors, onekgenomes, @@ -533,7 +529,7 @@ workflow LRSOMATIC { if (!params.skip_ascat) { severus_reformat - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf -> + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf -> return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } @@ -603,15 +599,6 @@ workflow LRSOMATIC { // // MODULE: MultiQC // - ch_multiqc_config = channel.fromPath( - "$projectDir/assets/multiqc_config.yml", checkIfExists: true) - ch_multiqc_custom_config = params.multiqc_config ? - channel.fromPath(params.multiqc_config, checkIfExists: true) : - channel.empty() - ch_multiqc_logo = params.multiqc_logo ? - channel.fromPath(params.multiqc_logo, checkIfExists: true) : - channel.empty() - summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) @@ -644,13 +631,18 @@ workflow LRSOMATIC { MULTIQC ( ch_multiqc_files .collect() - .combine(ch_multiqc_config.mix(ch_multiqc_custom_config).toList()) - .combine(ch_multiqc_logo.toList()) - .map { files, config, logo -> [[id: 'multiqc'], files, config, logo, [], []] } + .map { files -> + def multiqc_config_files = [file("$projectDir/assets/multiqc_config.yml", checkIfExists: true)] + if (params.multiqc_config) { + multiqc_config_files += [file(params.multiqc_config, checkIfExists: true)] + } + def multiqc_logo_file = params.multiqc_logo ? [file(params.multiqc_logo, checkIfExists: true)] : [] + [[id: 'multiqc'], files, multiqc_config_files, multiqc_logo_file, [], []] + } ) emit: - multiqc_report = MULTIQC.out.report.toList() // channel: /path/to/multiqc_report.html + multiqc_report = MULTIQC.out.report.map { _meta, report -> report } // channel: /path/to/multiqc_report.html versions = ch_versions // channel: [ path(versions.yml) ] From 39c50535aebc81cb899a0f384e435fb65d95592e Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 17:11:26 +0100 Subject: [PATCH 089/183] remove the outdirs again --- modules/local/clair3/main.nf | 9 ++++----- modules/local/clairs/main.nf | 10 ++++++---- modules/local/clairsto/main.nf | 15 ++++++++------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 6c46353e..12701a5f 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -13,10 +13,10 @@ process CLAIR3 { tuple val(meta3), path(index) output: - tuple val(meta), path("${prefix}/*merge_output.vcf.gz"), emit: vcf - tuple val(meta), path("${prefix}/*merge_output.vcf.gz.tbi"), emit: tbi - tuple val(meta), path("${prefix}/*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true - tuple val(meta), path("${prefix}/*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true + tuple val(meta), path("*merge_output.vcf.gz"), emit: vcf + tuple val(meta), path("*merge_output.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*phased_merge_output.vcf.gz"), emit: phased_vcf, optional: true + tuple val(meta), path("*phased_merge_output.vcf.gz.tbi"), emit: phased_tbi, optional: true tuple val("${task.process}"), val('clair3'), eval("run_clair3.sh --version |& sed '1!d ; s/Clair3 v//'"), topic: versions, emit: versions_clair3 when: @@ -25,7 +25,6 @@ process CLAIR3 { script: def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" """ run_clair3.sh \\ --bam_fn=$bam \\ diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 3a67892b..786e819e 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -12,8 +12,8 @@ process CLAIRS { tuple val(meta3), path(index) output: - tuple val(meta), path("${prefix}/*.vcf.gz"), emit: vcfs - tuple val(meta), path("${prefix}/*.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("*.vcf.gz"), emit: vcfs + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi tuple val("${task.process}"), val('clairs'), eval("/opt/bin/run_clairs --version |& sed '1!d ; s/run_clairs //'"), topic: versions, emit: versions_clairs when: @@ -21,7 +21,6 @@ process CLAIRS { script: def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" """ /opt/bin/run_clairs \ @@ -30,7 +29,7 @@ process CLAIRS { --ref_fn $reference \\ --threads $task.cpus \\ --platform $model \\ - --output_dir ${prefix} \\ + --output_dir . \\ --output_prefix snvs \\ $args @@ -41,6 +40,9 @@ process CLAIRS { """ stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ echo "" | gzip > snvs.vcf.gz touch snvs.vcf.gz.tbi diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 1d19484d..a1448bb5 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -17,10 +17,10 @@ process CLAIRSTO { path(gnomad) output: - tuple val(meta), path("${prefix}/indel.vcf.gz"), emit: indel_vcf - tuple val(meta), path("${prefix}/indel.vcf.gz.tbi"), emit: indel_tbi - tuple val(meta), path("${prefix}/snv.vcf.gz"), emit: snv_vcf - tuple val(meta), path("${prefix}/snv.vcf.gz.tbi"), emit: snv_tbi + tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf + tuple val(meta), path("indel.vcf.gz.tbi"), emit: indel_tbi + tuple val(meta), path("snv.vcf.gz"), emit: snv_vcf + tuple val(meta), path("snv.vcf.gz.tbi"), emit: snv_tbi tuple val("${task.process}"), val('clairsto'), eval("run_clairs_to --version |& sed '1!d ; s/run_clairs_to //'"), topic: versions, emit: versions_clairsto when: @@ -28,21 +28,19 @@ process CLAIRSTO { script: def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' def gnomad_arg = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' def dbSNP_arg = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' def onekgenomes_arg = onekgenomes ?: '1000g-pon.sites.vcf.gz' def colors_arg = colors ?: 'colors-pon.sites.vcf.gz' - """ /opt/bin/run_clairs_to \ --tumor_bam_fn $tumor_bam \\ --ref_fn $reference \\ --platform $model \\ --threads $task.cpus \\ - --output_dir ${prefix} \\ + --output_dir . \\ --panel_of_normals "${gnomad_arg},${dbSNP_arg},${onekgenomes_arg},${colors_arg}" \\ --panel_of_normals_require_allele_matching 'True,True,False,False' \\ $conda_prefix \\ @@ -50,6 +48,9 @@ process CLAIRSTO { """ stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ mkdir -p output echo "" | gzip > snv.vcf.gz From 699d7e964fe825e31c7a953b64af99c68d82eb7b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 17:19:14 +0100 Subject: [PATCH 090/183] typo --- modules/local/clair3/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 12701a5f..6619ef14 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -23,14 +23,13 @@ process CLAIR3 { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' """ run_clair3.sh \\ --bam_fn=$bam \\ --ref_fn=$reference \\ --threads=$task.cpus \\ - --output=${prefix} \\ + --output=. \\ --platform=$platform \\ --model=$model \\ $args From 1bacb2aa9a9c93efe20ea29b102bdb4af92ee042 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 17:19:25 +0100 Subject: [PATCH 091/183] linting --- subworkflows/local/prepare_annotation.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 4d8dca26..8771680d 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -21,11 +21,11 @@ workflow PREPARE_ANNOTATION { if (download_vep_cache) { vep_download_info = channel.of([[],vep_genome, vep_species, vep_cache_version]) - - ENSEMBLVEP_DOWNLOAD ( + + ENSEMBLVEP_DOWNLOAD ( vep_download_info ) - + ensemblvep_cache = ENSEMBLVEP_DOWNLOAD.out.cache ch_versions = ch_versions.mix(ENSEMBLVEP_DOWNLOAD.out.versions) From aa5440304b8b25d7b095fc25fdef1ba08913340a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 17:20:37 +0100 Subject: [PATCH 092/183] final strict syntax changes --- modules/local/clairs/main.nf | 3 --- modules/local/clairsto/main.nf | 3 --- 2 files changed, 6 deletions(-) diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 786e819e..d683c777 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -40,9 +40,6 @@ process CLAIRS { """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ echo "" | gzip > snvs.vcf.gz touch snvs.vcf.gz.tbi diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index a1448bb5..9071487d 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -48,9 +48,6 @@ process CLAIRSTO { """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ mkdir -p output echo "" | gzip > snv.vcf.gz From e3fcfe23ff7ef77c72c3a0fa3cb373fe2d10f693 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 11 Mar 2026 18:52:10 +0100 Subject: [PATCH 093/183] add nanoplot output --- conf/modules.config | 16 + modules/local/cramino/main.nf | 3 +- modules/nf-core/nanoplot/environment.yml | 7 + modules/nf-core/nanoplot/main.nf | 56 +++ modules/nf-core/nanoplot/meta.yml | 74 ++++ modules/nf-core/nanoplot/tests/main.nf.test | 93 +++++ .../nf-core/nanoplot/tests/main.nf.test.snap | 127 +++++++ modules/nf-core/nanoplot/tests/tags.yaml | 2 + .../utils_nfcore_lrsomatic_pipeline/main.nf | 1 - tests/default.nf.test.snap | 334 +++++++++++++++++- workflows/lrsomatic.nf | 8 +- 11 files changed, 705 insertions(+), 16 deletions(-) create mode 100644 modules/nf-core/nanoplot/environment.yml create mode 100644 modules/nf-core/nanoplot/main.nf create mode 100644 modules/nf-core/nanoplot/meta.yml create mode 100644 modules/nf-core/nanoplot/tests/main.nf.test create mode 100644 modules/nf-core/nanoplot/tests/main.nf.test.snap create mode 100644 modules/nf-core/nanoplot/tests/tags.yaml diff --git a/conf/modules.config b/conf/modules.config index d0c742ff..1dda70b4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -58,6 +58,22 @@ process { ] } + withName: '.*:NANOPLOT_PRE' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_ubam_${meta.replicate}/" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*:NANOPLOT_POST' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_aln" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*:FIBERTOOLSRS_QC' { ext.args = { params.autocorrelation ? "--acf" : '' } publishDir = [ diff --git a/modules/local/cramino/main.nf b/modules/local/cramino/main.nf index eff34a00..099a1558 100644 --- a/modules/local/cramino/main.nf +++ b/modules/local/cramino/main.nf @@ -12,6 +12,7 @@ process CRAMINO { output: tuple val(meta), path("*.txt"), emit: txt + tuple val(meta), path("*.arrow"), emit: arrow tuple val("${task.process}"), val('cramino'), eval("cramino --version |& sed '1!d ; s/cramino //'"), topic: versions, emit: versions_cramino when: @@ -22,7 +23,7 @@ process CRAMINO { def prefix = task.ext.prefix ?: "${meta.id}" """ - cramino $args $bam > ${prefix}_cramino.txt + cramino $args $bam --arrow ${prefix}.arrow > ${prefix}_cramino.txt """ stub: diff --git a/modules/nf-core/nanoplot/environment.yml b/modules/nf-core/nanoplot/environment.yml new file mode 100644 index 00000000..c6b1c5bf --- /dev/null +++ b/modules/nf-core/nanoplot/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::nanoplot=1.46.1 diff --git a/modules/nf-core/nanoplot/main.nf b/modules/nf-core/nanoplot/main.nf new file mode 100644 index 00000000..2bb02b20 --- /dev/null +++ b/modules/nf-core/nanoplot/main.nf @@ -0,0 +1,56 @@ +process NANOPLOT { + 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/nanoplot:1.46.1--pyhdfd78af_0' : + 'biocontainers/nanoplot:1.46.1--pyhdfd78af_0' }" + + input: + tuple val(meta), path(ontfile) + + output: + tuple val(meta), path("*.html") , emit: html + tuple val(meta), path("*.png") , optional: true, emit: png + tuple val(meta), path("*.txt") , emit: txt + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def input_file = ("$ontfile".endsWith(".fastq.gz") || "$ontfile".endsWith(".fq.gz")) ? "--fastq ${ontfile}" : + ("$ontfile".endsWith(".txt")) ? "--summary ${ontfile}" : ("$ontfile".endsWith(".arrow")) ? "--arrow ${ontfile}" : '' + """ + NanoPlot \\ + $args \\ + -t $task.cpus \\ + $input_file + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + nanoplot: \$(echo \$(NanoPlot --version 2>&1) | sed 's/^.*NanoPlot //; s/ .*\$//') + END_VERSIONS + """ + + stub: + """ + touch LengthvsQualityScatterPlot_dot.html + touch LengthvsQualityScatterPlot_kde.html + touch NanoPlot-report.html + touch NanoStats.txt + touch Non_weightedHistogramReadlength.html + touch Non_weightedLogTransformed_HistogramReadlength.html + touch WeightedHistogramReadlength.html + touch WeightedLogTransformed_HistogramReadlength.html + touch Yield_By_Length.html + + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + nanoplot: \$(echo \$(NanoPlot --version 2>&1) | sed 's/^.*NanoPlot //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/nanoplot/meta.yml b/modules/nf-core/nanoplot/meta.yml new file mode 100644 index 00000000..3df7b98c --- /dev/null +++ b/modules/nf-core/nanoplot/meta.yml @@ -0,0 +1,74 @@ +name: nanoplot +description: Run NanoPlot on nanopore-sequenced reads +keywords: + - quality control + - qc + - fastq + - sequencing summary + - nanopore +tools: + - nanoplot: + description: | + NanoPlot is a tool for plotting long-read sequencing data and + alignment. + homepage: http://nanoplot.bioinf.be + documentation: https://github.com/wdecoster/NanoPlot + licence: ["GPL-3.0-or-later"] + identifier: biotools:nanoplot +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ontfile: + type: file + description: ONT file + ontologies: [] +output: + html: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.html": + type: file + description: NanoPlot report + pattern: "*{.html}" + ontologies: [] + png: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.png": + type: file + description: Plots generated by NanoPlot + pattern: "*{.png}" + ontologies: [] + txt: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.txt": + type: file + description: Stats from NanoPlot + pattern: "*{.txt}" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@drpatelh" + - "@yuukiiwa" +maintainers: + - "@drpatelh" + - "@yuukiiwa" diff --git a/modules/nf-core/nanoplot/tests/main.nf.test b/modules/nf-core/nanoplot/tests/main.nf.test new file mode 100644 index 00000000..f5163bab --- /dev/null +++ b/modules/nf-core/nanoplot/tests/main.nf.test @@ -0,0 +1,93 @@ +nextflow_process { + + name "Test Process NANOPLOT" + tag "modules_nfcore" + tag "modules" + tag "nanoplot" + script "../main.nf" + process "NANOPLOT" + + test("NanoPlot summary") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/nanopore/sequencing_summary/test.sequencing_summary.txt', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.html[0][1].size() > 0 }, + { assert process.out.txt[0][1] }, + { assert file(process.out.txt[0][1]).readLines().size() > 1 }, + { assert snapshot( + process.out.html[0][1].collect { p -> file(p).name }, + file(process.out.txt[0][1]).name, + // file(process.out.png[0][1]).name, optional + // file(process.out.log[0][1]).name, name contains date + process.out.versions + ).match() + } + ) + } + } + + test("NanoPlot FASTQ") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/nanopore/fastq/test.fastq.gz', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.html[0][1].size() > 0 }, + { assert process.out.txt[0][1] }, + { assert file(process.out.txt[0][1]).readLines().size() > 1 }, + { assert snapshot( + process.out.html[0][1].collect { p -> file(p).name }, + file(process.out.txt[0][1]).name, + // file(process.out.png[0][1]).name, optional + // file(process.out.log[0][1]).name, name contains date + process.out.versions + ).match() + } + ) + } + } + + test("NanoPlot - stub") { + + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/nanopore/sequencing_summary/test.sequencing_summary.txt', checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/nanoplot/tests/main.nf.test.snap b/modules/nf-core/nanoplot/tests/main.nf.test.snap new file mode 100644 index 00000000..527d6605 --- /dev/null +++ b/modules/nf-core/nanoplot/tests/main.nf.test.snap @@ -0,0 +1,127 @@ +{ + "NanoPlot - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "LengthvsQualityScatterPlot_dot.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "LengthvsQualityScatterPlot_kde.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "NanoPlot-report.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "Non_weightedHistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "WeightedHistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "WeightedLogTransformed_HistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "Yield_By_Length.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "NanoStats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + "versions.yml:md5,1dcb7bfda282d447bdf7fff8f83e0076" + ], + "html": [ + [ + { + "id": "test" + }, + [ + "LengthvsQualityScatterPlot_dot.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "LengthvsQualityScatterPlot_kde.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "NanoPlot-report.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "Non_weightedHistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "WeightedHistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "WeightedLogTransformed_HistogramReadlength.html:md5,d41d8cd98f00b204e9800998ecf8427e", + "Yield_By_Length.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "png": [ + + ], + "txt": [ + [ + { + "id": "test" + }, + "NanoStats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,1dcb7bfda282d447bdf7fff8f83e0076" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-29T11:06:10.291228562" + }, + "NanoPlot FASTQ": { + "content": [ + [ + "LengthvsQualityScatterPlot_dot.html", + "LengthvsQualityScatterPlot_kde.html", + "NanoPlot-report.html", + "Non_weightedHistogramReadlength.html", + "Non_weightedLogTransformed_HistogramReadlength.html", + "WeightedHistogramReadlength.html", + "WeightedLogTransformed_HistogramReadlength.html", + "Yield_By_Length.html" + ], + "NanoStats.txt", + [ + "versions.yml:md5,1dcb7bfda282d447bdf7fff8f83e0076" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-28T16:57:47.664858879" + }, + "NanoPlot summary": { + "content": [ + [ + "ActivePores_Over_Time.html", + "ActivityMap_ReadsPerChannel.html", + "CumulativeYieldPlot_Gigabases.html", + "CumulativeYieldPlot_NumberOfReads.html", + "NanoPlot-report.html", + "Non_weightedHistogramReadlength.html", + "Non_weightedLogTransformed_HistogramReadlength.html", + "NumberOfReads_Over_Time.html", + "TimeLengthViolinPlot.html", + "TimeQualityViolinPlot.html", + "TimeSequencingSpeed_ViolinPlot.html", + "WeightedHistogramReadlength.html", + "WeightedLogTransformed_HistogramReadlength.html", + "Yield_By_Length.html" + ], + "NanoStats.txt", + [ + "versions.yml:md5,1dcb7bfda282d447bdf7fff8f83e0076" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "25.04.6" + }, + "timestamp": "2025-08-28T16:57:35.686031695" + } +} \ No newline at end of file diff --git a/modules/nf-core/nanoplot/tests/tags.yaml b/modules/nf-core/nanoplot/tests/tags.yaml new file mode 100644 index 00000000..7c6ce3fa --- /dev/null +++ b/modules/nf-core/nanoplot/tests/tags.yaml @@ -0,0 +1,2 @@ +nanoplot: + - modules/nf-core/nanoplot/** diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index fc7d8f1d..2653553b 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -105,7 +105,6 @@ workflow PIPELINE_INITIALISATION { .map { meta, bam_tumor, bam_normal -> [ meta, bam_tumor.flatten(), bam_normal.flatten() ] } - .view() .flatMap { meta, tumor_bam, normal_bam -> def meta_tumor = meta.clone() meta_tumor.type = 'tumor' diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 2881d980..5498dbee 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -127,24 +127,66 @@ "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1.arrow", "sample1/qc/normal/cramino_aln/sample1_cramino.txt", "sample1/qc/normal/cramino_ubam_1", + "sample1/qc/normal/cramino_ubam_1/sample1.arrow", "sample1/qc/normal/cramino_ubam_1/sample1_cramino.txt", "sample1/qc/normal/mosdepth", "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/nanoplot_aln", + "sample1/qc/normal/nanoplot_aln/NanoPlot-report.html", + "sample1/qc/normal/nanoplot_aln/NanoStats.txt", + "sample1/qc/normal/nanoplot_aln/Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/normal/nanoplot_aln/WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam_1", + "sample1/qc/normal/nanoplot_ubam_1/NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam_1/NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/Yield_By_Length.html", "sample1/qc/normal/samtools", "sample1/qc/normal/samtools/sample1.flagstat", "sample1/qc/normal/samtools/sample1.idxstats", "sample1/qc/normal/samtools/sample1.stats", "sample1/qc/tumor", "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1.arrow", "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", "sample1/qc/tumor/cramino_ubam_1", + "sample1/qc/tumor/cramino_ubam_1/sample1.arrow", "sample1/qc/tumor/cramino_ubam_1/sample1_cramino.txt", "sample1/qc/tumor/mosdepth", "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/nanoplot_aln", + "sample1/qc/tumor/nanoplot_aln/NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_aln/NanoStats.txt", + "sample1/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam_1", + "sample1/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam_1/NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", "sample1/qc/tumor/samtools", "sample1/qc/tumor/samtools/sample1.flagstat", "sample1/qc/tumor/samtools/sample1.idxstats", @@ -189,24 +231,66 @@ "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2.arrow", "sample2/qc/normal/cramino_aln/sample2_cramino.txt", "sample2/qc/normal/cramino_ubam_1", + "sample2/qc/normal/cramino_ubam_1/sample2.arrow", "sample2/qc/normal/cramino_ubam_1/sample2_cramino.txt", "sample2/qc/normal/mosdepth", "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/nanoplot_aln", + "sample2/qc/normal/nanoplot_aln/NanoPlot-report.html", + "sample2/qc/normal/nanoplot_aln/NanoStats.txt", + "sample2/qc/normal/nanoplot_aln/Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/normal/nanoplot_aln/WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam_1", + "sample2/qc/normal/nanoplot_ubam_1/NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam_1/NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/Yield_By_Length.html", "sample2/qc/normal/samtools", "sample2/qc/normal/samtools/sample2.flagstat", "sample2/qc/normal/samtools/sample2.idxstats", "sample2/qc/normal/samtools/sample2.stats", "sample2/qc/tumor", "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2.arrow", "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", "sample2/qc/tumor/cramino_ubam_1", + "sample2/qc/tumor/cramino_ubam_1/sample2.arrow", "sample2/qc/tumor/cramino_ubam_1/sample2_cramino.txt", "sample2/qc/tumor/mosdepth", "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/nanoplot_aln", + "sample2/qc/tumor/nanoplot_aln/NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_aln/NanoStats.txt", + "sample2/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam_1", + "sample2/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam_1/NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", "sample2/qc/tumor/samtools", "sample2/qc/tumor/samtools/sample2.flagstat", "sample2/qc/tumor/samtools/sample2.idxstats", @@ -249,12 +333,33 @@ "sample3/qc", "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3.arrow", "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", "sample3/qc/tumor/cramino_ubam_1", + "sample3/qc/tumor/cramino_ubam_1/sample3.arrow", "sample3/qc/tumor/cramino_ubam_1/sample3_cramino.txt", "sample3/qc/tumor/mosdepth", "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/nanoplot_aln", + "sample3/qc/tumor/nanoplot_aln/NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_aln/NanoStats.txt", + "sample3/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample3/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", + "sample3/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", + "sample3/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam_1", + "sample3/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam_1/NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", "sample3/qc/tumor/samtools", "sample3/qc/tumor/samtools/sample3.flagstat", "sample3/qc/tumor/samtools/sample3.idxstats", @@ -300,28 +405,88 @@ "sample4/qc", "sample4/qc/normal", "sample4/qc/normal/cramino_aln", + "sample4/qc/normal/cramino_aln/sample4.arrow", "sample4/qc/normal/cramino_aln/sample4_cramino.txt", "sample4/qc/normal/cramino_ubam_1", + "sample4/qc/normal/cramino_ubam_1/sample4.arrow", "sample4/qc/normal/cramino_ubam_1/sample4_cramino.txt", "sample4/qc/normal/cramino_ubam_2", + "sample4/qc/normal/cramino_ubam_2/sample4.arrow", "sample4/qc/normal/cramino_ubam_2/sample4_cramino.txt", "sample4/qc/normal/mosdepth", "sample4/qc/normal/mosdepth/sample4.mosdepth.global.dist.txt", "sample4/qc/normal/mosdepth/sample4.mosdepth.summary.txt", + "sample4/qc/normal/nanoplot_aln", + "sample4/qc/normal/nanoplot_aln/NanoPlot-report.html", + "sample4/qc/normal/nanoplot_aln/NanoStats.txt", + "sample4/qc/normal/nanoplot_aln/Non_weightedHistogramReadlength.html", + "sample4/qc/normal/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/normal/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample4/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", + "sample4/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", + "sample4/qc/normal/nanoplot_aln/WeightedHistogramReadlength.html", + "sample4/qc/normal/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/normal/nanoplot_aln/Yield_By_Length.html", + "sample4/qc/normal/nanoplot_ubam_1", + "sample4/qc/normal/nanoplot_ubam_1/NanoPlot-report.html", + "sample4/qc/normal/nanoplot_ubam_1/NanoStats.txt", + "sample4/qc/normal/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_1/WeightedHistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_1/Yield_By_Length.html", + "sample4/qc/normal/nanoplot_ubam_2", + "sample4/qc/normal/nanoplot_ubam_2/NanoPlot-report.html", + "sample4/qc/normal/nanoplot_ubam_2/NanoStats.txt", + "sample4/qc/normal/nanoplot_ubam_2/Non_weightedHistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_2/Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_2/WeightedHistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_2/WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/normal/nanoplot_ubam_2/Yield_By_Length.html", "sample4/qc/normal/samtools", "sample4/qc/normal/samtools/sample4.flagstat", "sample4/qc/normal/samtools/sample4.idxstats", "sample4/qc/normal/samtools/sample4.stats", "sample4/qc/tumor", "sample4/qc/tumor/cramino_aln", + "sample4/qc/tumor/cramino_aln/sample4.arrow", "sample4/qc/tumor/cramino_aln/sample4_cramino.txt", "sample4/qc/tumor/cramino_ubam_1", + "sample4/qc/tumor/cramino_ubam_1/sample4.arrow", "sample4/qc/tumor/cramino_ubam_1/sample4_cramino.txt", "sample4/qc/tumor/cramino_ubam_2", + "sample4/qc/tumor/cramino_ubam_2/sample4.arrow", "sample4/qc/tumor/cramino_ubam_2/sample4_cramino.txt", "sample4/qc/tumor/mosdepth", "sample4/qc/tumor/mosdepth/sample4.mosdepth.global.dist.txt", "sample4/qc/tumor/mosdepth/sample4.mosdepth.summary.txt", + "sample4/qc/tumor/nanoplot_aln", + "sample4/qc/tumor/nanoplot_aln/NanoPlot-report.html", + "sample4/qc/tumor/nanoplot_aln/NanoStats.txt", + "sample4/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample4/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", + "sample4/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", + "sample4/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_aln/Yield_By_Length.html", + "sample4/qc/tumor/nanoplot_ubam_1", + "sample4/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", + "sample4/qc/tumor/nanoplot_ubam_1/NanoStats.txt", + "sample4/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", + "sample4/qc/tumor/nanoplot_ubam_2", + "sample4/qc/tumor/nanoplot_ubam_2/NanoPlot-report.html", + "sample4/qc/tumor/nanoplot_ubam_2/NanoStats.txt", + "sample4/qc/tumor/nanoplot_ubam_2/Non_weightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_2/Non_weightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_2/WeightedHistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_2/WeightedLogTransformed_HistogramReadlength.html", + "sample4/qc/tumor/nanoplot_ubam_2/Yield_By_Length.html", "sample4/qc/tumor/samtools", "sample4/qc/tumor/samtools/sample4.flagstat", "sample4/qc/tumor/samtools/sample4.idxstats", @@ -363,15 +528,53 @@ "sample1_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", "sample1_tumor.bam:md5,bd73e83253c95a5fdc4db39454ee2253", "sample1_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", - "sample1_cramino.txt:md5,ae3afdf316806ae18e43ca45de39b330", + "sample1.arrow:md5,d1a96ecc3b5e3e934ba88363a763899f", + "sample1.arrow:md5,94ff32ca347d77fd8af5a78b483bf98e", + "sample1_cramino.txt:md5,a91610c9bb2a2d7bcd155c74ec6d6153", "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", + "NanoPlot-report.html:md5,de2341206208a0fc95a1fd35fff76303", + "NanoStats.txt:md5,40388145dc647fe7b1731dcfbfb02271", + "Non_weightedHistogramReadlength.html:md5,2807732d3c656fb2b4de9dc19bdac737", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,f26df3b403b6386a8a3fa556f272be5e", + "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,4d764f224588266958fee4b7ea9ad924", + "PercentIdentityvsAlignedReadLength_dot.html:md5,28edac69b941ad698465f274d4f0d939", + "PercentIdentityvsAlignedReadLength_kde.html:md5,969b26424a6b865e0d148c9cbbf27e6b", + "WeightedHistogramReadlength.html:md5,18b384483453c4215ec9826a9a5f440c", + "WeightedLogTransformed_HistogramReadlength.html:md5,071684ff8a59364ed72ac2070057fd1d", + "Yield_By_Length.html:md5,29e4f4d512894beefde2236f1bd5ed7c", + "NanoPlot-report.html:md5,091addcc85633ff06b98dc8a32e02522", + "NanoStats.txt:md5,a4fb5d0237f6a0e16d75a4d4a186d5a9", + "Non_weightedHistogramReadlength.html:md5,a292f4fe380ece9bc5224ed687748273", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,e5e5882bf19061ff424093498619454a", + "WeightedHistogramReadlength.html:md5,87bbb172e8e145677893327b7fba5980", + "WeightedLogTransformed_HistogramReadlength.html:md5,869731ba838636842c59ed21297e1d26", + "Yield_By_Length.html:md5,32101c925cd9ce6cf5b623a7d78c5a6d", "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", "sample1.stats:md5,cf4b23c58e65cb55b31463db14ed6fd3", - "sample1_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", + "sample1.arrow:md5,d7b489b1d70541815579bf74d5aa8cb4", + "sample1.arrow:md5,16bde96910276bac19a644c69631fedc", + "sample1_cramino.txt:md5,bdb6a210439fd0a30051ff58268fb2a0", "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "NanoPlot-report.html:md5,f9e342f457ae45ce335b47ff8c18fd2a", + "NanoStats.txt:md5,4b13dfb48a4cf6b4202be8648da59da8", + "Non_weightedHistogramReadlength.html:md5,2fb2945d51a29ef3ef64104e47e0e435", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,61d6089d8930069dbdf0e31cdb28c5b8", + "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,196c8922f4d5adf715a7f7aa6e7b4b76", + "PercentIdentityvsAlignedReadLength_dot.html:md5,b04d8708b7251ad7933d62d0c755ba93", + "PercentIdentityvsAlignedReadLength_kde.html:md5,963bee15ace6d7d9a396e90edc3a7637", + "WeightedHistogramReadlength.html:md5,ad8a90b956cc460d9eb870e073a55997", + "WeightedLogTransformed_HistogramReadlength.html:md5,85597822dbfd268da0a4b961ebfc3916", + "Yield_By_Length.html:md5,6d93d72676efe53fe13391eea3ce5f1c", + "NanoPlot-report.html:md5,7152dc69409a64b4ef661e70031f89d4", + "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", + "Non_weightedHistogramReadlength.html:md5,3fbb348f631966e24b4000a1909c3dc1", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,a047dc561c1d191feb6e2b2bb80bf211", + "WeightedHistogramReadlength.html:md5,b965e5580c0e25a032f036fff908ffe6", + "WeightedLogTransformed_HistogramReadlength.html:md5,62363b50f95570833447e6cc56ba0c36", + "Yield_By_Length.html:md5,9ed1207601e8be66135f5277013f0690", "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", @@ -381,15 +584,53 @@ "sample2_normal.bam.bai:md5,af193f1922d90b8741212d2bf690c418", "sample2_tumor.bam:md5,26c4e52c12aa0e874fe52ae3b729beba", "sample2_tumor.bam.bai:md5,e9e64e13328aa3621e7976f8e3f29a78", - "sample2_cramino.txt:md5,3bf932a1656c5997f48006fefc4418b7", + "sample2.arrow:md5,601a76e2cff7373b4705557d45706d3c", + "sample2.arrow:md5,7a4030a6eceb4c6f6249233652b619da", + "sample2_cramino.txt:md5,b0d397f407b792a406e14bf7b0519acc", "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", + "NanoPlot-report.html:md5,c2f9b2644089e94bd21d80eb0a7d6cf9", + "NanoStats.txt:md5,dfb476731c22b26f2f767f6e87a24476", + "Non_weightedHistogramReadlength.html:md5,e821e3bc9931376b2f0ed7f5eaa942e4", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,b1475b7b1389445526b8e4ebc6cab10b", + "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,676b7afc53fde6b5c6da742f266d1767", + "PercentIdentityvsAlignedReadLength_dot.html:md5,8a10a69b9bf23d0b24a294f6908301f9", + "PercentIdentityvsAlignedReadLength_kde.html:md5,4a446ca47a62093bba78e3172b75da0d", + "WeightedHistogramReadlength.html:md5,3f90beb57f91e55f79fa9e6507bc9af7", + "WeightedLogTransformed_HistogramReadlength.html:md5,1202304018ecf4e74615f3ae69b43bbd", + "Yield_By_Length.html:md5,dc46bfdd72bc9a1af201c627212add5d", + "NanoPlot-report.html:md5,9d95c307eb12ac3868861bd559385e99", + "NanoStats.txt:md5,3d81081b7070fdc07f9813d3bfa63367", + "Non_weightedHistogramReadlength.html:md5,6891f6e28b0c6c88a3e7870ba8830cdb", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,957bc6732866fbfe7374042893e60b48", + "WeightedHistogramReadlength.html:md5,12bb6014c7f0ac1ec4335630d6200ca5", + "WeightedLogTransformed_HistogramReadlength.html:md5,30a3d3fe3c711632f0d9e111c8f59c9e", + "Yield_By_Length.html:md5,54d853df92a3596d7b540e5abc22271f", "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", "sample2.stats:md5,2b7f1a2833840d350d2a4d54fed70cf7", - "sample2_cramino.txt:md5,c1842ccc06010e0d282a5f1470547c84", + "sample2.arrow:md5,8f97c887f3060678bafc1646ce644eb0", + "sample2.arrow:md5,22a79e85d112d8e2ea5f50cbf443f6a9", + "sample2_cramino.txt:md5,13b6514c4e1e55a5f15bb86b289d3176", "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", + "NanoPlot-report.html:md5,c277d4aff98d7d21f899418ce2dd564f", + "NanoStats.txt:md5,7f9288f9a425ec7985281e7d3debba02", + "Non_weightedHistogramReadlength.html:md5,44dedc21363ae9181f7edbda036a16f0", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,e37a843e30e3bec0db10aa00fba8f38e", + "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,e8ae579ff409643302e091bbb8dcad91", + "PercentIdentityvsAlignedReadLength_dot.html:md5,71aba5b0ef0986907292c254896adccf", + "PercentIdentityvsAlignedReadLength_kde.html:md5,b0d9bebd50f5c7e5c850e3e6932d25f8", + "WeightedHistogramReadlength.html:md5,cb9a0c9674462f605396a63c17c0c5d6", + "WeightedLogTransformed_HistogramReadlength.html:md5,a0a21c652cea2793a62f288bec0875d0", + "Yield_By_Length.html:md5,8c491a7bef4338b06e5f0f114ccf4d24", + "NanoPlot-report.html:md5,8b31c3424bf0a7cd72e85484205cc64e", + "NanoStats.txt:md5,a5a89662e201ce5194fd3fa484e4ac9e", + "Non_weightedHistogramReadlength.html:md5,c425607748644ebca9420d913cc1973c", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,f586a13e0109494e71462a3c8c1fe14d", + "WeightedHistogramReadlength.html:md5,428218be95fc762c2debb86c8e5af4da", + "WeightedLogTransformed_HistogramReadlength.html:md5,d780f4585050941823c045b76410e1c5", + "Yield_By_Length.html:md5,b0165f94bd928fa054eb3e8053352184", "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", "sample2.stats:md5,defe74842396209b6cff4b32994287c7", @@ -397,9 +638,28 @@ "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", - "sample3_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", + "sample3.arrow:md5,d7b489b1d70541815579bf74d5aa8cb4", + "sample3.arrow:md5,16bde96910276bac19a644c69631fedc", + "sample3_cramino.txt:md5,bdb6a210439fd0a30051ff58268fb2a0", "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "NanoPlot-report.html:md5,56fd932857464087aa031a90601caabf", + "NanoStats.txt:md5,4b13dfb48a4cf6b4202be8648da59da8", + "Non_weightedHistogramReadlength.html:md5,2ead48c33f238f33f5590b59bca3bcee", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,46f3d976616241a47b6e25f7045396f3", + "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,e5d15d31f657734c6bf6d0f09c18cf84", + "PercentIdentityvsAlignedReadLength_dot.html:md5,f1dfac9de6382fe857d492e2e0b0afee", + "PercentIdentityvsAlignedReadLength_kde.html:md5,27d869ecb61fa3232cdbfd680d95612b", + "WeightedHistogramReadlength.html:md5,df24d835f48e1641fb051fcdf2b01967", + "WeightedLogTransformed_HistogramReadlength.html:md5,bcd3a858c535418bc9532a0f71f919a7", + "Yield_By_Length.html:md5,dfe9a3513050aea1c211fb2f263ecb9e", + "NanoPlot-report.html:md5,49b0cc58cef583c874c32f2bc816b3a0", + "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", + "Non_weightedHistogramReadlength.html:md5,a27d6ef6b58c922fab9e2559049bfe3a", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,1d09b6b4079bd72fabd4602b3557bf84", + "WeightedHistogramReadlength.html:md5,d5a3dbd7239a6ecdd84a53bf0b3294b0", + "WeightedLogTransformed_HistogramReadlength.html:md5,1c6fc593986abbf61a08baaa5cac9893", + "Yield_By_Length.html:md5,dafbc667e5a948e24b7238b5aa4adb51", "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f", @@ -409,17 +669,71 @@ "sample4_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", "sample4_tumor.bam:md5,493ba7936ae34d0f06d65d416fefb435", "sample4_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", - "sample4_cramino.txt:md5,ae3afdf316806ae18e43ca45de39b330", - "sample4_cramino.txt:md5,ae3afdf316806ae18e43ca45de39b330", + "sample4.arrow:md5,d1a96ecc3b5e3e934ba88363a763899f", + "sample4.arrow:md5,94ff32ca347d77fd8af5a78b483bf98e", + "sample4_cramino.txt:md5,a91610c9bb2a2d7bcd155c74ec6d6153", + "sample4.arrow:md5,94ff32ca347d77fd8af5a78b483bf98e", + "sample4_cramino.txt:md5,a91610c9bb2a2d7bcd155c74ec6d6153", "sample4.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", "sample4.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", + "NanoPlot-report.html:md5,8de4b4359affe1f8e8583d5a49d89f3e", + "NanoStats.txt:md5,40388145dc647fe7b1731dcfbfb02271", + "Non_weightedHistogramReadlength.html:md5,f933a27f441e470ee64993861bf7eead", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,13f65514655b4fc9e95f4319822525d8", + "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,df9237a8b777ad8da719d9415b8abea2", + "PercentIdentityvsAlignedReadLength_dot.html:md5,5f8cbca3e8748c72bbd2ba2064351eba", + "PercentIdentityvsAlignedReadLength_kde.html:md5,c3da4b399e96901f23d8c81902dd9b8f", + "WeightedHistogramReadlength.html:md5,4be5f699617642918b47a1897921dbb5", + "WeightedLogTransformed_HistogramReadlength.html:md5,6bf0d9b7f801c80708deeeac0d3f9617", + "Yield_By_Length.html:md5,5f25e566e288250fa79d05a5793e4417", + "NanoPlot-report.html:md5,d0066e75e1458d702046f1904f96f5df", + "NanoStats.txt:md5,a4fb5d0237f6a0e16d75a4d4a186d5a9", + "Non_weightedHistogramReadlength.html:md5,c434e5e6a9fcb248200da657630e127b", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,a4fe81569e206b3f39a04e4e98fca9e6", + "WeightedHistogramReadlength.html:md5,50d13b0cc7342ef1e17673506c4f576b", + "WeightedLogTransformed_HistogramReadlength.html:md5,70d00d9f5148644de139806d71bedf58", + "Yield_By_Length.html:md5,de97a0b8f847cd68a3249f1c13213bba", + "NanoPlot-report.html:md5,bb1842773b65587c889667080ea18166", + "NanoStats.txt:md5,a4fb5d0237f6a0e16d75a4d4a186d5a9", + "Non_weightedHistogramReadlength.html:md5,4c71b66d1d2af2086900a24dd099589f", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,eced44acc2ca8ba8450def72e0afa11f", + "WeightedHistogramReadlength.html:md5,533111dd9b2c8651ad0be8bf8f367d7f", + "WeightedLogTransformed_HistogramReadlength.html:md5,bcdc7ff2d0b3201d5de16fba9ed5f7b4", + "Yield_By_Length.html:md5,8b2428feb25a939fba683803b4d56f4d", "sample4.flagstat:md5,815a5385bd57ef44847714130b80d630", "sample4.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", "sample4.stats:md5,8830836e19681287abd7eabfc8ac10bd", - "sample4_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", - "sample4_cramino.txt:md5,ed693bcb35499f67b8e1a30828cca591", + "sample4.arrow:md5,d7b489b1d70541815579bf74d5aa8cb4", + "sample4.arrow:md5,16bde96910276bac19a644c69631fedc", + "sample4_cramino.txt:md5,bdb6a210439fd0a30051ff58268fb2a0", + "sample4.arrow:md5,16bde96910276bac19a644c69631fedc", + "sample4_cramino.txt:md5,bdb6a210439fd0a30051ff58268fb2a0", "sample4.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", "sample4.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", + "NanoPlot-report.html:md5,1510dd0635170d2e0680e31d0ffe34b7", + "NanoStats.txt:md5,4b13dfb48a4cf6b4202be8648da59da8", + "Non_weightedHistogramReadlength.html:md5,780d60eb92e1e503990cb3f6bea55f7f", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,1f961c37010f8d749908ef5a49aa1688", + "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,413608f7486c92cdbb25f4cdb91b1c9c", + "PercentIdentityvsAlignedReadLength_dot.html:md5,61604637a710ff77bdabf9d038dde643", + "PercentIdentityvsAlignedReadLength_kde.html:md5,9b109371c76c216852b9445623fcea41", + "WeightedHistogramReadlength.html:md5,cba5b806a3fcae29ed2a8b8a0817b13c", + "WeightedLogTransformed_HistogramReadlength.html:md5,08f6fa2cb86342ff6f4ff1fbd4c0772a", + "Yield_By_Length.html:md5,cc70b2f7240e125c55bd4d0538425bd6", + "NanoPlot-report.html:md5,1a4ec4897498d749656b1c20981c9280", + "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", + "Non_weightedHistogramReadlength.html:md5,f21a0bdea43b257af114f5cf49c621ae", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,891a512a4548b6a6769dbd6cdf8eebfe", + "WeightedHistogramReadlength.html:md5,7cdbd42a6a5c7f301d7efa2c90d7cf25", + "WeightedLogTransformed_HistogramReadlength.html:md5,8edcb5b145771e800d83907faec3856f", + "Yield_By_Length.html:md5,e0408e380facc2a8244dd02109b58a5c", + "NanoPlot-report.html:md5,3c208a5854f569b1d857fc40fba7ff12", + "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", + "Non_weightedHistogramReadlength.html:md5,29d9525765c2a0c09c49a55dcf44a5d8", + "Non_weightedLogTransformed_HistogramReadlength.html:md5,3603223b2830b812a1afccd394584c0c", + "WeightedHistogramReadlength.html:md5,87459824ab2e621005773a017e2d2b48", + "WeightedLogTransformed_HistogramReadlength.html:md5,84532a928821028e25d0a062b51b28dd", + "Yield_By_Length.html:md5,b6656f6281dcd250d60b36f05f2bab7f", "sample4.flagstat:md5,34e851b5504d961632f26991160ded5a", "sample4.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample4.stats:md5,dc8fec65923bf23826689ec1865f6fff", @@ -431,6 +745,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-11T15:36:10.03288147" + "timestamp": "2026-03-11T17:26:37.308380506" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 3892ba2f..a6973dbe 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -17,8 +17,9 @@ include { SAMTOOLS_CAT } from '../modules/nf-core/samtools/ include { MINIMAP2_INDEX } from '../modules/nf-core/minimap2/index/main' include { MINIMAP2_ALIGN } from '../modules/nf-core/minimap2/align/main' include { CRAMINO as CRAMINO_PRE } from '../modules/local/cramino/main' -include { CRAMINO as CRAMINO_PRE_REPLICATES } from '../modules/local/cramino/main' include { CRAMINO as CRAMINO_POST } from '../modules/local/cramino/main' +include { NANOPLOT as NANOPLOT_PRE } from '../modules/nf-core/nanoplot/main' +include { NANOPLOT as NANOPLOT_POST } from '../modules/nf-core/nanoplot/main' include { MOSDEPTH } from '../modules/nf-core/mosdepth/main' include { ASCAT } from '../modules/nf-core/ascat/main' include { SEVERUS } from '../modules/nf-core/severus/main.nf' @@ -153,11 +154,10 @@ workflow LRSOMATIC { downloaded_clair3_models = PREPARE_REFERENCE_FILES.out.downloaded_clair3_models - ch_samplesheet.view() - if (!params.skip_qc && !params.skip_cramino) { CRAMINO_PRE( ch_samplesheet ) + NANOPLOT_PRE(CRAMINO_PRE.out.arrow) } @@ -197,7 +197,6 @@ workflow LRSOMATIC { .mix ( ch_split.single ) .set { ch_cat_ubams } - ch_cat_ubams.view() // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] // bam: list of concatenated unaligned bams @@ -511,6 +510,7 @@ workflow LRSOMATIC { if (!params.skip_qc && !params.skip_cramino) { CRAMINO_POST ( ch_minimap_bam ) + NANOPLOT_POST(CRAMINO_POST.out.arrow) } From f224375677e6103a02030a0200ad02ecd1073168 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 19:37:05 +0100 Subject: [PATCH 094/183] severus fix and snapshot update --- modules.json | 116 +++++++++++++++------ modules/nf-core/severus/main.nf | 37 ++++--- modules/nf-core/severus/severus.diff | 56 ++++------ tests/default.nf.test.snap | 146 +++++++++++++++++++++++++-- 4 files changed, 265 insertions(+), 90 deletions(-) diff --git a/modules.json b/modules.json index 100cd8a1..d5dd45a2 100644 --- a/modules.json +++ b/modules.json @@ -8,129 +8,179 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": ["modules", "vcf_gather_bcftools"] + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ] }, "bcftools/merge": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/sort": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": ["modules", "vcf_gather_bcftools"], + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "90cdd21fd96ccbdb3bc90797ca69570d18391055", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "890fdcff71928fc1470d3e669d4c430c8c770297", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "5c9f8d5b7671237c906abadc9ff732b301ca15ca", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "14980f759266eec42dac401fcafeb83d6c957b41", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "3d81317a30d1016b533982d6b84df07713ae520a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "6832b69ef7f98c54876d6436360b6b945370c615", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "2c73cc8fa92cf48de3da0b643fdf357a8a290b36", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "f84336b7fa91a65aa61d215b8c109fbb8e4b4ac6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "f9edc59be2fe25bb6fc73ca4dfc0d28246f2a2d6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "b2e78932ef01165fd85829513eaca29eff8e640a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "447f7bc0fa41dfc2400c8cad4c0291880dc060cf", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -139,25 +189,33 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "7ac6cbe7c17c2dad685da7f70496c8f48ea48687", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index 628b5034..f191fd0b 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -12,21 +12,21 @@ process SEVERUS { tuple val(meta2), path(bed), path(pon_path) output: - tuple val(meta), path("severus.log") , emit: log - tuple val(meta), path("read_qual.txt") , emit: read_qual - tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double - tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true - tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true - tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true - tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("all_SVs/severus_all.vcf") , emit: all_vcf , optional: true - tuple val(meta), path("all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true - tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true - tuple val(meta), path("somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true - tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true + tuple val(meta), path("${prefix}/severus.log") , emit: log + tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual + tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double + tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true + tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions when: @@ -50,7 +50,12 @@ process SEVERUS { $pon \\ $control \\ $phasing_vcf \\ - --out-dir . + --out-dir ${prefix} + + bgzip ${prefix}/somatic_SVs/severus_somatic.vcf + tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz + bgzip ${prefix}/all_SVs/severus_all.vcf + tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/severus/severus.diff b/modules/nf-core/severus/severus.diff index 455c26e3..e3b73641 100644 --- a/modules/nf-core/severus/severus.diff +++ b/modules/nf-core/severus/severus.diff @@ -3,7 +3,7 @@ Changes in component 'nf-core/severus' Changes in 'severus/main.nf': --- modules/nf-core/severus/main.nf +++ modules/nf-core/severus/main.nf -@@ -8,25 +8,25 @@ +@@ -8,8 +8,8 @@ 'biocontainers/severus:1.6--pyhdfd78af_0' }" input: @@ -13,40 +13,22 @@ Changes in 'severus/main.nf': + tuple val(meta2), path(bed), path(pon_path) output: -- tuple val(meta), path("${prefix}/severus.log") , emit: log -- tuple val(meta), path("${prefix}/read_qual.txt") , emit: read_qual -- tuple val(meta), path("${prefix}/breakpoints_double.csv") , emit: breakpoints_double -- tuple val(meta), path("${prefix}/read_alignments") , emit: read_alignments , optional: true -- tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true -- tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true -- tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true + tuple val(meta), path("${prefix}/severus.log") , emit: log +@@ -19,11 +19,11 @@ + tuple val(meta), path("${prefix}/read_ids.csv") , emit: read_ids , optional: true + tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true + tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true - tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf") , emit: all_vcf , optional: true -- tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true -- tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true -- tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true ++ tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true -- tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true -- tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true -- tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true -+ tuple val(meta), path("severus.log") , emit: log -+ tuple val(meta), path("read_qual.txt") , emit: read_qual -+ tuple val(meta), path("breakpoints_double.csv") , emit: breakpoints_double -+ tuple val(meta), path("read_alignments") , emit: read_alignments , optional: true -+ tuple val(meta), path("read_ids.csv") , emit: read_ids , optional: true -+ tuple val(meta), path("severus_collaped_dup.bed") , emit: collapsed_dup , optional: true -+ tuple val(meta), path("severus_LOH.bed") , emit: loh , optional: true -+ tuple val(meta), path("all_SVs/severus_all.vcf") , emit: all_vcf , optional: true -+ tuple val(meta), path("all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true -+ tuple val(meta), path("all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true -+ tuple val(meta), path("all_SVs/plots/severus_*.html") , emit: all_plots , optional: true -+ tuple val(meta), path("somatic_SVs/severus_somatic.vcf") , emit: somatic_vcf , optional: true -+ tuple val(meta), path("somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true -+ tuple val(meta), path("somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true -+ tuple val(meta), path("somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true - path "versions.yml" , emit: versions - - when: -@@ -39,15 +39,18 @@ ++ tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true +@@ -39,15 +39,23 @@ def control = control_input ? "--control-bam ${control_input}" : "" def vntr_bed = bed ? "--vntr-bed ${bed}" : "" def phasing_vcf = vcf ? "--phasing-vcf ${vcf}" : "" @@ -61,8 +43,12 @@ Changes in 'severus/main.nf': + $pon \\ $control \\ $phasing_vcf \\ -- --out-dir ${prefix} -+ --out-dir . + --out-dir ${prefix} ++ ++ bgzip ${prefix}/somatic_SVs/severus_somatic.vcf ++ tabix -p vcf ${prefix}/somatic_SVs/severus_somatic.vcf.gz ++ bgzip ${prefix}/all_SVs/severus_all.vcf ++ tabix -p vcf ${prefix}/all_SVs/severus_all.vcf.gz cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 6a1cd3ce..825e483d 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -24,7 +24,8 @@ "cramino": "1.3.0" }, "GERMLINE_VEP": { - "ensemblvep": 114.2, + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, "tabix": 1.21 }, "LONGPHASE_HAPLOTAG": { @@ -38,12 +39,14 @@ "samtools": 1.21 }, "MINIMAP2_ALIGN": { - "minimap2": "2.29-r1283", - "samtools": 1.21 + "minimap2": "2.29-r1283" }, "MOSDEPTH": { "mosdepth": "0.3.11" }, + "SAMTOOLS_CAT": { + "samtools": "1.22.1" + }, "SAMTOOLS_FAIDX": { "samtools": "1.22.1" }, @@ -63,11 +66,13 @@ "severus": 1.6 }, "SOMATIC_VEP": { - "ensemblvep": 114.2, + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, "tabix": 1.21 }, "SV_VEP": { - "ensemblvep": 114.2, + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, "tabix": 1.21 }, "UNTAR": { @@ -100,21 +105,64 @@ "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", + "multiqc/multiqc_data/samtools-flagstat-table.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", "multiqc/multiqc_plots", "multiqc/multiqc_plots/pdf", "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", "multiqc/multiqc_plots/png", "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", + "multiqc/multiqc_plots/png/samtools-flagstat-table.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-stats-dp.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", "multiqc/multiqc_plots/svg", "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", "multiqc/multiqc_report.html", "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", @@ -290,7 +338,69 @@ "sample3/vep/somatic", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html", + "sample4", + "sample4/bamfiles", + "sample4/bamfiles/sample4_normal.bam", + "sample4/bamfiles/sample4_normal.bam.bai", + "sample4/bamfiles/sample4_tumor.bam", + "sample4/bamfiles/sample4_tumor.bam.bai", + "sample4/qc", + "sample4/qc/normal", + "sample4/qc/normal/cramino_aln", + "sample4/qc/normal/cramino_aln/sample4_cramino.txt", + "sample4/qc/normal/cramino_ubam", + "sample4/qc/normal/cramino_ubam/sample4_cramino.txt", + "sample4/qc/normal/mosdepth", + "sample4/qc/normal/mosdepth/sample4.mosdepth.global.dist.txt", + "sample4/qc/normal/mosdepth/sample4.mosdepth.summary.txt", + "sample4/qc/normal/samtools", + "sample4/qc/normal/samtools/sample4.flagstat", + "sample4/qc/normal/samtools/sample4.idxstats", + "sample4/qc/normal/samtools/sample4.stats", + "sample4/qc/tumor", + "sample4/qc/tumor/cramino_aln", + "sample4/qc/tumor/cramino_aln/sample4_cramino.txt", + "sample4/qc/tumor/cramino_ubam", + "sample4/qc/tumor/cramino_ubam/sample4_cramino.txt", + "sample4/qc/tumor/mosdepth", + "sample4/qc/tumor/mosdepth/sample4.mosdepth.global.dist.txt", + "sample4/qc/tumor/mosdepth/sample4.mosdepth.summary.txt", + "sample4/qc/tumor/samtools", + "sample4/qc/tumor/samtools/sample4.flagstat", + "sample4/qc/tumor/samtools/sample4.idxstats", + "sample4/qc/tumor/samtools/sample4.stats", + "sample4/variants", + "sample4/variants/clair3", + "sample4/variants/clair3/merge_output.vcf.gz", + "sample4/variants/clair3/merge_output.vcf.gz.tbi", + "sample4/variants/clairs", + "sample4/variants/clairs/indel.vcf.gz", + "sample4/variants/clairs/indel.vcf.gz.tbi", + "sample4/variants/clairs/snvs.vcf.gz", + "sample4/variants/clairs/snvs.vcf.gz.tbi", + "sample4/variants/severus", + "sample4/variants/severus/all_SVs", + "sample4/variants/severus/all_SVs/severus_all.vcf.gz", + "sample4/variants/severus/breakpoints_double.csv", + "sample4/variants/severus/read_ids.csv", + "sample4/variants/severus/read_qual.txt", + "sample4/variants/severus/severus.log", + "sample4/variants/severus/somatic_SVs", + "sample4/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample4/vep", + "sample4/vep/SVs", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz.tbi", + "sample4/vep/SVs/sample4_SV_VEP.vcf.gz_summary.html", + "sample4/vep/germline", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz.tbi", + "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz_summary.html", + "sample4/vep/somatic", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz.tbi", + "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz_summary.html" ], [ "sample1_normal.bam:md5,60838033f5f24aa90e16a5babcddd45b", @@ -333,13 +443,29 @@ "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f", "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813" + "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", + "sample4_normal.bam:md5,1244bbb36a3fd5921f50eaa1933221d9", + "sample4_normal.bam.bai:md5,b5781f18020f89190768cc79cc15bfc9", + "sample4_tumor.bam:md5,f177881083a1dc6918c8206fd1125850", + "sample4_tumor.bam.bai:md5,4b60c72c6e9bce15010a029d854bb5b9", + "sample4.mosdepth.global.dist.txt:md5,431a1e9eb9e396ac0a5a9d8c1cbbc4be", + "sample4.mosdepth.summary.txt:md5,37c50bb51cff8d0a05d55c44bbecfac8", + "sample4.flagstat:md5,0324d26e70952dc7d7525b9b2b3397af", + "sample4.idxstats:md5,a4f00d06210fa9cae6664f4326fe3c61", + "sample4.stats:md5,98260d38e8dd9c4e3a9ef56c15e4e600", + "sample4.mosdepth.global.dist.txt:md5,3830fc5e90f49c2a87b12db0cb327e83", + "sample4.mosdepth.summary.txt:md5,c37156c0a4cfd888069d7af46c59adfc", + "sample4.flagstat:md5,c129f6e33ad95e7e46a3e49b7ef382ce", + "sample4.idxstats:md5,a03565b3c0a3ad7033c4ecd1ba742a8b", + "sample4.stats:md5,1f9d1370ccd44dc1239468d98982d84f", + "breakpoints_double.csv:md5,319b8e3bdfbec8339a8c6f1ceb4384a5", + "read_qual.txt:md5,6c47ff1f1adacd44fa4822c8237c92ac" ] ], "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2026-01-09T17:08:56.493545818" + "timestamp": "2026-03-11T19:35:17.289539787" } } \ No newline at end of file From 678ee267e03c41603f3a53cae0bf4669f4e7fbb0 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Wed, 11 Mar 2026 19:40:21 +0100 Subject: [PATCH 095/183] precommit --- modules.json | 116 +++++++++++++-------------------------------------- 1 file changed, 29 insertions(+), 87 deletions(-) diff --git a/modules.json b/modules.json index d5dd45a2..100cd8a1 100644 --- a/modules.json +++ b/modules.json @@ -8,179 +8,129 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/concat": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ] + "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/merge": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ], + "installed_by": ["modules", "vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "90cdd21fd96ccbdb3bc90797ca69570d18391055", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "890fdcff71928fc1470d3e669d4c430c8c770297", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "5c9f8d5b7671237c906abadc9ff732b301ca15ca", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "14980f759266eec42dac401fcafeb83d6c957b41", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "3d81317a30d1016b533982d6b84df07713ae520a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "6832b69ef7f98c54876d6436360b6b945370c615", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "2c73cc8fa92cf48de3da0b643fdf357a8a290b36", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "f84336b7fa91a65aa61d215b8c109fbb8e4b4ac6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "f9edc59be2fe25bb6fc73ca4dfc0d28246f2a2d6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "b2e78932ef01165fd85829513eaca29eff8e640a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "447f7bc0fa41dfc2400c8cad4c0291880dc060cf", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -189,33 +139,25 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "7ac6cbe7c17c2dad685da7f70496c8f48ea48687", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From 87ff70266e8018535eaa37964023541c73731771 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 12 Mar 2026 10:37:05 +0100 Subject: [PATCH 096/183] update documentation and schema --- docs/usage.md | 1 + nextflow_schema.json | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index 448cf7d3..9331982d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -117,6 +117,7 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c | `--skip_bamstats` | A boolean to skip `bamstats`. Default = `false` | | `--skip_wakhan` | A boolean to skip `wakhan`. Default = `false` | | `--skip_vep` | A boolean to skip `vep`. Default = `false` | +| `--skip_m6a` | A boolean to skip `fibertools_m6a`, used if you have m6a calls but would still like nucleosome positions for PacBio data (ONT data is required to have m6a calls). Default = `false` | #### VEP options: diff --git a/nextflow_schema.json b/nextflow_schema.json index 23fa710a..4f0f4ce0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -206,6 +206,10 @@ "skip_ascat": { "type": "boolean", "description": "Skip ASCAT" + }, + "skip_m6a": { + "type": "boolean", + "description": "Skip m6a calling by Fibertools" } } }, @@ -371,6 +375,7 @@ "type": "boolean", "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } + } } }, From 36c449d21b39cea9246417c331af59174091f992 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 10:41:38 +0100 Subject: [PATCH 097/183] add publishdir for phase variants --- conf/modules.config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index ce3ec749..c8e21783 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -197,10 +197,11 @@ process { ].join(' ').trim() } publishDir = [ - enabled: false + path: { "${params.outdir}/${meta.id}/variants/phased" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:LONGPHASE_HAPLOTAG' { ext.prefix = { "${meta.id}_${meta.type}" } publishDir = [ From 1a6309c3ed4641aa7bb2dc9e43fcb12ce8d8a317 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 10:54:51 +0100 Subject: [PATCH 098/183] Add compact inline channel structure comments to key workflow files Document tuple structures for all major channels in lrsomatic.nf, tumor_normal_happhase.nf, tumor_only_happhase.nf, and prepare_reference_files.nf using [meta, elem1, elem2] style comments. Replaces verbose multi-line comments with consistent single-line format and fixes one mislabelled comment (tumor_bams_phasedvcf was labelled as tumor_bams_germlinevcf). Co-Authored-By: Claude Sonnet 4.6 --- subworkflows/local/prepare_reference_files.nf | 12 +++- subworkflows/local/tumor_normal_happhase.nf | 60 ++++--------------- subworkflows/local/tumor_only_happhase.nf | 38 +++--------- workflows/lrsomatic.nf | 31 +++++----- 4 files changed, 44 insertions(+), 97 deletions(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index f2fbb00b..324815e2 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -38,6 +38,7 @@ workflow PREPARE_REFERENCE_FILES { } else { ch_prepared_fasta = [ [:], fasta ] } + // ch_prepared_fasta: [[:], fasta_path] -- empty meta; uncompressed if input was .gz // if clair3 model is specified, then download that // otherwise use info in bam header and download that @@ -52,6 +53,7 @@ workflow PREPARE_REFERENCE_FILES { } .unique() .set{ clair3_model_urls } + // [meta(id=clair3_model_id), download_url] -- one item per unique Clair3 model; deduplicated with .unique() // // MODULE: Download model @@ -70,6 +72,7 @@ workflow PREPARE_REFERENCE_FILES { ) UNTAR.out.untar.set { downloaded_clair3_models } + // [meta(id=clair3_model_id), model_dir] -- extracted Clair3 model directory // // MODULE: Index the fasta @@ -80,6 +83,7 @@ workflow PREPARE_REFERENCE_FILES { ) ch_prepared_fai = SAMTOOLS_FAIDX.out.fai + // ch_prepared_fai: [[:], fai_path] -- empty meta // // Prepare ASCAT files @@ -117,14 +121,16 @@ workflow PREPARE_REFERENCE_FILES { } emit: - prepped_fasta = ch_prepared_fasta - prepped_fai = ch_prepared_fai + prepped_fasta = ch_prepared_fasta // [[:], fasta_path] + prepped_fai = ch_prepared_fai // [[:], fai_path] + // ASCAT reference files -- flat file collections (no meta tuple wrapper) allele_files loci_files gc_file rt_file - downloaded_clair3_models + + downloaded_clair3_models // [meta(id=clair3_model_id), model_dir] versions = ch_versions } diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 6abe9941..20499c5b 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -52,6 +52,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ new_meta, meta.clair3_model, bam, bai ] } .set { normal_bams_model } + // [clair3_model_id, meta, bam, bai] -- keyed by model ID for .combine() with downloaded_clair3_models normal_bams_model .combine(downloaded_clair3_models,by:1) @@ -60,6 +61,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta_bam, bam, bai, model, platform] } .set{ normal_bams } + // [meta, bam, bai, clair3_model_dir, platform] -- type excluded from meta; platform is "hifi" for PacBio /* .map{ basecall_model, meta, bam, bai, meta2, model -> @@ -68,13 +70,6 @@ workflow TUMOR_NORMAL_HAPPHASE { } */ - // normal_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bai: indexes for bam files - // clair3_model: clair3 model name - // platform: name of sequencing platform - - // Get tumour bams // remove type from so that information can be merged easier later mixed_bams.tumor @@ -91,10 +86,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return[new_meta, bam, bai] } .set{ tumor_bams } - - // tumor_bams -> meta: [id, paired_data, platform, sex, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bai: indexes for bam files + // [meta, bam, bai] -- type excluded from meta for downstream groupTuple merge // // MODULE: CLAIR3 @@ -117,13 +109,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, bam, bai, vcf, svs, mods] } .set{ normal_bams_germlinevcf } - - // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bai: indexes for bam files - // vcf: normal small germline variant vcf - // svs: structural variant vcf (empty) - // mods: modcall-generated VCF with modifications (empty) + // [meta, bam, bai, germline_vcf, [], []] -- svs and mods are empty placeholders for LONGPHASE_PHASE input CLAIR3.out.vcf .map { meta, vcf -> @@ -131,6 +117,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, vcf, extra] } .set { germline_vep } + // [meta, clair3_vcf, []] -- germline small variants for VEP annotation // // MODULE: LONGPHASE_PHASE @@ -158,14 +145,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return[new_meta, bam, bai, vcf, svs, mods] } .set{ normal_bams } - - // normal_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bai: indexes for bam files - // vcf: normal small germline variant vcf - // svs: structural variant vcf (empty) - // mods: modcall-generated VCF with modifications (empty) - + // [meta+{type:"normal"}, bam, bai, phased_vcf, [], []] -- type re-added; svs and mods are empty placeholders for LONGPHASE_HAPLOTAG // Add phased vcf to tumour bams and type information // mix with the normal bams @@ -180,13 +160,7 @@ workflow TUMOR_NORMAL_HAPPHASE { } .mix(normal_bams) .set{ mixed_bams_vcf } - - // mixed_bams_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bai: indexes for bam files - // vcf: normal small germline variant vcf - // svs: structural variant vcf (empty) - // mods: modcall-generated VCF with modifications (empty) + // [meta+{type}, bam, bai, phased_normal_vcf, [], []] -- tumor and normal items both carry the same phased normal VCF // // MODULE: LONGPHASE_HAPLOTAG @@ -204,10 +178,7 @@ workflow TUMOR_NORMAL_HAPPHASE { // Get final tagged bams LONGPHASE_HAPLOTAG.out.bam .set{ mixed_hapbams } - - // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bams: haplotagged aligned bams - + // [meta+{type}, haplotagged_bam] // // MODULE: SAMTOOLS_INDEX @@ -223,9 +194,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(mixed_hapbams) .join(SAMTOOLS_INDEX.out.bai) .set{ mixed_hapbams } - // mixed_hapbams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bams: haplotagged aligned bams - // bais: indexes for bam files + // [meta+{type}, orig_bam, orig_bai, vcf, svs, mods, hapbam, hapbai] // Group everything back together in one channel mixed_hapbams @@ -253,13 +222,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .join(LONGPHASE_PHASE.out.snv_vcf) .join(LONGPHASE_PHASE.out.snv_vcf_index) .set{tumor_normal_severus} - // tumor_normal_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] - // tumor_bam: haplotagged aligned bam for tumor - // tumor_bai: indexes for tumor bam files - // normal_bam: haplotagged aligned bam files for normal - // normal_bai: indexes for normal bam files - // phased_vcf: phased small variant vcf for normal - // phased_vcf_index: phased small variant vcf index for normal + // [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, phased_vcf, phased_tbi] // Get ClairS input channel tumor_normal_severus @@ -267,6 +230,8 @@ workflow TUMOR_NORMAL_HAPPHASE { return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] } .set { clairs_input } + // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, clairS_model] + // // MODULE: CLAIRS // @@ -303,6 +268,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [meta, vcf, extra] } .set { somatic_vep } + // [meta, sorted_clairs_vcf, []] -- somatic small variants (SNV+indel merged) for VEP annotation emit: tumor_normal_severus diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 2e09f750..2b8b3b75 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -27,6 +27,7 @@ workflow TUMOR_ONLY_HAPPHASE { return [meta, bam, bai, meta.clairSTO_model] } .set{ tumor_bams } + // [meta, bam, bai, clairSTO_model] -- ClairS-TO model string appended for CLAIRSTO input // // MODULE: CLAIRSTO @@ -47,10 +48,7 @@ workflow TUMOR_ONLY_HAPPHASE { CLAIRSTO.out.indel_vcf .join(CLAIRSTO.out.snv_vcf) .set{ clairsto_vcf } - - // clairsto_vcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // indel_vcf: vcf for indels - // snv_vcf: vcf for snvs + // [meta, indel_vcf, snv_vcf] -- raw ClairS-TO variant calls // // MODULE: VCFSPLIT @@ -72,7 +70,7 @@ workflow TUMOR_ONLY_HAPPHASE { return[meta, bam, bai, snps, svs, mods] } .set{ tumor_bams_germlinevcf } - + // [meta, bam, bai, nonsomatic_vcf, [], []] -- non-somatic variants used for phasing; svs and mods are empty placeholders for LONGPHASE_PHASE input VCFSPLIT.out.somatic_vcf .map { meta, vcf -> @@ -80,6 +78,7 @@ workflow TUMOR_ONLY_HAPPHASE { return [meta,vcf, extra] } .set { somatic_vep } + // [meta, somatic_vcf, []] -- PASS (somatic) variants for VEP annotation VCFSPLIT.out.germline_vcf .map { meta, vcf -> @@ -87,13 +86,7 @@ workflow TUMOR_ONLY_HAPPHASE { return [meta,vcf, extra] } .set { germline_vep } - - // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bai: indexes for bam files - // vcf: tumor small nonsomatic variant vcf - // svs: structural variant vcf (empty) - // mods: modcall-generated VCF with modifications (empty) + // [meta, germline_vcf, []] -- non-somatic variants (relabelled PASS) for VEP annotation // // MODULES: LONGPHASE_PHASE @@ -118,13 +111,7 @@ workflow TUMOR_ONLY_HAPPHASE { return [new_meta, bam, bai, vcf, svs, mods] } .set{ tumor_bams_phasedvcf } - - // tumor_bams_germlinevcf -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bai: indexes for bam files - // vcf: phased tumor small nonsomatic variant vcf - // svs: structural variant vcf (empty) - // mods: modcall-generated VCF with modifications (empty) + // [meta+{type:"tumor"}, bam, bai, phased_nonsomatic_vcf, [], []] -- type added; svs and mods are empty placeholders for LONGPHASE_HAPLOTAG // // MODULES: LONGPHASE_HAPLOTAG @@ -142,9 +129,7 @@ workflow TUMOR_ONLY_HAPPHASE { // grab phased bams LONGPHASE_HAPLOTAG.out.bam .set{ haplotagged_bams } - - // haplotagged_bams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bams: list of concatenated aligned bams + // [meta+{type:"tumor"}, haplotagged_bam] // // MODULES: SAMTOOLS_INDEX @@ -172,14 +157,7 @@ workflow TUMOR_ONLY_HAPPHASE { return [new_meta, hap_bam, hap_bai, [], [], vcf, tbi] } .set{ tumor_only_severus } - - // tumor_only_severus -> meta: [id, paired_data, platform, sex, fiber, basecall_model] - // hap_bam: haplotagged aligned bam for tumor - // hap_bai: indexes for tumor bam files - // normal_bam: haplotagged aligned bam files for normal (empty) - // normal_bai: indexes for normal bam files (empty) - // phased_vcf: phased small variant vcf - // tbi: index for phased small variant vcf + // [meta, hap_bam, hap_bai, [], [], phased_vcf, phased_tbi] -- normal_bam and normal_bai are [] (tumor-only mode) emit: tumor_only_severus diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index b7c377a3..235189bb 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -107,6 +107,7 @@ workflow LRSOMATIC { METAEXTRACT( ch_samplesheet ) basecall_meta = METAEXTRACT.out.meta_ext + // [meta, basecall_model_str, kinetics_str] -- basecall model and kinetics extracted from BAM header // Adds the base calling model to meta.basecall_model ch_samplesheet @@ -132,6 +133,7 @@ workflow LRSOMATIC { [ meta, bam.flatten()] } .set{ch_samplesheet} + // [meta_full, [bam...]] -- meta now includes: id, paired_data, type, platform, sex, fiber, clair3_model, clairS_model, clairSTO_model, kinetics // @@ -150,10 +152,6 @@ workflow LRSOMATIC { downloaded_clair3_models = PREPARE_REFERENCE_FILES.out.downloaded_clair3_models - - // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of unaligned bams - ch_split = ch_samplesheet .branch { _meta, bam -> single: bam.size() == 1 @@ -169,9 +167,7 @@ workflow LRSOMATIC { .bam .mix ( ch_split.single ) .set { ch_cat_ubams } - - // ch_cat_ubams -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of concatenated unaligned bams + // [meta, bam] -- single merged unaligned BAM per sample // // MODULE: CRAMINO @@ -316,6 +312,7 @@ workflow LRSOMATIC { // MODULE: MINIMAP2_ALIGN // // Aligns ubams + // ch_cat_ubams: [meta, bam] -- may include m6A/nucleosome/FIRE annotations for fiber-seq samples MINIMAP2_ALIGN ( ch_cat_ubams, @@ -327,10 +324,7 @@ workflow LRSOMATIC { ) MINIMAP2_ALIGN.out.bam .set { ch_minimap_bam } - - - // ch_minimap_bams -> meta: [id, paired_data, platform, sex, type, fiber,basecall_model] - // bam: list of concatenated aligned bams + // [meta, bam] -- aligned BAM // ch_minimap_bams into tumor and paired to phase the paired ones on normal // and add index @@ -342,11 +336,8 @@ workflow LRSOMATIC { tumor_only: !meta.paired_data } .set { branched_minimap } - - - // branched_minimap -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of concatenated aligned bams - // bais: indexes for bam files + // branched_minimap.paired: [meta, bam, bai] -- one item per sample (tumor AND normal flow separately) + // branched_minimap.tumor_only: [meta, bam, bai] // // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE @@ -383,7 +374,9 @@ workflow LRSOMATIC { ) germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) + // [meta, vcf, []] -- germline variants merged from T/N and tumor-only paths somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) + // [meta, vcf, []] -- somatic variants merged from T/N and tumor-only paths if (!params.skip_vep) { // @@ -437,7 +430,7 @@ workflow LRSOMATIC { return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi] } .set { severus_reformat } - // Format is [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, vcf] + // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, phased_tbi] -- normal_bam/bai are [] for tumor-only // // MODULE: SEVERUS @@ -456,6 +449,7 @@ workflow LRSOMATIC { return [meta, vcf, extra] } .set { sv_vep } + // [meta, severus_all_vcf, []] -- all SVs for VEP annotation if(!params.skip_vep) { SV_VEP ( @@ -494,6 +488,7 @@ workflow LRSOMATIC { ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) .map { meta, bam, bai -> [meta, bam, bai, []] } .set { ch_mosdepth_in } + // [meta, bam, bai, []] -- [] is the required empty BED path for MOSDEPTH MOSDEPTH ( ch_mosdepth_in, @@ -533,6 +528,7 @@ workflow LRSOMATIC { return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } + // [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] -- NOTE: normal before tumor (ASCAT convention) ASCAT ( ascat_ch, @@ -558,6 +554,7 @@ workflow LRSOMATIC { severus_reformat .join(SEVERUS.out.all_vcf) .set { wakhan_input } + // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, phased_tbi, severus_all_vcf] WAKHAN ( wakhan_input, From 4ed2758161278515a21c818a0c81e6d6927c8581 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 11:11:40 +0100 Subject: [PATCH 099/183] added citations and VEP docs --- CITATIONS.md | 4 ++++ README.md | 8 +++++++- docs/usage.md | 26 ++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/CITATIONS.md b/CITATIONS.md index 19daeb37..ba7be251 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -8,6 +8,10 @@ > Di Tommaso P, Chatzou M, Floden EW, Barja PP, Palumbo E, Notredame C. Nextflow enables reproducible computational workflows. Nat Biotechnol. 2017 Apr 11;35(4):316-319. doi: 10.1038/nbt.3820. PubMed PMID: 28398311. +## [LRSomatic](https://doi.org/10.64898/2026.02.26.707772) + +> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Lucía Rocha Iraizós, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772 + ## Pipeline tools - [ASCAT](https://pubmed.ncbi.nlm.nih.gov/20837533/) diff --git a/README.md b/README.md index 54d7c9a4..95e7e9e2 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,13 @@ If you would like to contribute to this pipeline, please see the [contributing g ## Citations -If you use IntGenomicsLab/lrsomatic for your analysis, please cite it using the following doi: [10.5281/zenodo.17751829](https://doi.org/10.5281/zenodo.17751829) +If you use `IntGenomicsLab/lrsomatic` for your analysis, please cite it using the following: + +> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data +> +> Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Lucía Rocha Iraizós, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester +> +> bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772 An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/docs/usage.md b/docs/usage.md index 448cf7d3..61713794 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -97,6 +97,32 @@ genome: 'GRCh37' You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +## CHM13 Support + +Our pipeline supports fully supports CHM13 and most reference and annotation files are automatically downloaded when specifiying `--genome CHM13`. + +However, VEP will need a bit of additional setup. The VEP cache for CHM13 needs to be manually downloaded. This can be done using the following code. Feel free to change any of the paths, ensuring that the correct path is pointed to in the pipeline parameters. + +Download CHM13 Cache: +```bash +cd $HOME/.vep +curl -O https://ftp.ensembl.org/pub/rapid-release/species/Homo_sapiens/GCA_009914755.4/ensembl/variation/2022_10/indexed_vep_cache/Homo_sapiens-GCA_009914755.4-2022_10.tar.gz +tar xzf Homo_sapiens-GCA_009914755.4-2022_10.tar.gz +``` + +Then you can run the pipeline as follows: +```bash +nextflow run IntGenomicsLab/lrsomatic \ + --input samplesheet.csv \ + --outdir ./results \ + --genome CHM13 \ + --vep_cache $HOME/.vep \ + --vep_cache_version 107 \ + -profile docker +``` + +If you do not specify `CHM13` with `--genome CHM13` you additionally need to specify `--vep_genome T2T-CHM13v2.0` and `--vep_species homo_sapiens_gca009914755v4`. + ### Pipeline options | Parameter | Description | From 6827e2a88f84f5ec0c3de3392ec26588ca6a91bf Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 11:12:23 +0100 Subject: [PATCH 100/183] typo --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 61713794..5489b0c7 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -99,7 +99,7 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c ## CHM13 Support -Our pipeline supports fully supports CHM13 and most reference and annotation files are automatically downloaded when specifiying `--genome CHM13`. +Our pipeline fully supports CHM13 and most reference and annotation files are automatically downloaded when specifiying `--genome CHM13`. However, VEP will need a bit of additional setup. The VEP cache for CHM13 needs to be manually downloaded. This can be done using the following code. Feel free to change any of the paths, ensuring that the correct path is pointed to in the pipeline parameters. From 12364e49749c4476744fc55ceb2bc8411c805deb Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 11:12:33 +0100 Subject: [PATCH 101/183] linting --- CITATIONS.md | 2 +- README.md | 6 +++--- docs/usage.md | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index ba7be251..4c6d6a85 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,7 +10,7 @@ ## [LRSomatic](https://doi.org/10.64898/2026.02.26.707772) -> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Lucía Rocha Iraizós, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772 +> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Lucía Rocha Iraizós, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772 ## Pipeline tools diff --git a/README.md b/README.md index 95e7e9e2..73499bb2 100644 --- a/README.md +++ b/README.md @@ -164,11 +164,11 @@ If you would like to contribute to this pipeline, please see the [contributing g If you use `IntGenomicsLab/lrsomatic` for your analysis, please cite it using the following: -> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data -> +> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data +> > Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Lucía Rocha Iraizós, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester > -> bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772 +> bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772 An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. diff --git a/docs/usage.md b/docs/usage.md index 5489b0c7..d8060204 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -99,11 +99,12 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c ## CHM13 Support -Our pipeline fully supports CHM13 and most reference and annotation files are automatically downloaded when specifiying `--genome CHM13`. +Our pipeline fully supports CHM13 and most reference and annotation files are automatically downloaded when specifiying `--genome CHM13`. However, VEP will need a bit of additional setup. The VEP cache for CHM13 needs to be manually downloaded. This can be done using the following code. Feel free to change any of the paths, ensuring that the correct path is pointed to in the pipeline parameters. Download CHM13 Cache: + ```bash cd $HOME/.vep curl -O https://ftp.ensembl.org/pub/rapid-release/species/Homo_sapiens/GCA_009914755.4/ensembl/variation/2022_10/indexed_vep_cache/Homo_sapiens-GCA_009914755.4-2022_10.tar.gz @@ -111,6 +112,7 @@ tar xzf Homo_sapiens-GCA_009914755.4-2022_10.tar.gz ``` Then you can run the pipeline as follows: + ```bash nextflow run IntGenomicsLab/lrsomatic \ --input samplesheet.csv \ @@ -121,7 +123,7 @@ nextflow run IntGenomicsLab/lrsomatic \ -profile docker ``` -If you do not specify `CHM13` with `--genome CHM13` you additionally need to specify `--vep_genome T2T-CHM13v2.0` and `--vep_species homo_sapiens_gca009914755v4`. +If you do not specify `CHM13` with `--genome CHM13` you additionally need to specify `--vep_genome T2T-CHM13v2.0` and `--vep_species homo_sapiens_gca009914755v4`. ### Pipeline options From 07874f12ef9846943a19506df8aae058f7c1cae9 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 12 Mar 2026 11:27:01 +0100 Subject: [PATCH 102/183] prettier --- docs/usage.md | 22 +++++++++++----------- nextflow_schema.json | 1 - 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 9331982d..a89cccf3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -107,17 +107,17 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c #### Skipping options: -| Parameter | Description | -| ----------------- | ----------------------------------------------------------------------------------------------------------- | -| `--skip_qc` | A boolean to skip all QC steps, including `mosdepth`, `samtools`,`fibertools`, `cramino`. Default = `false` | -| `--skip_fiber` | A boolean to skip all `fibertools` related modules. Default = `false` | -| `--skip_cramino` | A boolean to skip `cramino`. Default = `false` | -| `--skip_mosdepth` | A boolean to skip `mosdepth`. Default = `false` | -| `--skip_ascat` | A boolean to skip `ascat`. Default = `false` | -| `--skip_bamstats` | A boolean to skip `bamstats`. Default = `false` | -| `--skip_wakhan` | A boolean to skip `wakhan`. Default = `false` | -| `--skip_vep` | A boolean to skip `vep`. Default = `false` | -| `--skip_m6a` | A boolean to skip `fibertools_m6a`, used if you have m6a calls but would still like nucleosome positions for PacBio data (ONT data is required to have m6a calls). Default = `false` | +| Parameter | Description | +| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `--skip_qc` | A boolean to skip all QC steps, including `mosdepth`, `samtools`,`fibertools`, `cramino`. Default = `false` | +| `--skip_fiber` | A boolean to skip all `fibertools` related modules. Default = `false` | +| `--skip_cramino` | A boolean to skip `cramino`. Default = `false` | +| `--skip_mosdepth` | A boolean to skip `mosdepth`. Default = `false` | +| `--skip_ascat` | A boolean to skip `ascat`. Default = `false` | +| `--skip_bamstats` | A boolean to skip `bamstats`. Default = `false` | +| `--skip_wakhan` | A boolean to skip `wakhan`. Default = `false` | +| `--skip_vep` | A boolean to skip `vep`. Default = `false` | +| `--skip_m6a` | A boolean to skip `fibertools_m6a`, used if you have m6a calls but would still like nucleosome positions for PacBio data (ONT data is required to have m6a calls). Default = `false` | #### VEP options: diff --git a/nextflow_schema.json b/nextflow_schema.json index 4f0f4ce0..0680cc6d 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -375,7 +375,6 @@ "type": "boolean", "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } - } } }, From 8f2a771bdc29305f68e9e13fb3852eab6f1c83a9 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 11:29:27 +0100 Subject: [PATCH 103/183] renamed phased variants output --- conf/modules.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/modules.config b/conf/modules.config index c8e21783..6da3b605 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -190,6 +190,7 @@ process { // withName: '.*:LONGPHASE_PHASE' { + ext.prefix = { "somatic_smallvariants" } ext.args = { [ meta.platform == 'pb' ? '--pb' : '--ont', From c83118da83563ec5189a906d90d1f519e92d3390 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 13:02:50 +0100 Subject: [PATCH 104/183] add space --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 298a93b6..90e44df8 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -253,7 +253,7 @@ workflow LRSOMATIC { } .set{pacbio_bams} - if (!params.skip_m6a){ + if (!params.skip_m6a) { FIBERTOOLSRS_PREDICTM6A ( pacbio_bams.kinetics ) From 963eb88f6248c26a49cfb5014309ca72466335c5 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 12 Mar 2026 13:47:46 +0100 Subject: [PATCH 105/183] update snapshot + nftignore --- tests/.nftignore | 5 +- tests/default.nf.test.snap | 386 +++++-------------------------------- 2 files changed, 47 insertions(+), 344 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index 9651e78a..3d5f461f 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -17,4 +17,7 @@ pipeline_info/*.{html,json,txt,yml} */variants/severus/read_ids.csv */variants/severus/severus.log */variants/severus/{all_SVs,somatic_SVs}/*.{vcf.gz,vcf.gz.tbi} -*/qc/{tumor,normal}/{cramino_ubam,cramino_aln}/*_cramino.txt +*/qc/{tumor,normal}/{cramino_aln}/*_cramino.txt +*/qc/{tumor,normal}/{cramino_ubam}_*/*_cramino.txt +*/qc/{tumor,normal}/{nanoplot_ubam}_*/*.html +*/qc/{tumor,normal}/{nanoplot_alt}/*.html \ No newline at end of file diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 61a69eee..7038227c 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -440,356 +440,56 @@ "sample3/vep/somatic", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html", - "sample4", - "sample4/bamfiles", - "sample4/bamfiles/sample4_normal.bam", - "sample4/bamfiles/sample4_normal.bam.bai", - "sample4/bamfiles/sample4_tumor.bam", - "sample4/bamfiles/sample4_tumor.bam.bai", - "sample4/qc", - "sample4/qc/normal", - "sample4/qc/normal/cramino_aln", - "sample4/qc/normal/cramino_aln/sample4.arrow", - "sample4/qc/normal/cramino_aln/sample4_cramino.txt", - "sample4/qc/normal/cramino_ubam_1", - "sample4/qc/normal/cramino_ubam_1/sample4.arrow", - "sample4/qc/normal/cramino_ubam_1/sample4_cramino.txt", - "sample4/qc/normal/cramino_ubam_2", - "sample4/qc/normal/cramino_ubam_2/sample4.arrow", - "sample4/qc/normal/cramino_ubam_2/sample4_cramino.txt", - "sample4/qc/normal/mosdepth", - "sample4/qc/normal/mosdepth/sample4.mosdepth.global.dist.txt", - "sample4/qc/normal/mosdepth/sample4.mosdepth.summary.txt", - "sample4/qc/normal/nanoplot_aln", - "sample4/qc/normal/nanoplot_aln/NanoPlot-report.html", - "sample4/qc/normal/nanoplot_aln/NanoStats.txt", - "sample4/qc/normal/nanoplot_aln/Non_weightedHistogramReadlength.html", - "sample4/qc/normal/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", - "sample4/qc/normal/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample4/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", - "sample4/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", - "sample4/qc/normal/nanoplot_aln/WeightedHistogramReadlength.html", - "sample4/qc/normal/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", - "sample4/qc/normal/nanoplot_aln/Yield_By_Length.html", - "sample4/qc/normal/nanoplot_ubam_1", - "sample4/qc/normal/nanoplot_ubam_1/NanoPlot-report.html", - "sample4/qc/normal/nanoplot_ubam_1/NanoStats.txt", - "sample4/qc/normal/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_1/WeightedHistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_1/Yield_By_Length.html", - "sample4/qc/normal/nanoplot_ubam_2", - "sample4/qc/normal/nanoplot_ubam_2/NanoPlot-report.html", - "sample4/qc/normal/nanoplot_ubam_2/NanoStats.txt", - "sample4/qc/normal/nanoplot_ubam_2/Non_weightedHistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_2/Non_weightedLogTransformed_HistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_2/WeightedHistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_2/WeightedLogTransformed_HistogramReadlength.html", - "sample4/qc/normal/nanoplot_ubam_2/Yield_By_Length.html", - "sample4/qc/normal/samtools", - "sample4/qc/normal/samtools/sample4.flagstat", - "sample4/qc/normal/samtools/sample4.idxstats", - "sample4/qc/normal/samtools/sample4.stats", - "sample4/qc/tumor", - "sample4/qc/tumor/cramino_aln", - "sample4/qc/tumor/cramino_aln/sample4.arrow", - "sample4/qc/tumor/cramino_aln/sample4_cramino.txt", - "sample4/qc/tumor/cramino_ubam_1", - "sample4/qc/tumor/cramino_ubam_1/sample4.arrow", - "sample4/qc/tumor/cramino_ubam_1/sample4_cramino.txt", - "sample4/qc/tumor/cramino_ubam_2", - "sample4/qc/tumor/cramino_ubam_2/sample4.arrow", - "sample4/qc/tumor/cramino_ubam_2/sample4_cramino.txt", - "sample4/qc/tumor/mosdepth", - "sample4/qc/tumor/mosdepth/sample4.mosdepth.global.dist.txt", - "sample4/qc/tumor/mosdepth/sample4.mosdepth.summary.txt", - "sample4/qc/tumor/nanoplot_aln", - "sample4/qc/tumor/nanoplot_aln/NanoPlot-report.html", - "sample4/qc/tumor/nanoplot_aln/NanoStats.txt", - "sample4/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", - "sample4/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", - "sample4/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample4/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", - "sample4/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", - "sample4/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", - "sample4/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", - "sample4/qc/tumor/nanoplot_aln/Yield_By_Length.html", - "sample4/qc/tumor/nanoplot_ubam_1", - "sample4/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", - "sample4/qc/tumor/nanoplot_ubam_1/NanoStats.txt", - "sample4/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", - "sample4/qc/tumor/nanoplot_ubam_2", - "sample4/qc/tumor/nanoplot_ubam_2/NanoPlot-report.html", - "sample4/qc/tumor/nanoplot_ubam_2/NanoStats.txt", - "sample4/qc/tumor/nanoplot_ubam_2/Non_weightedHistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_2/Non_weightedLogTransformed_HistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_2/WeightedHistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_2/WeightedLogTransformed_HistogramReadlength.html", - "sample4/qc/tumor/nanoplot_ubam_2/Yield_By_Length.html", - "sample4/qc/tumor/samtools", - "sample4/qc/tumor/samtools/sample4.flagstat", - "sample4/qc/tumor/samtools/sample4.idxstats", - "sample4/qc/tumor/samtools/sample4.stats", - "sample4/variants", - "sample4/variants/clair3", - "sample4/variants/clair3/merge_output.vcf.gz", - "sample4/variants/clair3/merge_output.vcf.gz.tbi", - "sample4/variants/clairs", - "sample4/variants/clairs/indel.vcf.gz", - "sample4/variants/clairs/indel.vcf.gz.tbi", - "sample4/variants/clairs/snvs.vcf.gz", - "sample4/variants/clairs/snvs.vcf.gz.tbi", - "sample4/variants/severus", - "sample4/variants/severus/all_SVs", - "sample4/variants/severus/all_SVs/severus_all.vcf.gz", - "sample4/variants/severus/breakpoints_double.csv", - "sample4/variants/severus/read_ids.csv", - "sample4/variants/severus/read_qual.txt", - "sample4/variants/severus/severus.log", - "sample4/variants/severus/somatic_SVs", - "sample4/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample4/vep", - "sample4/vep/SVs", - "sample4/vep/SVs/sample4_SV_VEP.vcf.gz", - "sample4/vep/SVs/sample4_SV_VEP.vcf.gz.tbi", - "sample4/vep/SVs/sample4_SV_VEP.vcf.gz_summary.html", - "sample4/vep/germline", - "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz", - "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz.tbi", - "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz_summary.html", - "sample4/vep/somatic", - "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz", - "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz.tbi", - "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz_summary.html" + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,60838033f5f24aa90e16a5babcddd45b", - "sample1_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", - "sample1_tumor.bam:md5,bd73e83253c95a5fdc4db39454ee2253", - "sample1_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", - "sample1.arrow:md5,d1a96ecc3b5e3e934ba88363a763899f", - "sample1.arrow:md5,94ff32ca347d77fd8af5a78b483bf98e", - "sample1_cramino.txt:md5,efcedbb53adab9e85e5eb051d9bad90e", - "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", - "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", - "NanoPlot-report.html:md5,c8cbcb6e8255446db7444fac48897fdd", - "NanoStats.txt:md5,40388145dc647fe7b1731dcfbfb02271", - "Non_weightedHistogramReadlength.html:md5,8afb751e616b2f34607077265e57a8b0", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,715f121fa5de0f149e4f13738b408f95", - "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,effd36fc5f40bf577136aa010c6c1fd0", - "PercentIdentityvsAlignedReadLength_dot.html:md5,5f54c1bef8343d88495d4f2d504ad29a", - "PercentIdentityvsAlignedReadLength_kde.html:md5,313ab60427118796b7171606e4e18574", - "WeightedHistogramReadlength.html:md5,0309f8143e98faaadd026f264cc9b12f", - "WeightedLogTransformed_HistogramReadlength.html:md5,8ceab8049220a2869c683f61757c8bca", - "Yield_By_Length.html:md5,fba4c0193c163aae83e14962e328af83", - "NanoPlot-report.html:md5,4e9027a21305a8d3c511d511326b4f4a", - "NanoStats.txt:md5,a4fb5d0237f6a0e16d75a4d4a186d5a9", - "Non_weightedHistogramReadlength.html:md5,62edbc05284932ba6061e612d39a81f5", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,df9202a171e69f114ef3f761e5550724", - "WeightedHistogramReadlength.html:md5,1f82feb20982f44c92a673dc65458243", - "WeightedLogTransformed_HistogramReadlength.html:md5,a0690de90f7b871eb99d3212da424c10", - "Yield_By_Length.html:md5,6c371f8784513490f2d752ece358c074", - "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", - "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", - "sample1.stats:md5,cf4b23c58e65cb55b31463db14ed6fd3", - "sample1.arrow:md5,d7b489b1d70541815579bf74d5aa8cb4", - "sample1.arrow:md5,16bde96910276bac19a644c69631fedc", - "sample1_cramino.txt:md5,ae5249ed09fbc028f0949731329af726", - "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "NanoPlot-report.html:md5,3ea00baa11043deefb5c588267b2a34a", - "NanoStats.txt:md5,4b13dfb48a4cf6b4202be8648da59da8", - "Non_weightedHistogramReadlength.html:md5,be11d7b5c93c8d4a112bfb4194fe276e", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,9b962c556993d5a3d123843f0e5fbf59", - "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,388029aa610aedacef6ee70fc69d6b60", - "PercentIdentityvsAlignedReadLength_dot.html:md5,0e3ba5a4576c88f028e225c1a11e783f", - "PercentIdentityvsAlignedReadLength_kde.html:md5,516acc94864e372fe4eba11e89f978d5", - "WeightedHistogramReadlength.html:md5,aad4e06d48574265a108c983296ed752", - "WeightedLogTransformed_HistogramReadlength.html:md5,97b38f577dbe1dbd385d023c5a160e8a", - "Yield_By_Length.html:md5,0ccabc468bf057f198d7dbb86fa04ef5", - "NanoPlot-report.html:md5,f3a7ebf64ed64d738e8c9ebbf5e1ee5d", - "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", - "Non_weightedHistogramReadlength.html:md5,5b50a06cbaccc46c439868dc47491067", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,65d1fff37f65b926adfb6e68229cb86d", - "WeightedHistogramReadlength.html:md5,a8111ebea31e27ce78f7e137c9fcc1b3", - "WeightedLogTransformed_HistogramReadlength.html:md5,fd5c6ebe681ff6baa3c94a25cd7840fc", - "Yield_By_Length.html:md5,139dc6ca2812712d474a56aaae242daa", - "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", - "breakpoints_double.csv:md5,57e4f0d5509db44179e7c5044c6bc259", - "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "sample2_normal.bam:md5,554b89692e84b9ddd0615649e2b15820", - "sample2_normal.bam.bai:md5,af193f1922d90b8741212d2bf690c418", - "sample2_tumor.bam:md5,26c4e52c12aa0e874fe52ae3b729beba", - "sample2_tumor.bam.bai:md5,e9e64e13328aa3621e7976f8e3f29a78", - "sample2.arrow:md5,601a76e2cff7373b4705557d45706d3c", - "sample2.arrow:md5,7a4030a6eceb4c6f6249233652b619da", - "sample2_cramino.txt:md5,d197a8352b83a577d1a5186fa38abd8e", - "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", - "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", - "NanoPlot-report.html:md5,ac1beab779b8b7dc328f29a84f93ea8a", - "NanoStats.txt:md5,dfb476731c22b26f2f767f6e87a24476", - "Non_weightedHistogramReadlength.html:md5,f067f4675d4d4c87a88112eb40635fdb", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,910c0b24a7a8587aafec6cef34280f16", - "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,358811eca8b867b71294d5413f4500ec", - "PercentIdentityvsAlignedReadLength_dot.html:md5,8cbf0cd11825fef5fe52536bd0e33048", - "PercentIdentityvsAlignedReadLength_kde.html:md5,fcebe295547a4f729aa70f01df7c2204", - "WeightedHistogramReadlength.html:md5,b602119565eaf843e1acc64503ad2cbd", - "WeightedLogTransformed_HistogramReadlength.html:md5,32ff13de535bc5a5b45dc4150bb280b7", - "Yield_By_Length.html:md5,f9a51f281d3b19fccfc97fd4d17e3336", - "NanoPlot-report.html:md5,98ad5a42c3e4cfb66b4578339a9265d0", - "NanoStats.txt:md5,3d81081b7070fdc07f9813d3bfa63367", - "Non_weightedHistogramReadlength.html:md5,d740df4892101723755f53a5ec26b1e8", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,9c4f48b28ee8a4b1c7ec33d6dd707b2e", - "WeightedHistogramReadlength.html:md5,8cacc216720d8cf5d9e611aa4557038e", - "WeightedLogTransformed_HistogramReadlength.html:md5,224727d49b7d07ad24ed7571dd26eee6", - "Yield_By_Length.html:md5,7853680df7b4476d13c2eb6ffda806a7", - "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", - "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", - "sample2.stats:md5,2b7f1a2833840d350d2a4d54fed70cf7", - "sample2.arrow:md5,8f97c887f3060678bafc1646ce644eb0", - "sample2.arrow:md5,22a79e85d112d8e2ea5f50cbf443f6a9", - "sample2_cramino.txt:md5,e793a0a87293c4ed489d69e4aebcf9cd", - "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", - "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", - "NanoPlot-report.html:md5,757ef4c906cc85b536365cfeaa4cec6b", - "NanoStats.txt:md5,7f9288f9a425ec7985281e7d3debba02", - "Non_weightedHistogramReadlength.html:md5,d66c677b3d6f9b8564de3ed10263b2f5", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,8413d648f409260ce0b2da01b97efe1b", - "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,241024fa5110716a3e2bc69bbca08a52", - "PercentIdentityvsAlignedReadLength_dot.html:md5,efb7aead5166f514729fd8320f8f2a0c", - "PercentIdentityvsAlignedReadLength_kde.html:md5,b55330318641a65922bf9f756d9cb10d", - "WeightedHistogramReadlength.html:md5,e5035f4fb0d61386954e53577dcff5e5", - "WeightedLogTransformed_HistogramReadlength.html:md5,f37aa44a5fe5379ca41297e34be1aad0", - "Yield_By_Length.html:md5,40a4ddc5acbe3872335cdf7b568350df", - "NanoPlot-report.html:md5,198add34a75f6011f21cb959f2e47aac", - "NanoStats.txt:md5,a5a89662e201ce5194fd3fa484e4ac9e", - "Non_weightedHistogramReadlength.html:md5,21517b0ac4fe6563b3c0d847e0c27ec1", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,b72e4c39e90367a4f4ad31fed8a001ff", - "WeightedHistogramReadlength.html:md5,a8a2881a11ffc8fa4f86273447a36d11", - "WeightedLogTransformed_HistogramReadlength.html:md5,2c14ebd56b80f7c6b27418ce7f91f09a", - "Yield_By_Length.html:md5,2ab87f6dddce7dda05deb7f36b1eea9f", - "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", - "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", - "sample2.stats:md5,defe74842396209b6cff4b32994287c7", - "breakpoints_double.csv:md5,b71bba578c126b9217765d854b21028a", - "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", - "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", - "sample3.arrow:md5,d7b489b1d70541815579bf74d5aa8cb4", - "sample3.arrow:md5,16bde96910276bac19a644c69631fedc", - "sample3_cramino.txt:md5,ae5249ed09fbc028f0949731329af726", - "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "NanoPlot-report.html:md5,b44ca5e7b0c9150fb4516d9dbc3d7fdc", - "NanoStats.txt:md5,4b13dfb48a4cf6b4202be8648da59da8", - "Non_weightedHistogramReadlength.html:md5,6792893ad36a1309eb2fbcc85e6938f4", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,6d8d7c39e1616233e83a3b5af56b18fb", - "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,9cf127d2f11027105d03f52c72387963", - "PercentIdentityvsAlignedReadLength_dot.html:md5,540908c1e28fa6ea0ec1cc6b6536b7a9", - "PercentIdentityvsAlignedReadLength_kde.html:md5,89def0f3dbccafb66ba2d9460b3772cb", - "WeightedHistogramReadlength.html:md5,fe769d4f5e6231f5727829d9ce71fc21", - "WeightedLogTransformed_HistogramReadlength.html:md5,604832cfbde0d373af0c8f21133f756f", - "Yield_By_Length.html:md5,d1fcb2fbdbff007260b7d786e3b43e3c", - "NanoPlot-report.html:md5,7d0a63785188079d2ccff8ae82067629", - "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", - "Non_weightedHistogramReadlength.html:md5,c590c93699d4a5ccee8869a62942ac25", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,bf2f2e69f69f9a99192f46cd18ca20aa", - "WeightedHistogramReadlength.html:md5,9854181af52585ee2a49c77d6a576530", - "WeightedLogTransformed_HistogramReadlength.html:md5,67a330aec920edfb29654ab896cd9848", - "Yield_By_Length.html:md5,3a4293c71df6190541684e7da53f54fd", - "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f", - "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "sample4_normal.bam:md5,b1fca5de53966e0927c557afad3d8df3", - "sample4_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", - "sample4_tumor.bam:md5,493ba7936ae34d0f06d65d416fefb435", - "sample4_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", - "sample4.arrow:md5,d1a96ecc3b5e3e934ba88363a763899f", - "sample4.arrow:md5,94ff32ca347d77fd8af5a78b483bf98e", - "sample4_cramino.txt:md5,efcedbb53adab9e85e5eb051d9bad90e", - "sample4.arrow:md5,94ff32ca347d77fd8af5a78b483bf98e", - "sample4_cramino.txt:md5,efcedbb53adab9e85e5eb051d9bad90e", - "sample4.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", - "sample4.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", - "NanoPlot-report.html:md5,d9fe25246a3c2116f484902540afd4ec", - "NanoStats.txt:md5,40388145dc647fe7b1731dcfbfb02271", - "Non_weightedHistogramReadlength.html:md5,9ecddf487add956f8fda10332180b3ac", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,8c3d970892019f54c3b42162f4797d0c", - "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,0fc194c1e243efb5b76cffbd28d86a65", - "PercentIdentityvsAlignedReadLength_dot.html:md5,f78246f54336b775189a10167cea8ece", - "PercentIdentityvsAlignedReadLength_kde.html:md5,6e7d978c54abe1ea7940f8ab6c354d8e", - "WeightedHistogramReadlength.html:md5,c7395ac03209d85671321ed7533f78fb", - "WeightedLogTransformed_HistogramReadlength.html:md5,08987637cfa7a8d6db6703328acc7e8d", - "Yield_By_Length.html:md5,3ebac374df1ebe4911ceeef799780858", - "NanoPlot-report.html:md5,5586b5e20590cbc977c0d6fc2c423ef6", - "NanoStats.txt:md5,a4fb5d0237f6a0e16d75a4d4a186d5a9", - "Non_weightedHistogramReadlength.html:md5,add1273b6426ed68b0208000f05c61b9", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,d15d65ba402efdd9c1692ee7501caecf", - "WeightedHistogramReadlength.html:md5,d0bc85f894f183a57b54172c69aeb1c8", - "WeightedLogTransformed_HistogramReadlength.html:md5,5664ba45110e8b9f5232818c67d7a4b0", - "Yield_By_Length.html:md5,1b35a7b92d459c34d9c9aa27dffbfdb6", - "NanoPlot-report.html:md5,51a94261fabbbf0e06862c9e1545b006", - "NanoStats.txt:md5,a4fb5d0237f6a0e16d75a4d4a186d5a9", - "Non_weightedHistogramReadlength.html:md5,4e092ba8c4d6394b8e5bf79762ad2e58", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,0e73bb0a8edf2568c436bd5c44844189", - "WeightedHistogramReadlength.html:md5,45dfa26e5222951fe74e745fba190622", - "WeightedLogTransformed_HistogramReadlength.html:md5,fc79f9277e98f5e8488b06e96a5ed9a6", - "Yield_By_Length.html:md5,a32f6f45ef3890937831418aee3c1204", - "sample4.flagstat:md5,815a5385bd57ef44847714130b80d630", - "sample4.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", - "sample4.stats:md5,8830836e19681287abd7eabfc8ac10bd", - "sample4.arrow:md5,d7b489b1d70541815579bf74d5aa8cb4", - "sample4.arrow:md5,16bde96910276bac19a644c69631fedc", - "sample4_cramino.txt:md5,ae5249ed09fbc028f0949731329af726", - "sample4.arrow:md5,16bde96910276bac19a644c69631fedc", - "sample4_cramino.txt:md5,ae5249ed09fbc028f0949731329af726", - "sample4.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample4.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "NanoPlot-report.html:md5,31c64fbd50cb09971dd75c8a81f36cfa", - "NanoStats.txt:md5,4b13dfb48a4cf6b4202be8648da59da8", - "Non_weightedHistogramReadlength.html:md5,0e76c09caf2858d803d9c01a28ee8e6c", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,46abfae095ea52e81ce71b4de69f8921", - "PercentIdentityHistogramDynamic_Histogram_percent_identity.html:md5,fdd686719dabb5e60a0cd697ee6dc324", - "PercentIdentityvsAlignedReadLength_dot.html:md5,7867710d0f0282dcd7620e2ea2a95c40", - "PercentIdentityvsAlignedReadLength_kde.html:md5,4a6bcdc361a30707848c2f4286afb277", - "WeightedHistogramReadlength.html:md5,18859070ef27e8db77a70bb07d739bc3", - "WeightedLogTransformed_HistogramReadlength.html:md5,d0a648cc14777aeb4bbbf96a7a620252", - "Yield_By_Length.html:md5,27e5c6db9d5eb179e21652f16e638a88", - "NanoPlot-report.html:md5,42ed022d2676ace745c3f101d58c0de5", - "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", - "Non_weightedHistogramReadlength.html:md5,495c95747e6923beb73ed9ccff07973c", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,f8affcc9e70292976915d128f46244bf", - "WeightedHistogramReadlength.html:md5,db6a879957f80060978bf050ae63da4e", - "WeightedLogTransformed_HistogramReadlength.html:md5,d4a87125b8de85ec5ca7336d27df4379", - "Yield_By_Length.html:md5,4953226526548698ebdadd32b18a9651", - "NanoPlot-report.html:md5,d933d539410dde8d9faf8ae3d18d4514", - "NanoStats.txt:md5,3fe74e7afd3b03e50943f70f11660bfa", - "Non_weightedHistogramReadlength.html:md5,7a1558714b43d63dab66563f3381045d", - "Non_weightedLogTransformed_HistogramReadlength.html:md5,b864b1f5fff9d07562ea0ad7ce4a1729", - "WeightedHistogramReadlength.html:md5,fb98a7f31f65e15b5ddd4cc651b745be", - "WeightedLogTransformed_HistogramReadlength.html:md5,4657ca4d4d750a491be2d3f8c89257e1", - "Yield_By_Length.html:md5,2748e991bfb0f94a0c980bfa593506a9", - "sample4.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample4.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample4.stats:md5,dc8fec65923bf23826689ec1865f6fff", - "breakpoints_double.csv:md5,eafc71d123fb6ea562b5dd1fba243bd7", - "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c" + "sample1_normal.bam:md5,7714d4b2db4d97b609c9a58f94e9a550", + "sample1_normal.bam.bai:md5,b5e6df2994304fd78ecd2b3b8fea87ee", + "sample1_tumor.bam:md5,b0f1bdae9bbdb901eced7297088a5d1e", + "sample1_tumor.bam.bai:md5,fc1f6cd9556c7d1d08a9a52c7ee97cbb", + "sample1.arrow:md5,df57219f1bea7e7d5538ec4ee87dcf83", + "sample1.arrow:md5,36467bdd847baaa060817928d30bf091", + "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", + "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", + "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", + "sample1.arrow:md5,de5f6de5e459d71d6cd4919eea616943", + "sample1.arrow:md5,b4102a193ca9eb2ebee0cd36b48c138d", + "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", + "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "sample2_normal.bam:md5,b2b52d2ff82220cd393fa353cf931207", + "sample2_normal.bam.bai:md5,a82a6a8a6ad1879588befe5c5869d598", + "sample2_tumor.bam:md5,f63adccc34154d53e36766ca30db1512", + "sample2_tumor.bam.bai:md5,015b8dc2ccd1e8f4338c94bc6f81ed40", + "sample2.arrow:md5,6aa5eec1162a077f3bf8537c8f0db952", + "sample2.arrow:md5,04f75058ac7edf6f8dfe33b8bab3b78d", + "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", + "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", + "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", + "sample2.arrow:md5,230ab87cb153beb945be51bc2e23f918", + "sample2.arrow:md5,838c7b7fa4e92e44094737f1b8dbbe56", + "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", + "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", + "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", + "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "sample3_tumor.bam:md5,24e3b7bee7a0d8a01303f677d2b87b08", + "sample3_tumor.bam.bai:md5,d2038319977bd78352927c16ef3f1a21", + "sample3.arrow:md5,de5f6de5e459d71d6cd4919eea616943", + "sample3.arrow:md5,b4102a193ca9eb2ebee0cd36b48c138d", + "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", + "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-12T10:24:45.028206459" + "timestamp": "2026-03-12T13:44:30.997427763" } } \ No newline at end of file From f632496b972c33ce0739212fa343e41d1d5c20d0 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 12 Mar 2026 14:12:47 +0100 Subject: [PATCH 106/183] precommit --- modules.json | 15 +++++++++++++++ tests/.nftignore | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 100cd8a1..8947a202 100644 --- a/modules.json +++ b/modules.json @@ -27,6 +27,21 @@ "installed_by": ["modules", "vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, + "deepvariant/callvariants": { + "branch": "master", + "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", + "installed_by": ["deepvariant"] + }, + "deepvariant/makeexamples": { + "branch": "master", + "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", + "installed_by": ["deepvariant"] + }, + "deepvariant/postprocessvariants": { + "branch": "master", + "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", + "installed_by": ["deepvariant"] + }, "ensemblvep/download": { "branch": "master", "git_sha": "90cdd21fd96ccbdb3bc90797ca69570d18391055", diff --git a/tests/.nftignore b/tests/.nftignore index 3d5f461f..1553a3f3 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -20,4 +20,4 @@ pipeline_info/*.{html,json,txt,yml} */qc/{tumor,normal}/{cramino_aln}/*_cramino.txt */qc/{tumor,normal}/{cramino_ubam}_*/*_cramino.txt */qc/{tumor,normal}/{nanoplot_ubam}_*/*.html -*/qc/{tumor,normal}/{nanoplot_alt}/*.html \ No newline at end of file +*/qc/{tumor,normal}/{nanoplot_alt}/*.html From f99d4d2af31e480a73e71d26737d6060bd55d5c8 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 12 Mar 2026 14:16:21 +0100 Subject: [PATCH 107/183] install deepvariant subworkflow --- modules.json | 20 + .../nf-core/deepvariant/callvariants/main.nf | 50 +++ .../nf-core/deepvariant/callvariants/meta.yml | 68 +++ .../callvariants/tests/main.nf.test | 84 ++++ .../callvariants/tests/main.nf.test.snap | 55 +++ .../callvariants/tests/nextflow.config | 11 + .../nf-core/deepvariant/makeexamples/main.nf | 58 +++ .../nf-core/deepvariant/makeexamples/meta.yml | 135 ++++++ .../makeexamples/tests/main.nf.test | 204 +++++++++ .../makeexamples/tests/main.nf.test.snap | 178 ++++++++ .../makeexamples/tests/nextflow.config | 6 + .../deepvariant/postprocessvariants/main.nf | 86 ++++ .../deepvariant/postprocessvariants/meta.yml | 155 +++++++ .../postprocessvariants/tests/main.nf.test | 123 +++++ .../tests/main.nf.test.snap | 196 ++++++++ .../postprocessvariants/tests/nextflow.config | 10 + subworkflows/nf-core/deepvariant/README.md | 8 + subworkflows/nf-core/deepvariant/main.nf | 46 ++ subworkflows/nf-core/deepvariant/meta.yml | 77 ++++ ...nt-workflow-and-process-equality-tester.nf | 22 + .../tests/disable-small-model.conf | 8 + .../deepvariant/tests/equality.nf.test | 63 +++ .../nf-core/deepvariant/tests/main.nf.test | 152 +++++++ .../deepvariant/tests/main.nf.test.snap | 419 ++++++++++++++++++ .../nf-core/deepvariant/tests/nextflow.config | 14 + 25 files changed, 2248 insertions(+) create mode 100644 modules/nf-core/deepvariant/callvariants/main.nf create mode 100644 modules/nf-core/deepvariant/callvariants/meta.yml create mode 100644 modules/nf-core/deepvariant/callvariants/tests/main.nf.test create mode 100644 modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap create mode 100644 modules/nf-core/deepvariant/callvariants/tests/nextflow.config create mode 100644 modules/nf-core/deepvariant/makeexamples/main.nf create mode 100644 modules/nf-core/deepvariant/makeexamples/meta.yml create mode 100644 modules/nf-core/deepvariant/makeexamples/tests/main.nf.test create mode 100644 modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap create mode 100644 modules/nf-core/deepvariant/makeexamples/tests/nextflow.config create mode 100644 modules/nf-core/deepvariant/postprocessvariants/main.nf create mode 100644 modules/nf-core/deepvariant/postprocessvariants/meta.yml create mode 100644 modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test create mode 100644 modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap create mode 100644 modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config create mode 100644 subworkflows/nf-core/deepvariant/README.md create mode 100644 subworkflows/nf-core/deepvariant/main.nf create mode 100644 subworkflows/nf-core/deepvariant/meta.yml create mode 100644 subworkflows/nf-core/deepvariant/tests/deepvariant-workflow-and-process-equality-tester.nf create mode 100644 subworkflows/nf-core/deepvariant/tests/disable-small-model.conf create mode 100644 subworkflows/nf-core/deepvariant/tests/equality.nf.test create mode 100644 subworkflows/nf-core/deepvariant/tests/main.nf.test create mode 100644 subworkflows/nf-core/deepvariant/tests/main.nf.test.snap create mode 100644 subworkflows/nf-core/deepvariant/tests/nextflow.config diff --git a/modules.json b/modules.json index 100cd8a1..084a0f43 100644 --- a/modules.json +++ b/modules.json @@ -27,6 +27,21 @@ "installed_by": ["modules", "vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, + "deepvariant/callvariants": { + "branch": "master", + "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", + "installed_by": ["deepvariant", "modules"] + }, + "deepvariant/makeexamples": { + "branch": "master", + "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", + "installed_by": ["deepvariant", "modules"] + }, + "deepvariant/postprocessvariants": { + "branch": "master", + "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", + "installed_by": ["deepvariant", "modules"] + }, "ensemblvep/download": { "branch": "master", "git_sha": "90cdd21fd96ccbdb3bc90797ca69570d18391055", @@ -141,6 +156,11 @@ "git_sha": "7ac6cbe7c17c2dad685da7f70496c8f48ea48687", "installed_by": ["subworkflows"] }, + "deepvariant": { + "branch": "master", + "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", + "installed_by": ["subworkflows"] + }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", diff --git a/modules/nf-core/deepvariant/callvariants/main.nf b/modules/nf-core/deepvariant/callvariants/main.nf new file mode 100644 index 00000000..2fc656ee --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/main.nf @@ -0,0 +1,50 @@ + +process DEEPVARIANT_CALLVARIANTS { + tag "$meta.id" + label 'process_high' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" + + input: + tuple val(meta), path(make_examples_tfrecords) + + output: + tuple val(meta), path("${prefix}.call-*-of-*.tfrecord.gz"), emit: call_variants_tfrecords + tuple val("${task.process}"), val('deepvariant'), eval("/opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //'"), topic: versions, emit: versions_deepvariant + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def matcher = make_examples_tfrecords[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/ + if (!matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + make_examples_tfrecords[0].baseName + "' doesn't match the expected pattern") + } + def examples_tfrecord_name = matcher[0][1] + def shardCount = matcher[0][2] + // Reconstruct the logical name - ${tfrecord_name}.examples.tfrecord@${task.cpus}.gz + def examples_tfrecords_logical_name = "${examples_tfrecord_name}@${shardCount}.gz" + + """ + /opt/deepvariant/bin/call_variants \\ + ${args} \\ + --outfile "${prefix}.call.tfrecord.gz" \\ + --examples "${examples_tfrecords_logical_name}" + + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.call-00000-of-00001.tfrecord.gz + + """ +} diff --git a/modules/nf-core/deepvariant/callvariants/meta.yml b/modules/nf-core/deepvariant/callvariants/meta.yml new file mode 100644 index 00000000..fa1aaa42 --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/meta.yml @@ -0,0 +1,68 @@ +name: deepvariant_callvariants +description: Call variants from the examples produced by make_examples +keywords: + - variant calling + - machine learning + - neural network +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network + to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "10.1038/nbt.4235" + licence: ["BSD-3-clause"] + identifier: biotools:deepvariant +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - make_examples_tfrecords: + type: file + description: The actual sharded input files, from DEEPVARIANT_MAKEEXAMPLES process + pattern: "*.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format +output: + call_variants_tfrecords: + - - meta: + type: list + description: | + Each output contains: unique ID string from input channel, meta, tfrecord file with variant calls. + - ${prefix}.call-*-of-*.tfrecord.gz: + type: list + description: | + Each output contains: unique ID string from input channel, meta, tfrecord file with variant calls. + versions_deepvariant: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +authors: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/deepvariant/callvariants/tests/main.nf.test b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test new file mode 100644 index 00000000..d617650b --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test @@ -0,0 +1,84 @@ +nextflow_process { + + name "Test Process DEEPVARIANT_CALLVARIANTS" + script "../main.nf" + config "./nextflow.config" + process "DEEPVARIANT_CALLVARIANTS" + + tag "deepvariant/makeexamples" + tag "deepvariant/callvariants" + tag "deepvariant" + tag "modules" + tag "modules_nfcore" + + test("homo_sapiens - wgs") { + setup { + run("DEEPVARIANT_MAKEEXAMPLES") { + script "../../makeexamples/main.nf" + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + } + when { + process { + """ + input[0] = DEEPVARIANT_MAKEEXAMPLES.out.examples + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.call_variants_tfrecords.get(0).get(0) == [ id:'test', single_end:false ] }, + // The tfrecord binary representation is not stable, but we check the name of the output. + { assert snapshot(file(process.out.call_variants_tfrecords.get(0).get(1)).name).match("homo_sapiens-wgs-call_variants_tfrecords-filenames")}, + ) + } + } + + test("homo_sapiens - wgs - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta + [] // No input paths are needed in stub mode + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + +} diff --git a/modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap new file mode 100644 index 00000000..ce71dac2 --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap @@ -0,0 +1,55 @@ +{ + "homo_sapiens-wgs-call_variants_tfrecords-filenames": { + "content": [ + "test.call-00000-of-00001.tfrecord.gz" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-04T17:04:33.276938" + }, + "homo_sapiens - wgs - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.call-00000-of-00001.tfrecord.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + "DEEPVARIANT_CALLVARIANTS", + "deepvariant", + "1.9.0" + ] + ], + "call_variants_tfrecords": [ + [ + { + "id": "test", + "single_end": false + }, + "test.call-00000-of-00001.tfrecord.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_deepvariant": [ + [ + "DEEPVARIANT_CALLVARIANTS", + "deepvariant", + "1.9.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:02:54.403068431" + } +} \ No newline at end of file diff --git a/modules/nf-core/deepvariant/callvariants/tests/nextflow.config b/modules/nf-core/deepvariant/callvariants/tests/nextflow.config new file mode 100644 index 00000000..68aec144 --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/tests/nextflow.config @@ -0,0 +1,11 @@ +process { + withName: "DEEPVARIANT_CALLVARIANTS" { + ext.args = '--checkpoint "/opt/models/wgs"' + cpus = 2 // Keep CPUs fixed so the number of output files is reproducible + } +} +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + ext.args = '--checkpoint "/opt/models/wgs" --call_small_model_examples --small_model_indel_gq_threshold "30" --small_model_snp_gq_threshold "25" --small_model_vaf_context_window_size "51" --trained_small_model_path "/opt/smallmodels/wgs"' + } +} diff --git a/modules/nf-core/deepvariant/makeexamples/main.nf b/modules/nf-core/deepvariant/makeexamples/main.nf new file mode 100644 index 00000000..77d2f331 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/main.nf @@ -0,0 +1,58 @@ +process DEEPVARIANT_MAKEEXAMPLES { + tag "$meta.id" + label 'process_high' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" + + input: + tuple val(meta), path(input), path(index), path(intervals) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(gzi) + tuple val(meta5), path(par_bed) + + output: + tuple val(meta), path("${prefix}.examples.tfrecord-*-of-*.gz{,.example_info.json}"), emit: examples + tuple val(meta), path("${prefix}.gvcf.tfrecord-*-of-*.gz"), emit: gvcf + tuple val(meta), path("${prefix}_call_variant_outputs.examples.tfrecord-*-of-*.gz", arity: "0..*"), emit: small_model_calls + tuple val("${task.process}"), val('deepvariant'), eval("/opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //'"), topic: versions, emit: versions_deepvariant + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def regions = intervals ? "--regions ${intervals}" : "" + def par_regions = par_bed ? "--par_regions_bed=${par_bed}" : "" + + """ + seq 0 ${task.cpus - 1} | parallel -q --halt 2 --line-buffer /opt/deepvariant/bin/make_examples \\ + --mode calling \\ + --ref "${fasta}" \\ + --reads "${input}" \\ + --examples "./${prefix}.examples.tfrecord@${task.cpus}.gz" \\ + --gvcf "./${prefix}.gvcf.tfrecord@${task.cpus}.gz" \\ + ${regions} \\ + ${par_regions} \\ + ${args} \\ + --task {} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + printf -v SHARD_COUNT "%04d" ${task.cpus} + for i in \$( seq -f "%04g" 0 ${task.cpus-1} ) + do + echo "" | gzip > ${prefix}.examples.tfrecord-\$i-of-\$SHARD_COUNT.tfrecord.gz + touch ${prefix}.examples.tfrecord-\$i-of-\$SHARD_COUNT.tfrecord.gz.example_info.json + echo "" | gzip > ${prefix}.gvcf.tfrecord-\$i-of-\$SHARD_COUNT.tfrecord.gz + done + """ +} diff --git a/modules/nf-core/deepvariant/makeexamples/meta.yml b/modules/nf-core/deepvariant/makeexamples/meta.yml new file mode 100644 index 00000000..12056fbd --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/meta.yml @@ -0,0 +1,135 @@ +name: deepvariant_makeexamples +description: Transforms the input alignments to a format suitable for the deep neural + network variant caller +keywords: + - variant calling + - machine learning + - neural network +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network + to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "10.1038/nbt.4235" + licence: ["BSD-3-clause"] + identifier: biotools:deepvariant +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file + pattern: "*.bam/cram" + ontologies: [] + - index: + type: file + description: Index of BAM/CRAM file + pattern: "*.bai/crai" + ontologies: [] + - intervals: + type: file + description: Interval file for targeted regions + pattern: "*.bed" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - gzi: + type: file + description: GZI index of reference fasta file + ontologies: [] + - - meta5: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + pattern: "*.gzi" + - par_bed: + type: file + description: BED file containing PAR regions + pattern: "*.bed" + ontologies: [] +output: + examples: + - - meta: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + - ${prefix}.examples.tfrecord-*-of-*.gz{,.example_info.json}: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + gvcf: + - - meta: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + - ${prefix}.gvcf.tfrecord-*-of-*.gz: + type: list + description: | + Tuple containing sample metadata and the GVCF data in tfrecord format + small_model_calls: + - - meta: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + - ${prefix}_call_variant_outputs.examples.tfrecord-*-of-*.gz: + type: list + description: | + Optional variant calls from the small model, if enabled, in tfrecord format + versions_deepvariant: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test new file mode 100644 index 00000000..cc06f780 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test @@ -0,0 +1,204 @@ +nextflow_process { + + name "Test Process DEEPVARIANT_MAKEEXAMPLES" + script "../main.nf" + config "./nextflow.config" + process "DEEPVARIANT_MAKEEXAMPLES" + + tag "deepvariant/makeexamples" + tag "deepvariant" + tag "modules" + tag "modules_nfcore" + + test("homo_sapiens - [bam, bai] - fasta - fai") { + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + + { assert process.out.examples[0][0] == [id:'test', single_end:false] }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test1-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test1-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test1-gvcf-filenames") } + ) + } + } + + test("homo_sapiens - [cram, crai, genome_bed] - fasta - fai") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.examples[0][0] == [id:'test', single_end:false] }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test2-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test2-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test2-gvcf-filenames") } + ) + } + } + + test("homo_sapiens - [bam, bai] - fasta_gz - fasta_gz_fai") { + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.gz', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.gz.fai', checkIfExists: true) + ] + input[3] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.gz.gzi', checkIfExists: true) + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.examples[0][0] == [id:'test', single_end:false] }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test3-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test3-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test3-gvcf-filenames") } + ) + } + } + + test("stub") { + + options "-stub" + + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test4-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test4-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test4-gvcf-filenames") } + ) + } + } +} diff --git a/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap new file mode 100644 index 00000000..729f0dc5 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap @@ -0,0 +1,178 @@ +{ + "test1-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-00000-of-00002.gz", + "test.gvcf.tfrecord-00001-of-00002.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:12:57.93412258" + }, + "test3-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:09:55.034298895" + }, + "test2-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-00000-of-00002.gz", + "test.examples.tfrecord-00000-of-00002.gz.example_info.json", + "test.examples.tfrecord-00001-of-00002.gz", + "test.examples.tfrecord-00001-of-00002.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:14:02.467533548" + }, + "test1-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-00000-of-00002.gz", + "test.examples.tfrecord-00000-of-00002.gz.example_info.json", + "test.examples.tfrecord-00001-of-00002.gz", + "test.examples.tfrecord-00001-of-00002.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:12:57.790379812" + }, + "test2-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:07:52.050411549" + }, + "test4-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:12:07.012233232" + }, + "test4-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-0000-of-0002.tfrecord.gz", + "test.examples.tfrecord-0000-of-0002.tfrecord.gz.example_info.json", + "test.examples.tfrecord-0001-of-0002.tfrecord.gz", + "test.examples.tfrecord-0001-of-0002.tfrecord.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:58.286077155" + }, + "test1-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:05:28.75651648" + }, + "test3-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-00000-of-00002.gz", + "test.gvcf.tfrecord-00001-of-00002.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:03.780115231" + }, + "test3-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-00000-of-00002.gz", + "test.examples.tfrecord-00000-of-00002.gz.example_info.json", + "test.examples.tfrecord-00001-of-00002.gz", + "test.examples.tfrecord-00001-of-00002.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:03.702565392" + }, + "test2-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-00000-of-00002.gz", + "test.gvcf.tfrecord-00001-of-00002.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:14:02.550236324" + }, + "test4-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-0000-of-0002.tfrecord.gz", + "test.gvcf.tfrecord-0001-of-0002.tfrecord.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:58.412547051" + } +} \ No newline at end of file diff --git a/modules/nf-core/deepvariant/makeexamples/tests/nextflow.config b/modules/nf-core/deepvariant/makeexamples/tests/nextflow.config new file mode 100644 index 00000000..6811fe48 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + cpus = 2 // The number of output files is determined by cpus - keep it the same for tests + ext.args = '--checkpoint "/opt/models/wgs" --call_small_model_examples --small_model_indel_gq_threshold "30" --small_model_snp_gq_threshold "25" --small_model_vaf_context_window_size "51" --trained_small_model_path "/opt/smallmodels/wgs"' + } +} diff --git a/modules/nf-core/deepvariant/postprocessvariants/main.nf b/modules/nf-core/deepvariant/postprocessvariants/main.nf new file mode 100644 index 00000000..0830f9ac --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/main.nf @@ -0,0 +1,86 @@ +process DEEPVARIANT_POSTPROCESSVARIANTS { + tag "$meta.id" + label 'process_medium' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" + + input: + tuple val(meta), path(variant_calls_tfrecord_files), path(gvcf_tfrecords), path(small_model_calls), path(intervals) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(gzi) + + output: + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.vcf.gz.{tbi,csi}") , emit: vcf_index + tuple val(meta), path("${prefix}.g.vcf.gz") , emit: gvcf + tuple val(meta), path("${prefix}.g.vcf.gz.{tbi,csi}") , emit: gvcf_index + tuple val("${task.process}"), val('deepvariant'), eval("/opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //'"), topic: versions, emit: versions_deepvariant + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def regions = intervals ? "--regions ${intervals}" : "" + def variant_calls_tfrecord_name = variant_calls_tfrecord_files[0].name.replaceFirst(/-\d{5}-of-\d{5}/, "") + + def gvcf_matcher = gvcf_tfrecords[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/ + if (!gvcf_matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + gvcf_tfrecords[0].baseName + "' doesn't match the expected pattern") + } + def gvcf_tfrecord_name = gvcf_matcher[0][1] + def gvcf_shardCount = gvcf_matcher[0][2] + // Reconstruct the logical name - ${tfrecord_name}.examples.tfrecord@${task.cpus}.gz + def gvcf_tfrecords_logical_name = "${gvcf_tfrecord_name}@${gvcf_shardCount}.gz" + + // The following block determines whether the small model was used, and if so, adds the variant calls from it + // to the argument --small_model_cvo_records. + def small_model_arg = "" + if (small_model_calls) { + small_model_matcher = (small_model_calls[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/) + if (!small_model_matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + small_model_calls[0].baseName + "' doesn't match the expected pattern") + } + small_model_tfrecord_name = small_model_matcher[0][1] + small_model_shardCount = small_model_matcher[0][2] + // Reconstruct the logical name. Example: test_call_variant_outputs.examples.tfrecord@12.gz + small_model_tfrecords_logical_name = "${small_model_tfrecord_name}@${small_model_shardCount}.gz" + small_model_arg = "--small_model_cvo_records ${small_model_tfrecords_logical_name}" + } + + """ + /opt/deepvariant/bin/postprocess_variants \\ + ${args} \\ + --ref "${fasta}" \\ + --infile "${variant_calls_tfrecord_name}" \\ + --outfile "${prefix}.vcf.gz" \\ + --nonvariant_site_tfrecord_path "${gvcf_tfrecords_logical_name}" \\ + --gvcf_outfile "${prefix}.g.vcf.gz" \\ + ${regions} \\ + ${small_model_arg} \\ + --cpus $task.cpus + + """ + + stub: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + echo "" | gzip > ${prefix}.g.vcf.gz + touch ${prefix}.g.vcf.gz.tbi + + """ +} diff --git a/modules/nf-core/deepvariant/postprocessvariants/meta.yml b/modules/nf-core/deepvariant/postprocessvariants/meta.yml new file mode 100644 index 00000000..4a087011 --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/meta.yml @@ -0,0 +1,155 @@ +name: deepvariant_postprocessvariants +description: DeepVariant is an analysis pipeline that uses a deep neural network to + call genetic variants from next-generation DNA sequencing data +keywords: + - variant calling + - machine learning + - neural network +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network + to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "10.1038/nbt.4235" + licence: ["BSD-3-clause"] + identifier: biotools:deepvariant +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - variant_calls_tfrecord_files: + type: file + description: | + One or more data files containing variant calls from DEEPVARIANT_CALLVARIANTS + pattern: "*.tfrecord.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - gvcf_tfrecords: + type: file + description: | + Sharded tfrecord file from DEEPVARIANT_MAKEEXAMPLES with the coverage information used for GVCF output + pattern: "*.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - small_model_calls: + type: file + description: | + Sharded tfrecord file from DEEPVARIANT_MAKEEXAMPLES with variant calls from the small model + pattern: "*.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - intervals: + type: file + description: Interval file for targeted regions + pattern: "*.bed" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - gzi: + type: file + description: GZI index of reference fasta file + pattern: "*.gzi" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.vcf.gz: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + vcf_index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.vcf.gz.{tbi,csi}: + type: file + description: Index for VCF + pattern: "$*.vcf.gz.{tbi,csi}" + ontologies: [] + gvcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.g.vcf.gz: + type: file + description: Compressed GVCF file + pattern: "*.g.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + gvcf_index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.g.vcf.gz.{tbi,csi}: + type: file + description: Index for GVCF + pattern: "*.g.vcf.gz.{tbi,csi}" + ontologies: [] + versions_deepvariant: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test new file mode 100644 index 00000000..ef9110b0 --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test @@ -0,0 +1,123 @@ +nextflow_process { + + name "Test Process DEEPVARIANT_POSTPROCESSVARIANTS" + script "../main.nf" + process "DEEPVARIANT_POSTPROCESSVARIANTS" + config "./nextflow.config" + + tag "deepvariant/makeexamples" + tag "deepvariant/callvariants" + tag "deepvariant/postprocessvariants" + tag "deepvariant" + tag "modules" + tag "modules_nfcore" + + test("homo_sapiens - wgs") { + setup { + run("DEEPVARIANT_MAKEEXAMPLES") { + script "../../makeexamples/main.nf" + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [], + + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + run("DEEPVARIANT_CALLVARIANTS") { + script "../../callvariants/main.nf" + process { + """ + input[0] = DEEPVARIANT_MAKEEXAMPLES.out.examples + """ + } + } + } + when { + process { + """ + input[0] = DEEPVARIANT_CALLVARIANTS.out.call_variants_tfrecords.join( + DEEPVARIANT_MAKEEXAMPLES.out.gvcf, + failOnMismatch: true + ).join( + DEEPVARIANT_MAKEEXAMPLES.out.small_model_calls, + failOnMismatch: true + ).map { meta, tf, gvcf, small_model_calls -> [ meta, tf, gvcf, small_model_calls, [] ] } + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - wgs - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + [], + [], + [], + [], + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match("stub") } + ) + } + } + +} diff --git a/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap new file mode 100644 index 00000000..a981cf84 --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap @@ -0,0 +1,196 @@ +{ + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ], + "gvcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "gvcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "vcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_deepvariant": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:22:12.888323156" + }, + "homo_sapiens - wgs": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ] + ], + "4": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ], + "gvcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ] + ], + "gvcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ] + ], + "vcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ] + ], + "versions_deepvariant": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:19:32.037352523" + } +} \ No newline at end of file diff --git a/modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config b/modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config new file mode 100644 index 00000000..b8f3f47a --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: "DEEPVARIANT_CALLVARIANTS" { + ext.args = '--checkpoint "/opt/models/wgs"' + } +} +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + ext.args = '--checkpoint "/opt/models/wgs" --call_small_model_examples --small_model_indel_gq_threshold "30" --small_model_snp_gq_threshold "25" --small_model_vaf_context_window_size "51" --trained_small_model_path "/opt/smallmodels/wgs"' + } +} diff --git a/subworkflows/nf-core/deepvariant/README.md b/subworkflows/nf-core/deepvariant/README.md new file mode 100644 index 00000000..6f816c22 --- /dev/null +++ b/subworkflows/nf-core/deepvariant/README.md @@ -0,0 +1,8 @@ +# DeepVariant subworkflow + +Usage: the input channel should contain tuples of three elements: `meta`, an alignment file in bam or +cram format, and a corresponding index. + +It is very important that the input channel's `meta` is unique for all the input elements, because the subworkflow does a join on `meta`. + +Please note the important configuration items listed in the `deepvariant` module's README file. It is required to use the configuration to specify the input "channels" (data types to extract from bam file) for `DEEPVARIANT_MAKEEXAMPLES`, and the model to run for `DEEPVARIANT_CALLVARIANTS`. The correct arguments for a specific model (data type) can be determined by manually using the `run_deepvariant` command from the Docker / Singularity image with the `--dry_run` option. diff --git a/subworkflows/nf-core/deepvariant/main.nf b/subworkflows/nf-core/deepvariant/main.nf new file mode 100644 index 00000000..439cbc90 --- /dev/null +++ b/subworkflows/nf-core/deepvariant/main.nf @@ -0,0 +1,46 @@ +include { DEEPVARIANT_MAKEEXAMPLES } from '../../../modules/nf-core/deepvariant/makeexamples/main' +include { DEEPVARIANT_CALLVARIANTS } from '../../../modules/nf-core/deepvariant/callvariants/main' +include { DEEPVARIANT_POSTPROCESSVARIANTS } from '../../../modules/nf-core/deepvariant/postprocessvariants/main' + +workflow DEEPVARIANT { + take: + ch_input // channel: [ val(meta), path(input), path(index), path(intervals)] + ch_fasta // channel: [ val(meta2), path(fasta) ] + ch_fai // channel: [ val(meta3), path(fail) ] + ch_gzi // channel: [ val(meta4), path(gzi) ] + ch_par_bed // channel: [ val(meta5), path(par_bed) ] + + main: + + DEEPVARIANT_MAKEEXAMPLES(ch_input, ch_fasta, ch_fai, ch_gzi, ch_par_bed) + + DEEPVARIANT_CALLVARIANTS(DEEPVARIANT_MAKEEXAMPLES.out.examples) + + // Input to postprocessing step needs both the gvcfs from MAKEEXAMPLES and the variant + // calls from CALLVARIANTS. Joining on meta, which is assumed to be unique. + ch_intervals = ch_input.map { meta, _input, _index, intervals -> [ meta, intervals ] } + + ch_postproc_input = DEEPVARIANT_CALLVARIANTS.out.call_variants_tfrecords.join( + DEEPVARIANT_MAKEEXAMPLES.out.gvcf, + failOnMismatch: true + ).join( + DEEPVARIANT_MAKEEXAMPLES.out.small_model_calls, + failOnMismatch: true + ).join( + ch_intervals, + failOnMismatch: true + ) + + DEEPVARIANT_POSTPROCESSVARIANTS( + ch_postproc_input, + ch_fasta, + ch_fai, + ch_gzi + ) + + emit: + vcf = DEEPVARIANT_POSTPROCESSVARIANTS.out.vcf + vcf_index = DEEPVARIANT_POSTPROCESSVARIANTS.out.vcf_index + gvcf = DEEPVARIANT_POSTPROCESSVARIANTS.out.gvcf + gvcf_index = DEEPVARIANT_POSTPROCESSVARIANTS.out.gvcf_index +} diff --git a/subworkflows/nf-core/deepvariant/meta.yml b/subworkflows/nf-core/deepvariant/meta.yml new file mode 100644 index 00000000..bd459a62 --- /dev/null +++ b/subworkflows/nf-core/deepvariant/meta.yml @@ -0,0 +1,77 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json +name: deepvariant +description: DeepVariant is an analysis pipeline that uses a deep neural network to call genetic variants from next-generation DNA sequencing data +keywords: + - variant calling + - machine learning + - neural network +components: + - deepvariant/makeexamples + - deepvariant/callvariants + - deepvariant/postprocessvariants +input: + - ch_input: + type: list + description: | + Input aligned reads in bam or cram format, with index, and optional intervals BED file + Structure: [ val(meta), path(bam_or_cram), path(bai_or_crai), path(intervals_bed) ] + - ch_fasta: + type: file + description: | + Reference genome + Structure: [ val(meta2), path(fasta) ] + - ch_fai: + type: string + description: | + Reference genome index in fai format + Structure: [ val(meta3), path(fai) ] + - ch_gzi: + type: string + description: | + Reference genome index in gzi format (either gzi or fai should be used) + Structure: [ val(meta4), val(gzi) ] + - ch_par_bed: + type: string + description: | + bed file of pseudoautosomal regions (optional) + Structure: [ val(meta5), val(par_bed) ] + pattern: "*.bed" +output: + - vcf: + type: file + description: | + Variant calls + Structure: [ val(meta), path(vcf) ] + pattern: "*.vcf.gz" + - vcf_tbi: + type: file + description: | + Index for variant call file + Structure: [ val(meta), path(vcf_tbi) ] + pattern: "*.tbi" + - gvcf: + type: file + description: | + Variant call file with genomic coverage information + Structure: [ val(meta), path(gvcf) ] + pattern: "*.g.vcf.gz" + - gvcf_tbi: + type: file + description: | + Index for the GVCF. + Structure: [ val(meta), path(gvcf_tbi) ] + pattern: "*.tbi" + - versions: + type: file + description: | + File containing software versions + Structure: path(versions.yml) + pattern: "versions.yml" +authors: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" +maintainers: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" diff --git a/subworkflows/nf-core/deepvariant/tests/deepvariant-workflow-and-process-equality-tester.nf b/subworkflows/nf-core/deepvariant/tests/deepvariant-workflow-and-process-equality-tester.nf new file mode 100644 index 00000000..83a16d55 --- /dev/null +++ b/subworkflows/nf-core/deepvariant/tests/deepvariant-workflow-and-process-equality-tester.nf @@ -0,0 +1,22 @@ +include { DEEPVARIANT_RUNDEEPVARIANT } from '../../../../modules/nf-core/deepvariant/rundeepvariant/main' +include { DEEPVARIANT } from '../main' + +workflow DEEPVARIANT_WORKFLOW_AND_PROCESS_EQUALITY_TESTER { + take: + ch_input // channel: [ val(meta), path(input), path(index), path(intervals)] + ch_fasta // channel: [ val(meta2), path(fasta) ] + ch_fai // channel: [ val(meta3), path(fail) ] + ch_gzi // channel: [ val(meta4), path(gzi) ] + ch_par_bed // channel: [ val(meta5), path(par_bed) ] + + main: + + DEEPVARIANT(ch_input, ch_fasta, ch_fai, ch_gzi, ch_par_bed) + DEEPVARIANT_RUNDEEPVARIANT(ch_input, ch_fasta, ch_fai, ch_gzi, ch_par_bed) + + emit: + wf_vcf = DEEPVARIANT.out.vcf + pc_vcf = DEEPVARIANT_RUNDEEPVARIANT.out.vcf + wf_gvcf = DEEPVARIANT.out.gvcf + pc_gvcf = DEEPVARIANT_RUNDEEPVARIANT.out.gvcf +} diff --git a/subworkflows/nf-core/deepvariant/tests/disable-small-model.conf b/subworkflows/nf-core/deepvariant/tests/disable-small-model.conf new file mode 100644 index 00000000..eb1b53bc --- /dev/null +++ b/subworkflows/nf-core/deepvariant/tests/disable-small-model.conf @@ -0,0 +1,8 @@ +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + ext.args = '--checkpoint "/opt/models/wgs"' + } + withName: "DEEPVARIANT_CALLVARIANTS" { + ext.args = '--checkpoint "/opt/models/wgs"' + } +} diff --git a/subworkflows/nf-core/deepvariant/tests/equality.nf.test b/subworkflows/nf-core/deepvariant/tests/equality.nf.test new file mode 100644 index 00000000..c4a2276e --- /dev/null +++ b/subworkflows/nf-core/deepvariant/tests/equality.nf.test @@ -0,0 +1,63 @@ + +nextflow_workflow { + + name "Compare subworkflow DEEPVARIANT to the process DEEPVARIANT_RUNDEEPVARIANT" + script "./deepvariant-workflow-and-process-equality-tester.nf" + config "./nextflow.config" + workflow "DEEPVARIANT_WORKFLOW_AND_PROCESS_EQUALITY_TESTER" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/deepvariant" + + tag "deepvariant" + tag "deepvariant/makeexamples" + tag "deepvariant/callvariants" + tag "deepvariant/postprocessvariants" + tag "deepvariant/rundeepvariant" + + test("ensure that the subworkflow and DEEPVARIANT_RUNDEEPVARIANT have the same output") { + when { + workflow { + """ + input[0] = Channel.of( + [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ], + [ + [ id:'test2', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + ) + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert path(workflow.out.wf_vcf[0][1]).vcf.variantsMD5 == path(workflow.out.pc_vcf[0][1]).vcf.variantsMD5 }, + { assert path(workflow.out.wf_gvcf[0][1]).vcf.variantsMD5 == path(workflow.out.pc_gvcf[0][1]).vcf.variantsMD5 }, + ) + } + } +} diff --git a/subworkflows/nf-core/deepvariant/tests/main.nf.test b/subworkflows/nf-core/deepvariant/tests/main.nf.test new file mode 100644 index 00000000..d2451980 --- /dev/null +++ b/subworkflows/nf-core/deepvariant/tests/main.nf.test @@ -0,0 +1,152 @@ +nextflow_workflow { + + name "Test Subworkflow DEEPVARIANT" + script "../main.nf" + config "./nextflow.config" + workflow "DEEPVARIANT" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/deepvariant" + + tag "deepvariant" + tag "deepvariant/makeexamples" + tag "deepvariant/callvariants" + tag "deepvariant/postprocessvariants" + + test("homo_sapiens - two inputs - bam - fasta - fai") { + when { + workflow { + """ + input[0] = Channel.of( + [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ], + [ + [ id:'test2', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ]) + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("homo_sapiens - different samples and regions - cram - fasta - fai") { + + when { + workflow { + """ + input[0] = Channel.of( + [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ], + [ + [ id:'test2', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + ) + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + + test("homo_sapiens - disable small model - cram - fasta - fai") { + + config "./disable-small-model.conf" + + when { + workflow { + """ + input[0] = Channel.of( + [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ], + [ + [ id:'test2', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + ) + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} diff --git a/subworkflows/nf-core/deepvariant/tests/main.nf.test.snap b/subworkflows/nf-core/deepvariant/tests/main.nf.test.snap new file mode 100644 index 00000000..2d14299a --- /dev/null +++ b/subworkflows/nf-core/deepvariant/tests/main.nf.test.snap @@ -0,0 +1,419 @@ +{ + "homo_sapiens - disable small model - cram - fasta - fai": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,0c57956b2f5a0cff8d09a19790ef94f6" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz:md5,5f3d98908d46297c7a658654d5bb3015" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,9ae649fed4de493a027697b339bfab36" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz.tbi:md5,d6a114149024aa8cd74dda2f1c559f5b" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,021f94de713efa7c83d0547f81412dbf" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz:md5,86f9c844a90351483c715e7bcc604841" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,3c690275c3d0b55bacb9469199b4d6d8" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz.tbi:md5,c65395b29f520cf2af04f211f9be2b36" + ] + ], + "gvcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,021f94de713efa7c83d0547f81412dbf" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz:md5,86f9c844a90351483c715e7bcc604841" + ] + ], + "gvcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,3c690275c3d0b55bacb9469199b4d6d8" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz.tbi:md5,c65395b29f520cf2af04f211f9be2b36" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,0c57956b2f5a0cff8d09a19790ef94f6" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz:md5,5f3d98908d46297c7a658654d5bb3015" + ] + ], + "vcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,9ae649fed4de493a027697b339bfab36" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz.tbi:md5,d6a114149024aa8cd74dda2f1c559f5b" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-29T00:09:09.621357638" + }, + "homo_sapiens - different samples and regions - cram - fasta - fai": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz:md5,3176f86df96e50687db733c94d9c6689" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz.tbi:md5,ed7ca1a16bcff42bced0be77ee70662e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz:md5,875b521c835441277a527d41c950e4f5" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz.tbi:md5,ca6f9ca8d50d339f5d65e4ec4e9a6ea6" + ] + ], + "gvcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz:md5,875b521c835441277a527d41c950e4f5" + ] + ], + "gvcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz.tbi:md5,ca6f9ca8d50d339f5d65e4ec4e9a6ea6" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz:md5,3176f86df96e50687db733c94d9c6689" + ] + ], + "vcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz.tbi:md5,ed7ca1a16bcff42bced0be77ee70662e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-29T00:05:25.205895104" + }, + "homo_sapiens - two inputs - bam - fasta - fai": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ] + ], + "gvcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ] + ], + "gvcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ] + ], + "vcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ], + [ + { + "id": "test2", + "single_end": false + }, + "test2.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-29T00:01:12.430387646" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/deepvariant/tests/nextflow.config b/subworkflows/nf-core/deepvariant/tests/nextflow.config new file mode 100644 index 00000000..ad76d4ec --- /dev/null +++ b/subworkflows/nf-core/deepvariant/tests/nextflow.config @@ -0,0 +1,14 @@ +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + ext.args = '--checkpoint "/opt/models/wgs" --call_small_model_examples --small_model_indel_gq_threshold "30" --small_model_snp_gq_threshold "25" --small_model_vaf_context_window_size "51" --trained_small_model_path "/opt/smallmodels/wgs"' + } + withName: "DEEPVARIANT_CALLVARIANTS" { + ext.args = '--checkpoint "/opt/models/wgs"' + } + + // This configures RUNDEEPVARIANT, which is used as a reference for the correct test output + withName: DEEPVARIANT_RUNDEEPVARIANT { + ext.args = '--model_type=WGS ' + ext.prefix = { "${meta.id}_out" } + } +} From cf579652771fdeaed9b1093104df9abc7dc7d44b Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 14:28:46 +0100 Subject: [PATCH 108/183] add options to specify min support severus --- conf/modules.config | 2 +- nextflow.config | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index ce3ec749..afc580e8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -216,7 +216,7 @@ process { withName: '.*:SEVERUS' { ext.prefix = "." - ext.args = '--min-support 3 --output-read-ids ' + ext.args = '--min-support ${params.severus_minsupport} --output-read-ids ' publishDir = [ path: { "${params.outdir}/${meta.id}/variants/severus" }, mode: params.publish_dir_mode, diff --git a/nextflow.config b/nextflow.config index b03dbed8..e34c7421 100644 --- a/nextflow.config +++ b/nextflow.config @@ -48,6 +48,9 @@ params { // Fibertools options params.autocorrelation = null + // Severus options + severus_minsupport = 3 + // ASCAT options ascat_ploidy = null ascat_min_base_qual = 20 From 12869b048ae432a3980fdec8dd21d1c3ef1df1ea Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 12 Mar 2026 14:38:20 +0100 Subject: [PATCH 109/183] add deepsomatic --- modules.json | 5 + modules/nf-core/deepsomatic/main.nf | 71 +++++++++ modules/nf-core/deepsomatic/meta.yml | 144 ++++++++++++++++++ .../nf-core/deepsomatic/tests/main.nf.test | 59 +++++++ .../deepsomatic/tests/main.nf.test.snap | 20 +++ .../nf-core/deepsomatic/tests/nextflow.config | 6 + 6 files changed, 305 insertions(+) create mode 100644 modules/nf-core/deepsomatic/main.nf create mode 100644 modules/nf-core/deepsomatic/meta.yml create mode 100644 modules/nf-core/deepsomatic/tests/main.nf.test create mode 100644 modules/nf-core/deepsomatic/tests/main.nf.test.snap create mode 100644 modules/nf-core/deepsomatic/tests/nextflow.config diff --git a/modules.json b/modules.json index 084a0f43..2d23478c 100644 --- a/modules.json +++ b/modules.json @@ -27,6 +27,11 @@ "installed_by": ["modules", "vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, + "deepsomatic": { + "branch": "master", + "git_sha": "ddb0d667cf6cdee3bab9497241de4bbf6b88d8cc", + "installed_by": ["modules"] + }, "deepvariant/callvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", diff --git a/modules/nf-core/deepsomatic/main.nf b/modules/nf-core/deepsomatic/main.nf new file mode 100644 index 00000000..7a17793e --- /dev/null +++ b/modules/nf-core/deepsomatic/main.nf @@ -0,0 +1,71 @@ +process DEEPSOMATIC { + tag "$meta.id" + label 'process_high' + + container "docker.io/google/deepsomatic:1.7.0" + input: + tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) + tuple val(meta2), path(intervals) + tuple val(meta3), path(fasta) + tuple val(meta4), path(fai) + tuple val(meta5), path(gzi) + + output: + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: vcf_tbi + tuple val(meta), path("${prefix}.g.vcf.gz") , emit: gvcf + tuple val(meta), path("${prefix}.g.vcf.gz.tbi"), emit: gvcf_tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def regions = intervals ? "--regions=${intervals}" : "" + def VERSION = '1.7.0' + + """ + run_deepsomatic \\ + --ref=${fasta} \\ + --reads_normal=${input_normal} \\ + --reads_tumor=${input_tumor} \\ + --output_vcf=${prefix}.vcf.gz \\ + --output_gvcf=${prefix}.g.vcf.gz \\ + --sample_name_tumor="tumor" \\ + --sample_name_normal="normal" \\ + ${args} \\ + ${regions} \\ + --intermediate_results_dir=tmp \\ + --num_shards=${task.cpus} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deepsomatic: $VERSION + END_VERSIONS + """ + + stub: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." + } + prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '1.7.0' + """ + echo "" | gzip > ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + echo "" | gzip > ${prefix}.g.vcf.gz + touch ${prefix}.g.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deepsomatic: $VERSION + END_VERSIONS + """ +} diff --git a/modules/nf-core/deepsomatic/meta.yml b/modules/nf-core/deepsomatic/meta.yml new file mode 100644 index 00000000..0d8afb5b --- /dev/null +++ b/modules/nf-core/deepsomatic/meta.yml @@ -0,0 +1,144 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "deepsomatic" +description: DeepSomatic is an extension of deep learning-based variant caller DeepVariant + that takes aligned reads (in BAM or CRAM format) from tumor and normal data, produces + pileup image tensors from them, classifies each tensor using a convolutional neural + network, and finally reports somatic variants in a standard VCF or gVCF file. +keywords: + - variant calling + - machine learning + - neural network +tools: + - "deepsomatic": + description: "" + homepage: "https://github.com/google/deepsomatic" + documentation: "https://github.com/google/deepsomatic" + tool_dev_url: "https://github.com/google/deepsomatic" + doi: "10.1101/2024.08.16.608331" + licence: ["BSD-3-clause"] + identifier: "biotools:deepsomatic" + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input_normal: + type: file + description: BAM/CRAM file + pattern: "*.bam/cram" + ontologies: [] + - index_normal: + type: file + description: Index of BAM/CRAM file + pattern: "*.bai/crai" + ontologies: [] + - input_tumor: + type: file + description: BAM/CRAM file + pattern: "*.bam/cram" + ontologies: [] + - index_tumor: + type: file + description: Index of BAM/CRAM file + pattern: "*.bai/crai" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - intervals: + type: file + description: file containing intervals + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + ontologies: [] + - - meta5: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - gzi: + type: file + description: GZI index of reference fasta file + pattern: "*.gzi" + + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}.vcf.gz: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + vcf_tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}.vcf.gz.tbi: + type: file + description: Index of compressed VCF file + pattern: "*.vcf.gz.tbi" + ontologies: [] + gvcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}.g.vcf.gz: + type: file + description: Compressed GVCF file + pattern: "*.g.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + gvcf_tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1', single_end:false ]` + - ${prefix}.g.vcf.gz.tbi: + type: file + description: Index of compressed Genotyped VCF file + pattern: "*.g.vcf.gz.tbi" + ontologies: [] + versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3750 # YAML +authors: + - "@vaxyzek" +maintainers: + - "@vaxyzek" diff --git a/modules/nf-core/deepsomatic/tests/main.nf.test b/modules/nf-core/deepsomatic/tests/main.nf.test new file mode 100644 index 00000000..eaa5f8fe --- /dev/null +++ b/modules/nf-core/deepsomatic/tests/main.nf.test @@ -0,0 +1,59 @@ +nextflow_process { + + name "Test Process DEEPSOMATIC" + script "../main.nf" + process "DEEPSOMATIC" + + tag "modules" + tag "modules_nfcore" + tag "deepsomatic" + + test("tumor_normal_pair") { + config './nextflow.config' + + when { + process { + """ + input[0] = [ + [ id:'tumor_vs_normal' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true) + ] + input[1] = [ + [ id:'intervals' ], + [] + ] + input[2] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) + ] + input[3] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) + ] + input[4] = [ + [ id: 'gzi' ], + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { + assert snapshot( + process.out.vcf.collect { file(it[1]).getName() }, + process.out.tbi.collect { file(it[1]).getName() }, + process.out.versions, + ).match() + } + ) + } + + } + +} diff --git a/modules/nf-core/deepsomatic/tests/main.nf.test.snap b/modules/nf-core/deepsomatic/tests/main.nf.test.snap new file mode 100644 index 00000000..1a7886ec --- /dev/null +++ b/modules/nf-core/deepsomatic/tests/main.nf.test.snap @@ -0,0 +1,20 @@ +{ + "tumor_normal_pair": { + "content": [ + [ + "tumor_vs_normal_out.vcf.gz" + ], + [ + + ], + [ + "versions.yml:md5,d64cbd049771dd1a8d0885499ea16f11" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.3" + }, + "timestamp": "2024-10-22T21:52:00.932502018" + } +} \ No newline at end of file diff --git a/modules/nf-core/deepsomatic/tests/nextflow.config b/modules/nf-core/deepsomatic/tests/nextflow.config new file mode 100644 index 00000000..fff76401 --- /dev/null +++ b/modules/nf-core/deepsomatic/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: DEEPSOMATIC { + ext.args = "--regions='chr21:6110000-6120000'" + ext.prefix = { "${meta.id}_out" } + } +} From d30352103dc3d2107fae3ad4e5561d230691bc4f Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 14:48:34 +0100 Subject: [PATCH 110/183] change to skip_fibernormal --- nextflow.config | 4 +- nextflow_schema.json | 113 ++++++++++++++++++++++++++++++++--------- workflows/lrsomatic.nf | 12 ++--- 3 files changed, 96 insertions(+), 33 deletions(-) diff --git a/nextflow.config b/nextflow.config index e34c7421..6f7ded21 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,9 +26,6 @@ params { vep_custom = null vep_custom_tbi = null - - normal_fiber = true - // Skip options skip_qc = false skip_cramino = false @@ -37,6 +34,7 @@ params { skip_ascat = false skip_wakhan = false skip_fiber = false + skip_normalfiber = false skip_m6a = false skip_vep = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 0680cc6d..c8cc3904 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -70,23 +70,6 @@ "fa_icon": "fas fa-ban", "hidden": true, "default": "s3://ngi-igenomes/igenomes/" - }, - "vep_cache": { - "type": "string", - "description": "Path to VEP cache directory.", - "fa_icon": "fas fa-database", - "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself." - }, - "vep_cache_version": { - "type": "integer", - "description": "Version of the VEP cache to use.", - "fa_icon": "fas fa-hashtag", - "help_text": "The version of the VEP cache to use. This should match the version of VEP being used." - }, - "vep_args": { - "type": "string", - "description": "Additional command line arguments to pass to VEP.", - "fa_icon": "fas fa-terminal" } } }, @@ -111,6 +94,66 @@ } } }, + "fibertools_options": { + "title": "Fibertools options", + "type": "object", + "description": "", + "default": "", + "properties": { + "autocorrelation": { + "type": "string" + } + } + }, + "vep_options": { + "title": "VEP options", + "type": "object", + "description": "", + "default": "", + "properties": { + "vep_cache": { + "type": "string", + "description": "Path to VEP cache directory.", + "fa_icon": "fas fa-database", + "help_text": "Path to the directory containing the VEP cache. If you are using an iGenomes reference, this will be set automatically. Otherwise, you will need to provide this path yourself.", + "default": "s3://annotation-cache/vep_cache/" + }, + "vep_args": { + "type": "string", + "description": "Additional command line arguments to pass to VEP.", + "fa_icon": "fas fa-terminal", + "default": "--everything --filter_common --per_gene --total_length --offline --format vcf" + }, + "vep_cache_version": { + "type": "integer", + "description": "Version of the VEP cache to use.", + "fa_icon": "fas fa-hashtag", + "help_text": "The version of the VEP cache to use. This should match the version of VEP being used.", + "default": 113 + }, + "download_vep_cache": { + "type": "boolean" + }, + "vep_custom": { + "type": "string" + }, + "vep_custom_tbi": { + "type": "string" + } + } + }, + "severus_options": { + "title": "Severus options", + "type": "object", + "description": "", + "default": "", + "properties": { + "severus_minsupport": { + "type": "integer", + "default": 3 + } + } + }, "ascat_parameters": { "title": "ASCAT parameters", "type": "object", @@ -173,6 +216,17 @@ } } }, + "wakhan_options": { + "title": "Wakhan options", + "type": "object", + "description": "", + "default": "", + "properties": { + "wakhan_chroms": { + "type": "string" + } + } + }, "skip_options": { "title": "Skip options", "type": "object", @@ -210,6 +264,12 @@ "skip_m6a": { "type": "boolean", "description": "Skip m6a calling by Fibertools" + }, + "skip_vep": { + "type": "boolean" + }, + "skip_normalfiber": { + "type": "boolean" } } }, @@ -356,13 +416,6 @@ "description": "Suffix to add to the trace report filename. Default is the date and time in the format yyyy-MM-dd_HH-mm-ss.", "hidden": true }, - "normal_fiber": { - "type": "boolean", - "default": true, - "description": "do fiber-seq on normal samples", - "fa_icon": "fas fa-fiber", - "hidden": true - }, "help": { "type": ["boolean", "string"], "description": "Display the help message." @@ -388,9 +441,21 @@ { "$ref": "#/$defs/minimap2_options" }, + { + "$ref": "#/$defs/fibertools_options" + }, + { + "$ref": "#/$defs/vep_options" + }, + { + "$ref": "#/$defs/severus_options" + }, { "$ref": "#/$defs/ascat_parameters" }, + { + "$ref": "#/$defs/wakhan_options" + }, { "$ref": "#/$defs/skip_options" }, diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index ee9eb2ed..0260df60 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -220,7 +220,10 @@ workflow LRSOMATIC { // predict m6a in unaligned bam if (!params.skip_fiber) { - if(!params.normal_fiber){ + if (!params.skip_normalfiber){ + ubams = ch_cat_ubams + } + else { ch_cat_ubams .branch { meta, _bams -> normal: meta.type == "normal" @@ -230,9 +233,6 @@ workflow LRSOMATIC { normal_bams = ch_cat_ubams_normal_branching.normal ubams = ch_cat_ubams_normal_branching.tumor - } - else { - ubams = ch_cat_ubams } ubams .branch{ meta, _bams -> @@ -292,15 +292,15 @@ workflow LRSOMATIC { FIBERTOOLSRS_NUCLEOSOMES.out.bam ) - if(!params.normal_fiber){ + if (!params.skip_normalfiber){ fiber_branch.nonFiber - .mix(normal_bams) .mix(FIBERTOOLSRS_FIRE.out.bam) .set{ch_cat_ubams} } else { fiber_branch.nonFiber + .mix(normal_bams) .mix(FIBERTOOLSRS_FIRE.out.bam) .set{ch_cat_ubams} From 457e869ce44d5f3881f88862bc0297be0139277b Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Thu, 12 Mar 2026 15:08:15 +0100 Subject: [PATCH 111/183] Update conf/modules.config Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index afc580e8..8495ae03 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -216,7 +216,7 @@ process { withName: '.*:SEVERUS' { ext.prefix = "." - ext.args = '--min-support ${params.severus_minsupport} --output-read-ids ' + ext.args = { "--min-support ${params.severus_minsupport} --output-read-ids " } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/severus" }, mode: params.publish_dir_mode, From 43f94815801d62007486c6dd2908644bf76440ba Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Thu, 12 Mar 2026 15:08:36 +0100 Subject: [PATCH 112/183] Update nextflow.config Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 6f7ded21..a264823a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -44,7 +44,7 @@ params { save_secondary_alignment = true // Fibertools options - params.autocorrelation = null + autocorrelation = null // Severus options severus_minsupport = 3 From ca2b603aa42e7cbae6091d8482c5746f263d95a4 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 12 Mar 2026 15:11:44 +0100 Subject: [PATCH 113/183] fix snap --- tests/.nftignore | 5 ++++- tests/default.nf.test.snap | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index 1553a3f3..becfbfa3 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -20,4 +20,7 @@ pipeline_info/*.{html,json,txt,yml} */qc/{tumor,normal}/{cramino_aln}/*_cramino.txt */qc/{tumor,normal}/{cramino_ubam}_*/*_cramino.txt */qc/{tumor,normal}/{nanoplot_ubam}_*/*.html -*/qc/{tumor,normal}/{nanoplot_alt}/*.html +*/qc/{tumor,normal}/{nanoplot_aln}/*.html +*/qc/{tumor,normal}/{nanoplot_ubam}_*/*.txt +*/qc/{tumor,normal}/{nanoplot_aln}/*.txt +*/qc/{tumor,normal}/{mosdepth}/*.txt diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 7038227c..0946f21f 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -490,6 +490,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-12T13:44:30.997427763" + "timestamp": "2026-03-12T15:06:45.544824708" } } \ No newline at end of file From 2b7bd9824b6aa3d219c9a73ea6299e2cfe379e06 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 16:34:10 +0100 Subject: [PATCH 114/183] update snaps --- tests/default.nf.test.snap | 167 ++++++++++--------------------------- 1 file changed, 43 insertions(+), 124 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 825e483d..001dc76a 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -44,9 +44,6 @@ "MOSDEPTH": { "mosdepth": "0.3.11" }, - "SAMTOOLS_CAT": { - "samtools": "1.22.1" - }, "SAMTOOLS_FAIDX": { "samtools": "1.22.1" }, @@ -338,134 +335,56 @@ "sample3/vep/somatic", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html", - "sample4", - "sample4/bamfiles", - "sample4/bamfiles/sample4_normal.bam", - "sample4/bamfiles/sample4_normal.bam.bai", - "sample4/bamfiles/sample4_tumor.bam", - "sample4/bamfiles/sample4_tumor.bam.bai", - "sample4/qc", - "sample4/qc/normal", - "sample4/qc/normal/cramino_aln", - "sample4/qc/normal/cramino_aln/sample4_cramino.txt", - "sample4/qc/normal/cramino_ubam", - "sample4/qc/normal/cramino_ubam/sample4_cramino.txt", - "sample4/qc/normal/mosdepth", - "sample4/qc/normal/mosdepth/sample4.mosdepth.global.dist.txt", - "sample4/qc/normal/mosdepth/sample4.mosdepth.summary.txt", - "sample4/qc/normal/samtools", - "sample4/qc/normal/samtools/sample4.flagstat", - "sample4/qc/normal/samtools/sample4.idxstats", - "sample4/qc/normal/samtools/sample4.stats", - "sample4/qc/tumor", - "sample4/qc/tumor/cramino_aln", - "sample4/qc/tumor/cramino_aln/sample4_cramino.txt", - "sample4/qc/tumor/cramino_ubam", - "sample4/qc/tumor/cramino_ubam/sample4_cramino.txt", - "sample4/qc/tumor/mosdepth", - "sample4/qc/tumor/mosdepth/sample4.mosdepth.global.dist.txt", - "sample4/qc/tumor/mosdepth/sample4.mosdepth.summary.txt", - "sample4/qc/tumor/samtools", - "sample4/qc/tumor/samtools/sample4.flagstat", - "sample4/qc/tumor/samtools/sample4.idxstats", - "sample4/qc/tumor/samtools/sample4.stats", - "sample4/variants", - "sample4/variants/clair3", - "sample4/variants/clair3/merge_output.vcf.gz", - "sample4/variants/clair3/merge_output.vcf.gz.tbi", - "sample4/variants/clairs", - "sample4/variants/clairs/indel.vcf.gz", - "sample4/variants/clairs/indel.vcf.gz.tbi", - "sample4/variants/clairs/snvs.vcf.gz", - "sample4/variants/clairs/snvs.vcf.gz.tbi", - "sample4/variants/severus", - "sample4/variants/severus/all_SVs", - "sample4/variants/severus/all_SVs/severus_all.vcf.gz", - "sample4/variants/severus/breakpoints_double.csv", - "sample4/variants/severus/read_ids.csv", - "sample4/variants/severus/read_qual.txt", - "sample4/variants/severus/severus.log", - "sample4/variants/severus/somatic_SVs", - "sample4/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample4/vep", - "sample4/vep/SVs", - "sample4/vep/SVs/sample4_SV_VEP.vcf.gz", - "sample4/vep/SVs/sample4_SV_VEP.vcf.gz.tbi", - "sample4/vep/SVs/sample4_SV_VEP.vcf.gz_summary.html", - "sample4/vep/germline", - "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz", - "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz.tbi", - "sample4/vep/germline/sample4_GERMLINE_VEP.vcf.gz_summary.html", - "sample4/vep/somatic", - "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz", - "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz.tbi", - "sample4/vep/somatic/sample4_SOMATIC_VEP.vcf.gz_summary.html" + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,60838033f5f24aa90e16a5babcddd45b", - "sample1_normal.bam.bai:md5,d77c4e82c8965132967be86d83a4992d", - "sample1_tumor.bam:md5,bd73e83253c95a5fdc4db39454ee2253", - "sample1_tumor.bam.bai:md5,8b9edeb60b0e3023c97aa4b6e2e61380", - "sample1.mosdepth.global.dist.txt:md5,4e1c72f8465c18ffd854c42850eb7c5f", - "sample1.mosdepth.summary.txt:md5,cf13d4b24e5ebf31b629a1195a1fff41", - "sample1.flagstat:md5,815a5385bd57ef44847714130b80d630", - "sample1.idxstats:md5,19be02d7e966e4a291b66ab5b14742d3", - "sample1.stats:md5,cf4b23c58e65cb55b31463db14ed6fd3", - "sample1.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample1.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "sample1.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample1.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample1.stats:md5,da6ea076dd90b4e35ab2e23b8e6ead25", - "breakpoints_double.csv:md5,57e4f0d5509db44179e7c5044c6bc259", - "read_qual.txt:md5,1ad9d1900f8dcb291c97adc65c9d341c", - "sample2_normal.bam:md5,554b89692e84b9ddd0615649e2b15820", - "sample2_normal.bam.bai:md5,af193f1922d90b8741212d2bf690c418", - "sample2_tumor.bam:md5,26c4e52c12aa0e874fe52ae3b729beba", - "sample2_tumor.bam.bai:md5,e9e64e13328aa3621e7976f8e3f29a78", - "sample2.mosdepth.global.dist.txt:md5,6cdc97a81a603db702cb5a113b8bc62a", - "sample2.mosdepth.summary.txt:md5,864370930ec1d695d942f4960bcf8fc6", - "sample2.flagstat:md5,cce0bb7ca79e14d8369ccc714adf4be3", - "sample2.idxstats:md5,e7de97b2362a8e944896dc4eca0b0bd8", - "sample2.stats:md5,2b7f1a2833840d350d2a4d54fed70cf7", - "sample2.mosdepth.global.dist.txt:md5,eda3bf93b39e342e85e43931ce8b417e", - "sample2.mosdepth.summary.txt:md5,a68ca9504f5c9b73bf697d8ac22a1df0", - "sample2.flagstat:md5,83e7d7d922941691d2b023f0bd9655aa", - "sample2.idxstats:md5,fe8a5d1263481ea7902d575b4d95f655", - "sample2.stats:md5,defe74842396209b6cff4b32994287c7", - "breakpoints_double.csv:md5,b71bba578c126b9217765d854b21028a", - "read_qual.txt:md5,27edf87814aec6fa18546c8606aae4ed", - "sample3_tumor.bam:md5,2308beb1b4be1f0e1d6c8e52bd4f9266", - "sample3_tumor.bam.bai:md5,840eb3ad5ed3216a97c6a58563d4dcb1", - "sample3.mosdepth.global.dist.txt:md5,e04da37ef2b7cd587fa3158b9f36d2cb", - "sample3.mosdepth.summary.txt:md5,ef3aefa72ca2e9bbbe5acc91fc1ecde6", - "sample3.flagstat:md5,34e851b5504d961632f26991160ded5a", - "sample3.idxstats:md5,1d43b03114bcc9b70d4333e91498efbe", - "sample3.stats:md5,b0f46b772514f0de08f1b2d88aa5968f", - "breakpoints_double.csv:md5,298a01c868eb493baaaa90ced9a9f17e", - "read_qual.txt:md5,1b4392f3b9071533e9ea77ff9df6c813", - "sample4_normal.bam:md5,1244bbb36a3fd5921f50eaa1933221d9", - "sample4_normal.bam.bai:md5,b5781f18020f89190768cc79cc15bfc9", - "sample4_tumor.bam:md5,f177881083a1dc6918c8206fd1125850", - "sample4_tumor.bam.bai:md5,4b60c72c6e9bce15010a029d854bb5b9", - "sample4.mosdepth.global.dist.txt:md5,431a1e9eb9e396ac0a5a9d8c1cbbc4be", - "sample4.mosdepth.summary.txt:md5,37c50bb51cff8d0a05d55c44bbecfac8", - "sample4.flagstat:md5,0324d26e70952dc7d7525b9b2b3397af", - "sample4.idxstats:md5,a4f00d06210fa9cae6664f4326fe3c61", - "sample4.stats:md5,98260d38e8dd9c4e3a9ef56c15e4e600", - "sample4.mosdepth.global.dist.txt:md5,3830fc5e90f49c2a87b12db0cb327e83", - "sample4.mosdepth.summary.txt:md5,c37156c0a4cfd888069d7af46c59adfc", - "sample4.flagstat:md5,c129f6e33ad95e7e46a3e49b7ef382ce", - "sample4.idxstats:md5,a03565b3c0a3ad7033c4ecd1ba742a8b", - "sample4.stats:md5,1f9d1370ccd44dc1239468d98982d84f", - "breakpoints_double.csv:md5,319b8e3bdfbec8339a8c6f1ceb4384a5", - "read_qual.txt:md5,6c47ff1f1adacd44fa4822c8237c92ac" + "sample1_normal.bam:md5,7714d4b2db4d97b609c9a58f94e9a550", + "sample1_normal.bam.bai:md5,b5e6df2994304fd78ecd2b3b8fea87ee", + "sample1_tumor.bam:md5,b0f1bdae9bbdb901eced7297088a5d1e", + "sample1_tumor.bam.bai:md5,fc1f6cd9556c7d1d08a9a52c7ee97cbb", + "sample1.mosdepth.global.dist.txt:md5,3a2453e732739b9de78f9317088b6a08", + "sample1.mosdepth.summary.txt:md5,72cc32b34f50ddf2f2a4dc0493ec4c06", + "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", + "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", + "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", + "sample1.mosdepth.global.dist.txt:md5,0261d6ce325dac9c1e01af705c5896db", + "sample1.mosdepth.summary.txt:md5,4c3e4eed9c0a65d93b2aecccb3d8312a", + "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", + "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "sample2_normal.bam:md5,b2b52d2ff82220cd393fa353cf931207", + "sample2_normal.bam.bai:md5,a82a6a8a6ad1879588befe5c5869d598", + "sample2_tumor.bam:md5,f63adccc34154d53e36766ca30db1512", + "sample2_tumor.bam.bai:md5,015b8dc2ccd1e8f4338c94bc6f81ed40", + "sample2.mosdepth.global.dist.txt:md5,2789d14f7549f264a55bfe16a1611375", + "sample2.mosdepth.summary.txt:md5,890f1533c45bda31d4f4d9d8786bceb1", + "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", + "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", + "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", + "sample2.mosdepth.global.dist.txt:md5,9f2a17c0fa50bf6a262472fba01ba837", + "sample2.mosdepth.summary.txt:md5,c3bc3eeda5c46e9d61073439ef3c969c", + "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", + "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", + "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", + "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "sample3_tumor.bam:md5,24e3b7bee7a0d8a01303f677d2b87b08", + "sample3_tumor.bam.bai:md5,d2038319977bd78352927c16ef3f1a21", + "sample3.mosdepth.global.dist.txt:md5,0261d6ce325dac9c1e01af705c5896db", + "sample3.mosdepth.summary.txt:md5,4c3e4eed9c0a65d93b2aecccb3d8312a", + "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", + "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], "meta": { "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2026-03-11T19:35:17.289539787" + "timestamp": "2026-03-12T16:33:44.185488571" } } \ No newline at end of file From 18706bf6d40efdcf1bef7424f014ac107dc1b08a Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 12 Mar 2026 16:38:41 +0100 Subject: [PATCH 115/183] make pretty --- .../utils_nfcore_lrsomatic_pipeline/main.nf | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 7ccf33e6..94d8789b 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -96,10 +96,10 @@ workflow PIPELINE_INITIALISATION { sex: sex, fiber: fiber, clair3_model: real_clair3_model, - clairS_model : real_clairS_model, + clairS_model: real_clairS_model, clairSTO_model: real_clairSTO_model, - tumor_replicate : tumor_replicate, - normal_replicate : normal_replicate] + tumor_replicate: tumor_replicate, + normal_replicate: normal_replicate] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } .map { meta, bam_tumor, bam_normal -> @@ -110,15 +110,15 @@ workflow PIPELINE_INITIALISATION { meta_tumor.type = 'tumor' meta_tumor.replicate = meta_tumor.tumor_replicate meta_tumor = meta_tumor.subMap('id', - 'paired_data', - 'type', - 'platform', - 'sex', - 'fiber', - 'clair3_model', - 'clairS_model', - 'clairSTO_model', - 'replicate') + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'replicate') def result = [[meta_tumor, tumor_bam]] if (normal_bam) { @@ -126,15 +126,15 @@ workflow PIPELINE_INITIALISATION { meta_normal.type = 'normal' meta_normal.replicate = meta_normal.normal_replicate meta_normal = meta_normal.subMap('id', - 'paired_data', - 'type', - 'platform', - 'sex', - 'fiber', - 'clair3_model', - 'clairS_model', - 'clairSTO_model', - 'replicate') + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'replicate') result << [meta_normal, normal_bam] } From 091e52d785b9f87a5b8d874347f3a1baab760ae2 Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Thu, 12 Mar 2026 19:03:33 +0100 Subject: [PATCH 116/183] Update workflows/lrsomatic.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- workflows/lrsomatic.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 99a15426..aa50b0bb 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -369,7 +369,7 @@ workflow LRSOMATIC { // branched_minimap.tumor_only: [meta, bam, bai] // - // SUBWORFKLOW: TUMOR_NORMAL_HAPPHASE + // SUBWORKFLOW: TUMOR_NORMAL_HAPPHASE // // Phasing/haplotaging/small germline variant calling for tumor-normal samples From 63259021497edf2605750e66e33a96b5b172f8d3 Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Thu, 12 Mar 2026 19:04:02 +0100 Subject: [PATCH 117/183] Update subworkflows/local/tumor_normal_happhase.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- subworkflows/local/tumor_normal_happhase.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 20499c5b..0580c10e 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -52,7 +52,7 @@ workflow TUMOR_NORMAL_HAPPHASE { return [ new_meta, meta.clair3_model, bam, bai ] } .set { normal_bams_model } - // [clair3_model_id, meta, bam, bai] -- keyed by model ID for .combine() with downloaded_clair3_models + // [meta, clair3_model_id, bam, bai] -- keyed by model ID for .combine() with downloaded_clair3_models normal_bams_model .combine(downloaded_clair3_models,by:1) From 55c1a3123d21235f3e758a3900e3e3646c249784 Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Thu, 12 Mar 2026 19:04:23 +0100 Subject: [PATCH 118/183] Update docs/usage.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 5d778b43..41c00db3 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -99,7 +99,7 @@ You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-c ## CHM13 Support -Our pipeline fully supports CHM13 and most reference and annotation files are automatically downloaded when specifiying `--genome CHM13`. +Our pipeline fully supports CHM13 and most reference and annotation files are automatically downloaded when specifying `--genome CHM13`. However, VEP will need a bit of additional setup. The VEP cache for CHM13 needs to be manually downloaded. This can be done using the following code. Feel free to change any of the paths, ensuring that the correct path is pointed to in the pipeline parameters. From f3ab1e9f8ec96b15a974a9699f8304b78d8a616b Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Thu, 12 Mar 2026 19:04:41 +0100 Subject: [PATCH 119/183] Update docs/usage.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/usage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/usage.md b/docs/usage.md index 41c00db3..ec325e2e 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -123,7 +123,7 @@ nextflow run IntGenomicsLab/lrsomatic \ -profile docker ``` -If you do not specify `CHM13` with `--genome CHM13` you additionally need to specify `--vep_genome T2T-CHM13v2.0` and `--vep_species homo_sapiens_gca009914755v4`. +If you want to run with a CHM13 reference without using `--genome CHM13` (for example, via a custom FASTA or configuration), you must also specify `--vep_genome T2T-CHM13v2.0` and `--vep_species homo_sapiens_gca009914755v4`. ### Pipeline options From 173c182350cd6c370757e35abc0ea9c78a9ceb43 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 11:29:30 +0100 Subject: [PATCH 120/183] add nanoplot to multiqc output --- conf/modules.config | 12 ++++++++---- modules/nf-core/nanoplot/main.nf | 9 +++++++++ workflows/lrsomatic.nf | 4 +++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5726763c..9ffd0859 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,33 +42,37 @@ process { } withName: '.*:CRAMINO_PRE' { + ext.prefix = { "${meta.id}_${meta.type}" } ext.args = '--ubam' publishDir = [ path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_ubam_${meta.replicate}/" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('.arrow') ? null : filename } ] } withName: '.*:CRAMINO_POST' { + ext.prefix = { "${meta.id}_${meta.type}" } publishDir = [ path: { "${params.outdir}/${meta.id}/qc/${meta.type}/cramino_aln" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') || filename.endsWith('.arrow') ? null : filename } ] } withName: '.*:NANOPLOT_PRE' { + ext.prefix = { "${meta.id}_${meta.type}_ubam" } publishDir = [ - path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_ubam_${meta.replicate}/" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_ubam${meta.replicate}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } withName: '.*:NANOPLOT_POST' { + ext.prefix = { "${meta.id}_${meta.type}_aln" } publishDir = [ - path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_aln" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_aln" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/modules/nf-core/nanoplot/main.nf b/modules/nf-core/nanoplot/main.nf index 2bb02b20..c87aa758 100644 --- a/modules/nf-core/nanoplot/main.nf +++ b/modules/nf-core/nanoplot/main.nf @@ -20,6 +20,7 @@ process NANOPLOT { task.ext.when == null || task.ext.when script: + def prefix = task.ext.prefix ?: "${meta.id}" def args = task.ext.args ?: '' def input_file = ("$ontfile".endsWith(".fastq.gz") || "$ontfile".endsWith(".fq.gz")) ? "--fastq ${ontfile}" : ("$ontfile".endsWith(".txt")) ? "--summary ${ontfile}" : ("$ontfile".endsWith(".arrow")) ? "--arrow ${ontfile}" : '' @@ -29,6 +30,14 @@ process NANOPLOT { -t $task.cpus \\ $input_file + for nanoplot_file in *.html *.png *.txt *.log + do + if [[ -s \$nanoplot_file ]] + then + mv \$nanoplot_file ${prefix}_\$nanoplot_file + fi + done + cat <<-END_VERSIONS > versions.yml "${task.process}": nanoplot: \$(echo \$(NanoPlot --version 2>&1) | sed 's/^.*NanoPlot //; s/ .*\$//') diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index aa50b0bb..80ca5b56 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -626,7 +626,7 @@ workflow LRSOMATIC { // // MODULE: MultiQC // - summary_params = paramsSummaryMap( + summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) ch_multiqc_files = ch_multiqc_files.mix( @@ -654,6 +654,8 @@ workflow LRSOMATIC { ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it -> it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(NANOPLOT_PRE.out.txt.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(NANOPLOT_POST.out.txt.collect{it -> it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files From 47f690a54f322831fe1e025a422f825621abf833 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 11:30:31 +0100 Subject: [PATCH 121/183] prettier --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 9ffd0859..41c02385 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -72,7 +72,7 @@ process { withName: '.*:NANOPLOT_POST' { ext.prefix = { "${meta.id}_${meta.type}_aln" } publishDir = [ - path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_aln" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_aln" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 388d18075442cf8cbdd712f18d3409f078a35f03 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 13 Mar 2026 11:39:36 +0100 Subject: [PATCH 122/183] get deepvariant running --- .gitignore | 1 + conf/modules.config | 30 +++++++++++++++++++++ conf/test.config | 13 +++++++++ subworkflows/local/tumor_normal_happhase.nf | 17 ++++++++++++ subworkflows/local/tumor_only_happhase.nf | 16 +++++++++++ subworkflows/nf-core/deepvariant/main.nf | 2 +- 6 files changed, 78 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9e307203..8be7152c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ testing* null/ .nf-test .nf-test.log +out/ \ No newline at end of file diff --git a/conf/modules.config b/conf/modules.config index ce3ec749..ce03c41c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -87,6 +87,36 @@ process { ] } + withName: '.*DEEPVARIANT_MAKEEXAMPLES' { + ext.args = { + meta.platform == 'pb' + ? '--channel_list "BASE_CHANNELS,haplotype,base_6ma" --alt_aligned_pileup "diff_channels" --pileup_image_width "147"' + : '--channel_list "BASE_CHANNELS,haplotype" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"' + } + publishDir = [ + enabled: false + ] + } + + withName: '.*DEEPVARIANT_POSTPROCESSVARIANTS' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/deepvariant" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*DEEPVARIANT_CALLVARIANTS' { + ext.args = { + meta.platform == 'pb' ? ("--checkpoint '/opt/models/pacbio' ") : ("--checkpoint '/opt/models/ont_r104'") + } + publishDir = [ + enabled : false + ] + } + + + withName: '.*:UNZIP_.*' { publishDir = [ enabled: false diff --git a/conf/test.config b/conf/test.config index 416ed610..8b9b08f4 100644 --- a/conf/test.config +++ b/conf/test.config @@ -18,6 +18,19 @@ process { time: '1.h' ] } + + withName: '.*DEEPVARIANT_MAKEEXAMPLES' { + ext.args = { + "--regions 'chr19'" + } + } + + withName: '.*DEEPVARIANT_POSTPROCESSVARIANTS' { + ext.args = { + "--regions 'chr19'" + } + } + } params { diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 6abe9941..2ccdbf5d 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -5,6 +5,8 @@ include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index include { CLAIRS } from '../../modules/local/clairs/main.nf' include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat' include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort' +include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' + workflow TUMOR_NORMAL_HAPPHASE { take: @@ -105,6 +107,21 @@ workflow TUMOR_NORMAL_HAPPHASE { fasta, fai ) + + normal_bams + .map {meta, bam, bai, _model, _platform -> + def intervals = [] + return [meta, bam, bai, intervals] + } + .set{deepvar_normal_bams} + + DEEPVARIANT ( + deepvar_normal_bams, + fasta, + fai, + [[:],[]], + [[:],[]] + ) // Add germline vcf to normal bams // remove clair3 model information diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 2e09f750..e051541e 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -3,6 +3,7 @@ include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' workflow TUMOR_ONLY_HAPPHASE { @@ -28,6 +29,21 @@ workflow TUMOR_ONLY_HAPPHASE { } .set{ tumor_bams } + tumor_bams + .map { meta, bam, bai, _clairSTO_model -> + def intervals = [] + return [meta,bam,bai, intervals] + } + .set{tumor_bams_deepvar} + + DEEPVARIANT ( + tumor_bams_deepvar, + fasta, + fai, + [[:],[]], + [[:],[]] + ) + // // MODULE: CLAIRSTO // diff --git a/subworkflows/nf-core/deepvariant/main.nf b/subworkflows/nf-core/deepvariant/main.nf index 439cbc90..0b358ff7 100644 --- a/subworkflows/nf-core/deepvariant/main.nf +++ b/subworkflows/nf-core/deepvariant/main.nf @@ -6,7 +6,7 @@ workflow DEEPVARIANT { take: ch_input // channel: [ val(meta), path(input), path(index), path(intervals)] ch_fasta // channel: [ val(meta2), path(fasta) ] - ch_fai // channel: [ val(meta3), path(fail) ] + ch_fai // channel: [ val(meta3), path(fai) ] ch_gzi // channel: [ val(meta4), path(gzi) ] ch_par_bed // channel: [ val(meta5), path(par_bed) ] From cf9085662ef4cbfddacc0aef610c8ba07f1ad593 Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Fri, 13 Mar 2026 11:39:51 +0100 Subject: [PATCH 123/183] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- modules/nf-core/nanoplot/main.nf | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/nf-core/nanoplot/main.nf b/modules/nf-core/nanoplot/main.nf index c87aa758..ba7b9a69 100644 --- a/modules/nf-core/nanoplot/main.nf +++ b/modules/nf-core/nanoplot/main.nf @@ -45,16 +45,17 @@ process NANOPLOT { """ stub: + def prefix = task.ext.prefix ?: "${meta.id}" """ - touch LengthvsQualityScatterPlot_dot.html - touch LengthvsQualityScatterPlot_kde.html - touch NanoPlot-report.html - touch NanoStats.txt - touch Non_weightedHistogramReadlength.html - touch Non_weightedLogTransformed_HistogramReadlength.html - touch WeightedHistogramReadlength.html - touch WeightedLogTransformed_HistogramReadlength.html - touch Yield_By_Length.html + touch ${prefix}_LengthvsQualityScatterPlot_dot.html + touch ${prefix}_LengthvsQualityScatterPlot_kde.html + touch ${prefix}_NanoPlot-report.html + touch ${prefix}_NanoStats.txt + touch ${prefix}_Non_weightedHistogramReadlength.html + touch ${prefix}_Non_weightedLogTransformed_HistogramReadlength.html + touch ${prefix}_WeightedHistogramReadlength.html + touch ${prefix}_WeightedLogTransformed_HistogramReadlength.html + touch ${prefix}_Yield_By_Length.html cat <<-END_VERSIONS > versions.yml From 22fc6de893e3cd345878270ef639b619f6088748 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 11:46:42 +0100 Subject: [PATCH 124/183] snapshot, prettier and add skip_nanoplot --- nextflow.config | 1 + nextflow_schema.json | 4 + tests/default.nf.test.snap | 301 +++++++++++++++++++++---------------- workflows/lrsomatic.nf | 47 +++++- 4 files changed, 213 insertions(+), 140 deletions(-) diff --git a/nextflow.config b/nextflow.config index b03dbed8..c1315f99 100644 --- a/nextflow.config +++ b/nextflow.config @@ -32,6 +32,7 @@ params { // Skip options skip_qc = false skip_cramino = false + skip_nanoplot = false skip_mosdepth = false skip_bamstats = false skip_ascat = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 0680cc6d..b25ea2ee 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -210,6 +210,10 @@ "skip_m6a": { "type": "boolean", "description": "Skip m6a calling by Fibertools" + }, + "skip_nanoplot": { + "type": "boolean", + "description": "Skip Nanoplot" } } }, diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 0946f21f..8d9dba54 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -102,11 +102,13 @@ "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_nanostat.txt", "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", "multiqc/multiqc_data/multiqc_samtools_stats.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/nanostat_fasta_stats_table.txt", "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", "multiqc/multiqc_data/samtools-flagstat-table.txt", "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", @@ -119,6 +121,7 @@ "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/nanostat_fasta_stats_table.pdf", "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", @@ -134,6 +137,7 @@ "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/nanostat_fasta_stats_table.png", "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", "multiqc/multiqc_plots/png/samtools-flagstat-table.png", "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", @@ -149,6 +153,7 @@ "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/nanostat_fasta_stats_table.svg", "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", @@ -172,66 +177,62 @@ "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", - "sample1/qc/normal/cramino_aln/sample1.arrow", - "sample1/qc/normal/cramino_aln/sample1_cramino.txt", + "sample1/qc/normal/cramino_aln/sample1_normal_cramino.txt", "sample1/qc/normal/cramino_ubam_1", - "sample1/qc/normal/cramino_ubam_1/sample1.arrow", - "sample1/qc/normal/cramino_ubam_1/sample1_cramino.txt", + "sample1/qc/normal/cramino_ubam_1/sample1_normal_cramino.txt", "sample1/qc/normal/mosdepth", "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", "sample1/qc/normal/nanoplot_aln", - "sample1/qc/normal/nanoplot_aln/NanoPlot-report.html", - "sample1/qc/normal/nanoplot_aln/NanoStats.txt", - "sample1/qc/normal/nanoplot_aln/Non_weightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample1/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", - "sample1/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", - "sample1/qc/normal/nanoplot_aln/WeightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/Yield_By_Length.html", - "sample1/qc/normal/nanoplot_ubam_1", - "sample1/qc/normal/nanoplot_ubam_1/NanoPlot-report.html", - "sample1/qc/normal/nanoplot_ubam_1/NanoStats.txt", - "sample1/qc/normal/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/WeightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/Yield_By_Length.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoStats.txt", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam1", + "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_Yield_By_Length.html", "sample1/qc/normal/samtools", "sample1/qc/normal/samtools/sample1.flagstat", "sample1/qc/normal/samtools/sample1.idxstats", "sample1/qc/normal/samtools/sample1.stats", "sample1/qc/tumor", "sample1/qc/tumor/cramino_aln", - "sample1/qc/tumor/cramino_aln/sample1.arrow", - "sample1/qc/tumor/cramino_aln/sample1_cramino.txt", + "sample1/qc/tumor/cramino_aln/sample1_tumor_cramino.txt", "sample1/qc/tumor/cramino_ubam_1", - "sample1/qc/tumor/cramino_ubam_1/sample1.arrow", - "sample1/qc/tumor/cramino_ubam_1/sample1_cramino.txt", + "sample1/qc/tumor/cramino_ubam_1/sample1_tumor_cramino.txt", "sample1/qc/tumor/mosdepth", "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", "sample1/qc/tumor/nanoplot_aln", - "sample1/qc/tumor/nanoplot_aln/NanoPlot-report.html", - "sample1/qc/tumor/nanoplot_aln/NanoStats.txt", - "sample1/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample1/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", - "sample1/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", - "sample1/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/Yield_By_Length.html", - "sample1/qc/tumor/nanoplot_ubam_1", - "sample1/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", - "sample1/qc/tumor/nanoplot_ubam_1/NanoStats.txt", - "sample1/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoStats.txt", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam1", + "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_Yield_By_Length.html", "sample1/qc/tumor/samtools", "sample1/qc/tumor/samtools/sample1.flagstat", "sample1/qc/tumor/samtools/sample1.idxstats", @@ -245,6 +246,9 @@ "sample1/variants/clairs/indel.vcf.gz.tbi", "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/severus_all.vcf.gz", @@ -276,66 +280,62 @@ "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", - "sample2/qc/normal/cramino_aln/sample2.arrow", - "sample2/qc/normal/cramino_aln/sample2_cramino.txt", + "sample2/qc/normal/cramino_aln/sample2_normal_cramino.txt", "sample2/qc/normal/cramino_ubam_1", - "sample2/qc/normal/cramino_ubam_1/sample2.arrow", - "sample2/qc/normal/cramino_ubam_1/sample2_cramino.txt", + "sample2/qc/normal/cramino_ubam_1/sample2_normal_cramino.txt", "sample2/qc/normal/mosdepth", "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", "sample2/qc/normal/nanoplot_aln", - "sample2/qc/normal/nanoplot_aln/NanoPlot-report.html", - "sample2/qc/normal/nanoplot_aln/NanoStats.txt", - "sample2/qc/normal/nanoplot_aln/Non_weightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample2/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", - "sample2/qc/normal/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", - "sample2/qc/normal/nanoplot_aln/WeightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/Yield_By_Length.html", - "sample2/qc/normal/nanoplot_ubam_1", - "sample2/qc/normal/nanoplot_ubam_1/NanoPlot-report.html", - "sample2/qc/normal/nanoplot_ubam_1/NanoStats.txt", - "sample2/qc/normal/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/WeightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/Yield_By_Length.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoStats.txt", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam1", + "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_Yield_By_Length.html", "sample2/qc/normal/samtools", "sample2/qc/normal/samtools/sample2.flagstat", "sample2/qc/normal/samtools/sample2.idxstats", "sample2/qc/normal/samtools/sample2.stats", "sample2/qc/tumor", "sample2/qc/tumor/cramino_aln", - "sample2/qc/tumor/cramino_aln/sample2.arrow", - "sample2/qc/tumor/cramino_aln/sample2_cramino.txt", + "sample2/qc/tumor/cramino_aln/sample2_tumor_cramino.txt", "sample2/qc/tumor/cramino_ubam_1", - "sample2/qc/tumor/cramino_ubam_1/sample2.arrow", - "sample2/qc/tumor/cramino_ubam_1/sample2_cramino.txt", + "sample2/qc/tumor/cramino_ubam_1/sample2_tumor_cramino.txt", "sample2/qc/tumor/mosdepth", "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", "sample2/qc/tumor/nanoplot_aln", - "sample2/qc/tumor/nanoplot_aln/NanoPlot-report.html", - "sample2/qc/tumor/nanoplot_aln/NanoStats.txt", - "sample2/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample2/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", - "sample2/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", - "sample2/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/Yield_By_Length.html", - "sample2/qc/tumor/nanoplot_ubam_1", - "sample2/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", - "sample2/qc/tumor/nanoplot_ubam_1/NanoStats.txt", - "sample2/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoStats.txt", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam1", + "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_Yield_By_Length.html", "sample2/qc/tumor/samtools", "sample2/qc/tumor/samtools/sample2.flagstat", "sample2/qc/tumor/samtools/sample2.idxstats", @@ -349,6 +349,9 @@ "sample2/variants/clairs/indel.vcf.gz.tbi", "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/severus_all.vcf.gz", @@ -378,33 +381,31 @@ "sample3/qc", "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", - "sample3/qc/tumor/cramino_aln/sample3.arrow", - "sample3/qc/tumor/cramino_aln/sample3_cramino.txt", + "sample3/qc/tumor/cramino_aln/sample3_tumor_cramino.txt", "sample3/qc/tumor/cramino_ubam_1", - "sample3/qc/tumor/cramino_ubam_1/sample3.arrow", - "sample3/qc/tumor/cramino_ubam_1/sample3_cramino.txt", + "sample3/qc/tumor/cramino_ubam_1/sample3_tumor_cramino.txt", "sample3/qc/tumor/mosdepth", "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", "sample3/qc/tumor/nanoplot_aln", - "sample3/qc/tumor/nanoplot_aln/NanoPlot-report.html", - "sample3/qc/tumor/nanoplot_aln/NanoStats.txt", - "sample3/qc/tumor/nanoplot_aln/Non_weightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/Non_weightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample3/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_dot.html", - "sample3/qc/tumor/nanoplot_aln/PercentIdentityvsAlignedReadLength_kde.html", - "sample3/qc/tumor/nanoplot_aln/WeightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/WeightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/Yield_By_Length.html", - "sample3/qc/tumor/nanoplot_ubam_1", - "sample3/qc/tumor/nanoplot_ubam_1/NanoPlot-report.html", - "sample3/qc/tumor/nanoplot_ubam_1/NanoStats.txt", - "sample3/qc/tumor/nanoplot_ubam_1/Non_weightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/Non_weightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/WeightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/WeightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoStats.txt", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam1", + "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_Yield_By_Length.html", "sample3/qc/tumor/samtools", "sample3/qc/tumor/samtools/sample3.flagstat", "sample3/qc/tumor/samtools/sample3.idxstats", @@ -419,6 +420,9 @@ "sample3/variants/clairsto/snv.vcf.gz.tbi", "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample3/variants/severus", "sample3/variants/severus/all_SVs", "sample3/variants/severus/all_SVs/severus_all.vcf.gz", @@ -443,53 +447,84 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,7714d4b2db4d97b609c9a58f94e9a550", - "sample1_normal.bam.bai:md5,b5e6df2994304fd78ecd2b3b8fea87ee", - "sample1_tumor.bam:md5,b0f1bdae9bbdb901eced7297088a5d1e", - "sample1_tumor.bam.bai:md5,fc1f6cd9556c7d1d08a9a52c7ee97cbb", - "sample1.arrow:md5,df57219f1bea7e7d5538ec4ee87dcf83", - "sample1.arrow:md5,36467bdd847baaa060817928d30bf091", + "sample1_normal.bam:md5,58854f8d427538288322ac20df574fe1", + "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", + "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", + "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", + "sample1_normal_ubam_NanoPlot-report.html:md5,9b661f887209996d347c99bb6693d1fe", + "sample1_normal_ubam_NanoStats.txt:md5,9890c05609383aa6705c684e2581493b", + "sample1_normal_ubam_Non_weightedHistogramReadlength.html:md5,9f04aa3896ee469fab34367c5fb1af9e", + "sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,23d22016d512a9aae99c2f0c14861298", + "sample1_normal_ubam_WeightedHistogramReadlength.html:md5,ba16b36bca3957110cd4fc50d6fb999e", + "sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,650461a2b6e6dcc942a086eeed31a991", + "sample1_normal_ubam_Yield_By_Length.html:md5,6c764f3176b30f4bd61464c1e399aabb", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", - "sample1.arrow:md5,de5f6de5e459d71d6cd4919eea616943", - "sample1.arrow:md5,b4102a193ca9eb2ebee0cd36b48c138d", + "sample1_tumor_ubam_NanoPlot-report.html:md5,470d67e5959f233e30ce0c4e287151ea", + "sample1_tumor_ubam_NanoStats.txt:md5,a58520cb39ad01cf3d51d3541ae9ca34", + "sample1_tumor_ubam_Non_weightedHistogramReadlength.html:md5,d4f766699f6681bdd0a2f2b3e6fae281", + "sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,56b765dfba73a5ccb1a5d4120241920d", + "sample1_tumor_ubam_WeightedHistogramReadlength.html:md5,bfc0c8b5697c66ed5426ffc17a4e749f", + "sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,d505066d4c1e219545c24252ef69a856", + "sample1_tumor_ubam_Yield_By_Length.html:md5,6d1ba463e2b5bb414565776892e87002", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", + "somatic_smallvariants.vcf.gz:md5,b4c30ef73260b5f51516a75c0543d6fa", + "somatic_smallvariants.vcf.gz.tbi:md5,d0a63e65ac7ff6ab98530591b1175da6", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", - "sample2_normal.bam:md5,b2b52d2ff82220cd393fa353cf931207", - "sample2_normal.bam.bai:md5,a82a6a8a6ad1879588befe5c5869d598", - "sample2_tumor.bam:md5,f63adccc34154d53e36766ca30db1512", - "sample2_tumor.bam.bai:md5,015b8dc2ccd1e8f4338c94bc6f81ed40", - "sample2.arrow:md5,6aa5eec1162a077f3bf8537c8f0db952", - "sample2.arrow:md5,04f75058ac7edf6f8dfe33b8bab3b78d", + "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", + "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", + "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", + "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", + "sample2_normal_ubam_NanoPlot-report.html:md5,5e71c4194efd9bda440c4b06244a18e0", + "sample2_normal_ubam_NanoStats.txt:md5,11bd84cd82bf107ed257cb4c8f9438c5", + "sample2_normal_ubam_Non_weightedHistogramReadlength.html:md5,c694d2cea1600b4ea844491d26475025", + "sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,7e0ed516472bcd259a37ff81cb2cd60a", + "sample2_normal_ubam_WeightedHistogramReadlength.html:md5,bb508cd4a38f2d5d3ab41cf79cd0b29f", + "sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,2c0dce9b1851e02d7e208f8e10c29d01", + "sample2_normal_ubam_Yield_By_Length.html:md5,7c2c0b4881e80c4a83848a1b286d9e93", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", - "sample2.arrow:md5,230ab87cb153beb945be51bc2e23f918", - "sample2.arrow:md5,838c7b7fa4e92e44094737f1b8dbbe56", + "sample2_tumor_ubam_NanoPlot-report.html:md5,f8a2f4e4f4584caf0dfcebd4a8a95c83", + "sample2_tumor_ubam_NanoStats.txt:md5,0ee15432d551cfc2fc138f108c45a5f2", + "sample2_tumor_ubam_Non_weightedHistogramReadlength.html:md5,c619711ee0a44dcb6f77441d6e3a7416", + "sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,0f7ca96a659ec8445c0bd80dc813c250", + "sample2_tumor_ubam_WeightedHistogramReadlength.html:md5,624c93f231f4b435a7580144580aa27e", + "sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,16edf74411b3140cfc97a5fcaa97d8fb", + "sample2_tumor_ubam_Yield_By_Length.html:md5,14ad903431effc711615ce535bc0d537", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", + "somatic_smallvariants.vcf.gz:md5,fd05e6540d7b8fa2ee43df2e96f812aa", + "somatic_smallvariants.vcf.gz.tbi:md5,d13967f57fe07d2289c4547a0470b1b4", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", - "sample3_tumor.bam:md5,24e3b7bee7a0d8a01303f677d2b87b08", - "sample3_tumor.bam.bai:md5,d2038319977bd78352927c16ef3f1a21", - "sample3.arrow:md5,de5f6de5e459d71d6cd4919eea616943", - "sample3.arrow:md5,b4102a193ca9eb2ebee0cd36b48c138d", + "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", + "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", + "sample3_tumor_ubam_NanoPlot-report.html:md5,c527fd63036a768eccb2c7c7144cdf3d", + "sample3_tumor_ubam_NanoStats.txt:md5,a58520cb39ad01cf3d51d3541ae9ca34", + "sample3_tumor_ubam_Non_weightedHistogramReadlength.html:md5,f474797151c3410895424ee94fedf8e8", + "sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,5c465a632b11d49afe49d0682250ee96", + "sample3_tumor_ubam_WeightedHistogramReadlength.html:md5,9cbde6a54da9472708fc80af284ed4c7", + "sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,76b7cbf0ae4fdf295110fe7b862db0ce", + "sample3_tumor_ubam_Yield_By_Length.html:md5,9e250d61ec770a59df33234778893305", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", + "somatic_smallvariants.vcf.gz:md5,0d47e0b09b96a9a28a5340c6866250a6", + "somatic_smallvariants.vcf.gz.tbi:md5,b214ac172efbf09133bda2ab6b93987d", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2026-03-12T15:06:45.544824708" + "timestamp": "2026-03-13T11:35:37.315075475" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 80ca5b56..fb73f922 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -156,9 +156,26 @@ workflow LRSOMATIC { downloaded_clair3_models = PREPARE_REFERENCE_FILES.out.downloaded_clair3_models + ch_nanoplot_pre_txt = channel.empty() + if (!params.skip_qc && !params.skip_cramino) { + + // + // Module: CRAMINO + // + CRAMINO_PRE( ch_samplesheet ) - NANOPLOT_PRE(CRAMINO_PRE.out.arrow) + + if (!params.skip_nanoplot) + + // + // Module: Nanoplot + // + + NANOPLOT_POST(CRAMINO_POST.out.arrow) + + } + } ch_samplesheet @@ -494,17 +511,33 @@ workflow LRSOMATIC { ) } - // - // MODULE: CRAMINO - // + + ch_nanoplot_post_txt = channel.empty() + if (!params.skip_qc && !params.skip_cramino) { + // + // MODULE: CRAMINO + // + CRAMINO_POST ( ch_minimap_bam ) - NANOPLOT_POST(CRAMINO_POST.out.arrow) + + if (!params.skip_nanoplot) + + // + // Module: Nanoplot + // + + NANOPLOT_POST(CRAMINO_POST.out.arrow) + + } + } + + // // Module: MOSDEPTH // @@ -654,8 +687,8 @@ workflow LRSOMATIC { ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_global.collect{it -> it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_mosdepth_summary.collect{it -> it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(NANOPLOT_PRE.out.txt.collect{it -> it[1]}.ifEmpty([])) - ch_multiqc_files = ch_multiqc_files.mix(NANOPLOT_POST.out.txt.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_nanoplot_pre_txt.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(ch_nanoplot_post_txt.collect{it -> it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files From 1694671c45a3991aca1fbe1999bddde8b5b4c4c8 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 12:03:06 +0100 Subject: [PATCH 125/183] update snapshot, fix bugs --- tests/default.nf.test.snap | 77 ++++++++++++++++++-------------------- workflows/lrsomatic.nf | 6 +-- 2 files changed, 39 insertions(+), 44 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 8d9dba54..3fa756e2 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -102,13 +102,11 @@ "multiqc/multiqc_data/multiqc_citations.txt", "multiqc/multiqc_data/multiqc_data.json", "multiqc/multiqc_data/multiqc_general_stats.txt", - "multiqc/multiqc_data/multiqc_nanostat.txt", "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", "multiqc/multiqc_data/multiqc_samtools_stats.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", - "multiqc/multiqc_data/nanostat_fasta_stats_table.txt", "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", "multiqc/multiqc_data/samtools-flagstat-table.txt", "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", @@ -121,7 +119,6 @@ "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", - "multiqc/multiqc_plots/pdf/nanostat_fasta_stats_table.pdf", "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", @@ -137,7 +134,6 @@ "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", - "multiqc/multiqc_plots/png/nanostat_fasta_stats_table.png", "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", "multiqc/multiqc_plots/png/samtools-flagstat-table.png", "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", @@ -153,7 +149,6 @@ "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", - "multiqc/multiqc_plots/svg/nanostat_fasta_stats_table.svg", "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", @@ -451,71 +446,71 @@ "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", - "sample1_normal_ubam_NanoPlot-report.html:md5,9b661f887209996d347c99bb6693d1fe", + "sample1_normal_ubam_NanoPlot-report.html:md5,be3693604268a0fab02485b7bb606c54", "sample1_normal_ubam_NanoStats.txt:md5,9890c05609383aa6705c684e2581493b", - "sample1_normal_ubam_Non_weightedHistogramReadlength.html:md5,9f04aa3896ee469fab34367c5fb1af9e", - "sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,23d22016d512a9aae99c2f0c14861298", - "sample1_normal_ubam_WeightedHistogramReadlength.html:md5,ba16b36bca3957110cd4fc50d6fb999e", - "sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,650461a2b6e6dcc942a086eeed31a991", - "sample1_normal_ubam_Yield_By_Length.html:md5,6c764f3176b30f4bd61464c1e399aabb", + "sample1_normal_ubam_Non_weightedHistogramReadlength.html:md5,257f634cdc2a2d243508654aceb46f49", + "sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,f50f7a3b17dc2ad14143a60fb6db18b6", + "sample1_normal_ubam_WeightedHistogramReadlength.html:md5,679af03ab8211478f7976849ca9aa59d", + "sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,fad7cc2e0a4138d5ca52fbcea013605a", + "sample1_normal_ubam_Yield_By_Length.html:md5,21cfd52990aaf1f803cb4fb56885cfcd", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", - "sample1_tumor_ubam_NanoPlot-report.html:md5,470d67e5959f233e30ce0c4e287151ea", + "sample1_tumor_ubam_NanoPlot-report.html:md5,6adc9282b33c9737d1f0b2926fe28f94", "sample1_tumor_ubam_NanoStats.txt:md5,a58520cb39ad01cf3d51d3541ae9ca34", - "sample1_tumor_ubam_Non_weightedHistogramReadlength.html:md5,d4f766699f6681bdd0a2f2b3e6fae281", - "sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,56b765dfba73a5ccb1a5d4120241920d", - "sample1_tumor_ubam_WeightedHistogramReadlength.html:md5,bfc0c8b5697c66ed5426ffc17a4e749f", - "sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,d505066d4c1e219545c24252ef69a856", - "sample1_tumor_ubam_Yield_By_Length.html:md5,6d1ba463e2b5bb414565776892e87002", + "sample1_tumor_ubam_Non_weightedHistogramReadlength.html:md5,9693fd625bf0abc8eb1aba5eec162a2b", + "sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,39eca8028cca6776d58d9da8f30598be", + "sample1_tumor_ubam_WeightedHistogramReadlength.html:md5,edabef9208ecdac24086b2b610df233a", + "sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,5a3456d2193fc25925f434931c69f329", + "sample1_tumor_ubam_Yield_By_Length.html:md5,d154845bf990aa42cb309e95200ea896", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", - "somatic_smallvariants.vcf.gz:md5,b4c30ef73260b5f51516a75c0543d6fa", - "somatic_smallvariants.vcf.gz.tbi:md5,d0a63e65ac7ff6ab98530591b1175da6", + "somatic_smallvariants.vcf.gz:md5,dcd2768bf7d67fb75025dcc0d1d0f50a", + "somatic_smallvariants.vcf.gz.tbi:md5,45ee3fde1ac766f6cb638e2aea2e3b21", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", - "sample2_normal_ubam_NanoPlot-report.html:md5,5e71c4194efd9bda440c4b06244a18e0", + "sample2_normal_ubam_NanoPlot-report.html:md5,372ab1c26679e66f67f562db4f21eb2c", "sample2_normal_ubam_NanoStats.txt:md5,11bd84cd82bf107ed257cb4c8f9438c5", - "sample2_normal_ubam_Non_weightedHistogramReadlength.html:md5,c694d2cea1600b4ea844491d26475025", - "sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,7e0ed516472bcd259a37ff81cb2cd60a", - "sample2_normal_ubam_WeightedHistogramReadlength.html:md5,bb508cd4a38f2d5d3ab41cf79cd0b29f", - "sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,2c0dce9b1851e02d7e208f8e10c29d01", - "sample2_normal_ubam_Yield_By_Length.html:md5,7c2c0b4881e80c4a83848a1b286d9e93", + "sample2_normal_ubam_Non_weightedHistogramReadlength.html:md5,2ab39b70bb500412b20212163c3595f2", + "sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,032e7db54df8901ae9e1901114b81db7", + "sample2_normal_ubam_WeightedHistogramReadlength.html:md5,7836df63068eeded963079bcc005f532", + "sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,948ca03bbab8ea6e2963efa25213377e", + "sample2_normal_ubam_Yield_By_Length.html:md5,edab15804d3ade11b3d5861b2e7ed363", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", - "sample2_tumor_ubam_NanoPlot-report.html:md5,f8a2f4e4f4584caf0dfcebd4a8a95c83", + "sample2_tumor_ubam_NanoPlot-report.html:md5,23e65b98eeae335c219c03b86f0fdbe1", "sample2_tumor_ubam_NanoStats.txt:md5,0ee15432d551cfc2fc138f108c45a5f2", - "sample2_tumor_ubam_Non_weightedHistogramReadlength.html:md5,c619711ee0a44dcb6f77441d6e3a7416", - "sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,0f7ca96a659ec8445c0bd80dc813c250", - "sample2_tumor_ubam_WeightedHistogramReadlength.html:md5,624c93f231f4b435a7580144580aa27e", - "sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,16edf74411b3140cfc97a5fcaa97d8fb", - "sample2_tumor_ubam_Yield_By_Length.html:md5,14ad903431effc711615ce535bc0d537", + "sample2_tumor_ubam_Non_weightedHistogramReadlength.html:md5,072094345f3e62e0b9aee109ddc110f3", + "sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,143e1cfdb3ad2ad7e1e57e8b724c1114", + "sample2_tumor_ubam_WeightedHistogramReadlength.html:md5,ca1cab74c10f0150bc6cbe2c502bc83c", + "sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,b7aadc77bd0009e845f76f894b888342", + "sample2_tumor_ubam_Yield_By_Length.html:md5,35711bfb1585724e1c1086b9c466e583", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", - "somatic_smallvariants.vcf.gz:md5,fd05e6540d7b8fa2ee43df2e96f812aa", - "somatic_smallvariants.vcf.gz.tbi:md5,d13967f57fe07d2289c4547a0470b1b4", + "somatic_smallvariants.vcf.gz:md5,3c4bba4e013c465ffc213e843578b8ee", + "somatic_smallvariants.vcf.gz.tbi:md5,902fd2a82e6317f9e789638efacdd613", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", - "sample3_tumor_ubam_NanoPlot-report.html:md5,c527fd63036a768eccb2c7c7144cdf3d", + "sample3_tumor_ubam_NanoPlot-report.html:md5,07e4c71e6e82cadba4370f68bf1cccf4", "sample3_tumor_ubam_NanoStats.txt:md5,a58520cb39ad01cf3d51d3541ae9ca34", - "sample3_tumor_ubam_Non_weightedHistogramReadlength.html:md5,f474797151c3410895424ee94fedf8e8", - "sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,5c465a632b11d49afe49d0682250ee96", - "sample3_tumor_ubam_WeightedHistogramReadlength.html:md5,9cbde6a54da9472708fc80af284ed4c7", - "sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,76b7cbf0ae4fdf295110fe7b862db0ce", - "sample3_tumor_ubam_Yield_By_Length.html:md5,9e250d61ec770a59df33234778893305", + "sample3_tumor_ubam_Non_weightedHistogramReadlength.html:md5,66db2c981969434ca025c6fa3120fae2", + "sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,2eb90ba5997c77e4bdeccbc4982c30a0", + "sample3_tumor_ubam_WeightedHistogramReadlength.html:md5,63707c0757c3eed4a779a969f8d9d9c4", + "sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,e8f0ac10030973de5bf8c3b22d6414d1", + "sample3_tumor_ubam_Yield_By_Length.html:md5,fa7159e8e4e6cabc4dd64f80807412e9", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", - "somatic_smallvariants.vcf.gz:md5,0d47e0b09b96a9a28a5340c6866250a6", + "somatic_smallvariants.vcf.gz:md5,4e602ffaf891eb6f84daca0e178010d3", "somatic_smallvariants.vcf.gz.tbi:md5,b214ac172efbf09133bda2ab6b93987d", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" @@ -525,6 +520,6 @@ "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2026-03-13T11:35:37.315075475" + "timestamp": "2026-03-13T12:00:18.187202466" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index fb73f922..fc61e9c6 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -166,13 +166,13 @@ workflow LRSOMATIC { CRAMINO_PRE( ch_samplesheet ) - if (!params.skip_nanoplot) + if (!params.skip_nanoplot) { // // Module: Nanoplot // - NANOPLOT_POST(CRAMINO_POST.out.arrow) + NANOPLOT_PRE(CRAMINO_PRE.out.arrow) } @@ -523,7 +523,7 @@ workflow LRSOMATIC { CRAMINO_POST ( ch_minimap_bam ) - if (!params.skip_nanoplot) + if (!params.skip_nanoplot) { // // Module: Nanoplot From da3abafadb69431e589c362436b93f920ba3b783 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 13:25:39 +0100 Subject: [PATCH 126/183] fix snapshots --- conf/modules.config | 2 +- tests/.nftignore | 11 ++-- tests/default.nf.test.snap | 132 ++++++++++++++----------------------- 3 files changed, 56 insertions(+), 89 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 41c02385..6fad45aa 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -63,7 +63,7 @@ process { withName: '.*:NANOPLOT_PRE' { ext.prefix = { "${meta.id}_${meta.type}_ubam" } publishDir = [ - path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_ubam${meta.replicate}" }, + path: { "${params.outdir}/${meta.id}/qc/${meta.type}/nanoplot_ubam_${meta.replicate}" }, mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] diff --git a/tests/.nftignore b/tests/.nftignore index becfbfa3..c89451e3 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -17,10 +17,7 @@ pipeline_info/*.{html,json,txt,yml} */variants/severus/read_ids.csv */variants/severus/severus.log */variants/severus/{all_SVs,somatic_SVs}/*.{vcf.gz,vcf.gz.tbi} -*/qc/{tumor,normal}/{cramino_aln}/*_cramino.txt -*/qc/{tumor,normal}/{cramino_ubam}_*/*_cramino.txt -*/qc/{tumor,normal}/{nanoplot_ubam}_*/*.html -*/qc/{tumor,normal}/{nanoplot_aln}/*.html -*/qc/{tumor,normal}/{nanoplot_ubam}_*/*.txt -*/qc/{tumor,normal}/{nanoplot_aln}/*.txt -*/qc/{tumor,normal}/{mosdepth}/*.txt +*/qc/{tumor,normal}/{cramino_ubam_,cramino_aln}/*_cramino.txt +*/qc/{tumor,normal}/{nanoplot_ubam_,nanoplot_aln}*/*.html +*/qc/{tumor,normal}/{nanoplot_ubam_,nanoplot_aln}*/*.txt +*/qc/{tumor,normal}/mosdepth/*.txt diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 3fa756e2..e7bb4315 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -189,14 +189,14 @@ "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", - "sample1/qc/normal/nanoplot_ubam1", - "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_NanoPlot-report.html", - "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_NanoStats.txt", - "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_WeightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam1/sample1_normal_ubam_Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam_1", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Yield_By_Length.html", "sample1/qc/normal/samtools", "sample1/qc/normal/samtools/sample1.flagstat", "sample1/qc/normal/samtools/sample1.idxstats", @@ -220,14 +220,14 @@ "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", - "sample1/qc/tumor/nanoplot_ubam1", - "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_NanoPlot-report.html", - "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_NanoStats.txt", - "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_WeightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam1/sample1_tumor_ubam_Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam_1", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Yield_By_Length.html", "sample1/qc/tumor/samtools", "sample1/qc/tumor/samtools/sample1.flagstat", "sample1/qc/tumor/samtools/sample1.idxstats", @@ -292,14 +292,14 @@ "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", - "sample2/qc/normal/nanoplot_ubam1", - "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_NanoPlot-report.html", - "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_NanoStats.txt", - "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_WeightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam1/sample2_normal_ubam_Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam_1", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Yield_By_Length.html", "sample2/qc/normal/samtools", "sample2/qc/normal/samtools/sample2.flagstat", "sample2/qc/normal/samtools/sample2.idxstats", @@ -323,14 +323,14 @@ "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", - "sample2/qc/tumor/nanoplot_ubam1", - "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_NanoPlot-report.html", - "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_NanoStats.txt", - "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_WeightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam1/sample2_tumor_ubam_Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam_1", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Yield_By_Length.html", "sample2/qc/tumor/samtools", "sample2/qc/tumor/samtools/sample2.flagstat", "sample2/qc/tumor/samtools/sample2.idxstats", @@ -393,14 +393,14 @@ "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", - "sample3/qc/tumor/nanoplot_ubam1", - "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_NanoPlot-report.html", - "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_NanoStats.txt", - "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_WeightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam1/sample3_tumor_ubam_Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam_1", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Yield_By_Length.html", "sample3/qc/tumor/samtools", "sample3/qc/tumor/samtools/sample3.flagstat", "sample3/qc/tumor/samtools/sample3.idxstats", @@ -446,72 +446,42 @@ "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", - "sample1_normal_ubam_NanoPlot-report.html:md5,be3693604268a0fab02485b7bb606c54", - "sample1_normal_ubam_NanoStats.txt:md5,9890c05609383aa6705c684e2581493b", - "sample1_normal_ubam_Non_weightedHistogramReadlength.html:md5,257f634cdc2a2d243508654aceb46f49", - "sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,f50f7a3b17dc2ad14143a60fb6db18b6", - "sample1_normal_ubam_WeightedHistogramReadlength.html:md5,679af03ab8211478f7976849ca9aa59d", - "sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,fad7cc2e0a4138d5ca52fbcea013605a", - "sample1_normal_ubam_Yield_By_Length.html:md5,21cfd52990aaf1f803cb4fb56885cfcd", + "sample1_normal_cramino.txt:md5,c1d526d83fc7d5cb764b58b4fc14ec91", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", - "sample1_tumor_ubam_NanoPlot-report.html:md5,6adc9282b33c9737d1f0b2926fe28f94", - "sample1_tumor_ubam_NanoStats.txt:md5,a58520cb39ad01cf3d51d3541ae9ca34", - "sample1_tumor_ubam_Non_weightedHistogramReadlength.html:md5,9693fd625bf0abc8eb1aba5eec162a2b", - "sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,39eca8028cca6776d58d9da8f30598be", - "sample1_tumor_ubam_WeightedHistogramReadlength.html:md5,edabef9208ecdac24086b2b610df233a", - "sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,5a3456d2193fc25925f434931c69f329", - "sample1_tumor_ubam_Yield_By_Length.html:md5,d154845bf990aa42cb309e95200ea896", + "sample1_tumor_cramino.txt:md5,bd89428fb05e1d1736e845b0b076fd57", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", - "somatic_smallvariants.vcf.gz:md5,dcd2768bf7d67fb75025dcc0d1d0f50a", - "somatic_smallvariants.vcf.gz.tbi:md5,45ee3fde1ac766f6cb638e2aea2e3b21", + "somatic_smallvariants.vcf.gz:md5,b0f5406b7d3fd420bc2f886bc8a342ca", + "somatic_smallvariants.vcf.gz.tbi:md5,10a8341860d0d4fec1712019cad908c3", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", - "sample2_normal_ubam_NanoPlot-report.html:md5,372ab1c26679e66f67f562db4f21eb2c", - "sample2_normal_ubam_NanoStats.txt:md5,11bd84cd82bf107ed257cb4c8f9438c5", - "sample2_normal_ubam_Non_weightedHistogramReadlength.html:md5,2ab39b70bb500412b20212163c3595f2", - "sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,032e7db54df8901ae9e1901114b81db7", - "sample2_normal_ubam_WeightedHistogramReadlength.html:md5,7836df63068eeded963079bcc005f532", - "sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,948ca03bbab8ea6e2963efa25213377e", - "sample2_normal_ubam_Yield_By_Length.html:md5,edab15804d3ade11b3d5861b2e7ed363", + "sample2_normal_cramino.txt:md5,445f8019e6832222c4a547fbc84a7a3f", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", - "sample2_tumor_ubam_NanoPlot-report.html:md5,23e65b98eeae335c219c03b86f0fdbe1", - "sample2_tumor_ubam_NanoStats.txt:md5,0ee15432d551cfc2fc138f108c45a5f2", - "sample2_tumor_ubam_Non_weightedHistogramReadlength.html:md5,072094345f3e62e0b9aee109ddc110f3", - "sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,143e1cfdb3ad2ad7e1e57e8b724c1114", - "sample2_tumor_ubam_WeightedHistogramReadlength.html:md5,ca1cab74c10f0150bc6cbe2c502bc83c", - "sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,b7aadc77bd0009e845f76f894b888342", - "sample2_tumor_ubam_Yield_By_Length.html:md5,35711bfb1585724e1c1086b9c466e583", + "sample2_tumor_cramino.txt:md5,62eb587683ac3a32f0cc8a45dc45d466", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", - "somatic_smallvariants.vcf.gz:md5,3c4bba4e013c465ffc213e843578b8ee", + "somatic_smallvariants.vcf.gz:md5,d902539ee0bce31dbe91a4bcf675fb30", "somatic_smallvariants.vcf.gz.tbi:md5,902fd2a82e6317f9e789638efacdd613", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", - "sample3_tumor_ubam_NanoPlot-report.html:md5,07e4c71e6e82cadba4370f68bf1cccf4", - "sample3_tumor_ubam_NanoStats.txt:md5,a58520cb39ad01cf3d51d3541ae9ca34", - "sample3_tumor_ubam_Non_weightedHistogramReadlength.html:md5,66db2c981969434ca025c6fa3120fae2", - "sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html:md5,2eb90ba5997c77e4bdeccbc4982c30a0", - "sample3_tumor_ubam_WeightedHistogramReadlength.html:md5,63707c0757c3eed4a779a969f8d9d9c4", - "sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html:md5,e8f0ac10030973de5bf8c3b22d6414d1", - "sample3_tumor_ubam_Yield_By_Length.html:md5,fa7159e8e4e6cabc4dd64f80807412e9", + "sample3_tumor_cramino.txt:md5,bd89428fb05e1d1736e845b0b076fd57", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", - "somatic_smallvariants.vcf.gz:md5,4e602ffaf891eb6f84daca0e178010d3", - "somatic_smallvariants.vcf.gz.tbi:md5,b214ac172efbf09133bda2ab6b93987d", + "somatic_smallvariants.vcf.gz:md5,0e556ddb228b948bcfe1eb7827e8fcf8", + "somatic_smallvariants.vcf.gz.tbi:md5,7e25c2f90223c97e94d560f0e9704854", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] @@ -520,6 +490,6 @@ "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2026-03-13T12:00:18.187202466" + "timestamp": "2026-03-13T13:20:19.591772465" } } \ No newline at end of file From a3a26556990cf0c8828bd3bfb2ba45f3995c81fd Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 13:56:47 +0100 Subject: [PATCH 127/183] fix snapshots again --- tests/.nftignore | 10 +++++++--- tests/default.nf.test.snap | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/tests/.nftignore b/tests/.nftignore index c89451e3..7a9121a9 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -17,7 +17,11 @@ pipeline_info/*.{html,json,txt,yml} */variants/severus/read_ids.csv */variants/severus/severus.log */variants/severus/{all_SVs,somatic_SVs}/*.{vcf.gz,vcf.gz.tbi} -*/qc/{tumor,normal}/{cramino_ubam_,cramino_aln}/*_cramino.txt -*/qc/{tumor,normal}/{nanoplot_ubam_,nanoplot_aln}*/*.html -*/qc/{tumor,normal}/{nanoplot_ubam_,nanoplot_aln}*/*.txt +*/variants/phased/*.{vcf.gz,vcf.gz.tbi} +*/qc/{tumor,normal}/cramino_ubam_*/*_cramino.txt +*/qc/{tumor,normal}/cramino_aln/*_cramino.txt +*/qc/{tumor,normal}/nanoplot_ubam_*/*.html +*/qc/{tumor,normal}/nanoplot_aln/*.html +*/qc/{tumor,normal}/nanoplot_ubam_*/*.txt +*/qc/{tumor,normal}/nanoplot_aln/*.txt */qc/{tumor,normal}/mosdepth/*.txt diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index e7bb4315..e51766e7 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -446,15 +446,15 @@ "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", - "sample1_normal_cramino.txt:md5,c1d526d83fc7d5cb764b58b4fc14ec91", + "sample1_normal_cramino.txt:md5,6f9030d94213e604c4fd123726c4dc48", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", - "sample1_tumor_cramino.txt:md5,bd89428fb05e1d1736e845b0b076fd57", + "sample1_tumor_cramino.txt:md5,d3d6eecc58eb3ddd27b0a6929051b50e", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", - "somatic_smallvariants.vcf.gz:md5,b0f5406b7d3fd420bc2f886bc8a342ca", + "somatic_smallvariants.vcf.gz:md5,1ce3a6bc89598801c33f7e3433a5a468", "somatic_smallvariants.vcf.gz.tbi:md5,10a8341860d0d4fec1712019cad908c3", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", @@ -462,26 +462,26 @@ "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", - "sample2_normal_cramino.txt:md5,445f8019e6832222c4a547fbc84a7a3f", + "sample2_normal_cramino.txt:md5,632155c40c82c893fdaf6bb5853aab1a", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", - "sample2_tumor_cramino.txt:md5,62eb587683ac3a32f0cc8a45dc45d466", + "sample2_tumor_cramino.txt:md5,1df7d3694566e29e3d9c46720f04cf18", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", - "somatic_smallvariants.vcf.gz:md5,d902539ee0bce31dbe91a4bcf675fb30", + "somatic_smallvariants.vcf.gz:md5,1eb6db5d30ea3e1ab26685deac24983d", "somatic_smallvariants.vcf.gz.tbi:md5,902fd2a82e6317f9e789638efacdd613", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", - "sample3_tumor_cramino.txt:md5,bd89428fb05e1d1736e845b0b076fd57", + "sample3_tumor_cramino.txt:md5,d3d6eecc58eb3ddd27b0a6929051b50e", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", - "somatic_smallvariants.vcf.gz:md5,0e556ddb228b948bcfe1eb7827e8fcf8", - "somatic_smallvariants.vcf.gz.tbi:md5,7e25c2f90223c97e94d560f0e9704854", + "somatic_smallvariants.vcf.gz:md5,4f86dad061abc4c06481b668a2e7123f", + "somatic_smallvariants.vcf.gz.tbi:md5,b214ac172efbf09133bda2ab6b93987d", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] @@ -490,6 +490,6 @@ "nf-test": "0.9.2", "nextflow": "25.10.0" }, - "timestamp": "2026-03-13T13:20:19.591772465" + "timestamp": "2026-03-13T13:26:29.323724893" } } \ No newline at end of file From 9fa38036adc51a57f97fa38f544c6831af14e736 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 14:04:39 +0100 Subject: [PATCH 128/183] surely last snapshot update --- tests/default.nf.test.snap | 43 +++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 0946f21f..f0e039cd 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -245,6 +245,9 @@ "sample1/variants/clairs/indel.vcf.gz.tbi", "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/severus_all.vcf.gz", @@ -349,6 +352,9 @@ "sample2/variants/clairs/indel.vcf.gz.tbi", "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/severus_all.vcf.gz", @@ -419,6 +425,9 @@ "sample3/variants/clairsto/snv.vcf.gz.tbi", "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample3/variants/severus", "sample3/variants/severus/all_SVs", "sample3/variants/severus/all_SVs/severus_all.vcf.gz", @@ -443,10 +452,10 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,7714d4b2db4d97b609c9a58f94e9a550", - "sample1_normal.bam.bai:md5,b5e6df2994304fd78ecd2b3b8fea87ee", - "sample1_tumor.bam:md5,b0f1bdae9bbdb901eced7297088a5d1e", - "sample1_tumor.bam.bai:md5,fc1f6cd9556c7d1d08a9a52c7ee97cbb", + "sample1_normal.bam:md5,58854f8d427538288322ac20df574fe1", + "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", + "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", + "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", "sample1.arrow:md5,df57219f1bea7e7d5538ec4ee87dcf83", "sample1.arrow:md5,36467bdd847baaa060817928d30bf091", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", @@ -457,12 +466,14 @@ "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", + "somatic_smallvariants.vcf.gz:md5,4b27cfd8d1c971631d464b4a0c033c9f", + "somatic_smallvariants.vcf.gz.tbi:md5,10a8341860d0d4fec1712019cad908c3", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", - "sample2_normal.bam:md5,b2b52d2ff82220cd393fa353cf931207", - "sample2_normal.bam.bai:md5,a82a6a8a6ad1879588befe5c5869d598", - "sample2_tumor.bam:md5,f63adccc34154d53e36766ca30db1512", - "sample2_tumor.bam.bai:md5,015b8dc2ccd1e8f4338c94bc6f81ed40", + "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", + "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", + "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", + "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", "sample2.arrow:md5,6aa5eec1162a077f3bf8537c8f0db952", "sample2.arrow:md5,04f75058ac7edf6f8dfe33b8bab3b78d", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", @@ -473,23 +484,27 @@ "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", + "somatic_smallvariants.vcf.gz:md5,51980a65fba01f1a611e22179a4f6692", + "somatic_smallvariants.vcf.gz.tbi:md5,a17dacb872cab6bad80c02c477118589", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", - "sample3_tumor.bam:md5,24e3b7bee7a0d8a01303f677d2b87b08", - "sample3_tumor.bam.bai:md5,d2038319977bd78352927c16ef3f1a21", + "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", + "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", "sample3.arrow:md5,de5f6de5e459d71d6cd4919eea616943", "sample3.arrow:md5,b4102a193ca9eb2ebee0cd36b48c138d", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", + "somatic_smallvariants.vcf.gz:md5,88c02b870c57252eb964b00aacddb706", + "somatic_smallvariants.vcf.gz.tbi:md5,29931b98ac1eb3e63a01f9eada1c789b", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], + "timestamp": "2026-03-13T14:01:29.660410344", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-03-12T15:06:45.544824708" + "nf-test": "0.9.4", + "nextflow": "25.10.0" + } } } \ No newline at end of file From d9a084ed75995c2e8687227a6909746baa131d67 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 14:18:45 +0100 Subject: [PATCH 129/183] surely last one --- tests/default.nf.test.snap | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index f0e039cd..0fcb7191 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -466,7 +466,7 @@ "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", - "somatic_smallvariants.vcf.gz:md5,4b27cfd8d1c971631d464b4a0c033c9f", + "somatic_smallvariants.vcf.gz:md5,600a03c95044fcfe393d1b28cd2da843", "somatic_smallvariants.vcf.gz.tbi:md5,10a8341860d0d4fec1712019cad908c3", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", @@ -484,8 +484,8 @@ "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", - "somatic_smallvariants.vcf.gz:md5,51980a65fba01f1a611e22179a4f6692", - "somatic_smallvariants.vcf.gz.tbi:md5,a17dacb872cab6bad80c02c477118589", + "somatic_smallvariants.vcf.gz:md5,e4f97ca54d31c5d4ad7825000bbed360", + "somatic_smallvariants.vcf.gz.tbi:md5,d13967f57fe07d2289c4547a0470b1b4", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", @@ -495,13 +495,13 @@ "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", - "somatic_smallvariants.vcf.gz:md5,88c02b870c57252eb964b00aacddb706", - "somatic_smallvariants.vcf.gz.tbi:md5,29931b98ac1eb3e63a01f9eada1c789b", + "somatic_smallvariants.vcf.gz:md5,aab6f707ba2d3692ca3baf7cfb3e1e50", + "somatic_smallvariants.vcf.gz.tbi:md5,8c7f724be3d927cce507f15fa0f3f45d", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], - "timestamp": "2026-03-13T14:01:29.660410344", + "timestamp": "2026-03-13T14:09:46.004582221", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.0" From 943533a290a57ad82e630a4264498004e93fe689 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 14:29:08 +0100 Subject: [PATCH 130/183] surely last time --- tests/default.nf.test.snap | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 68600f89..bd36bc15 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -241,6 +241,9 @@ "sample1/variants/clairs/indel.vcf.gz.tbi", "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/severus_all.vcf.gz", @@ -341,6 +344,9 @@ "sample2/variants/clairs/indel.vcf.gz.tbi", "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/severus_all.vcf.gz", @@ -409,6 +415,9 @@ "sample3/variants/clairsto/snv.vcf.gz.tbi", "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample3/variants/severus", "sample3/variants/severus/all_SVs", "sample3/variants/severus/all_SVs/severus_all.vcf.gz", @@ -437,50 +446,39 @@ "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", - "sample1_normal_cramino.txt:md5,6f9030d94213e604c4fd123726c4dc48", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", - "sample1_tumor_cramino.txt:md5,d3d6eecc58eb3ddd27b0a6929051b50e", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", - "sample2_normal.bam:md5,b2b52d2ff82220cd393fa353cf931207", - "sample2_normal.bam.bai:md5,a82a6a8a6ad1879588befe5c5869d598", - "sample2_tumor.bam:md5,f63adccc34154d53e36766ca30db1512", - "sample2_tumor.bam.bai:md5,015b8dc2ccd1e8f4338c94bc6f81ed40", - "sample2.arrow:md5,6aa5eec1162a077f3bf8537c8f0db952", - "sample2.arrow:md5,04f75058ac7edf6f8dfe33b8bab3b78d", + "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", + "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", + "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", + "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", - "sample2_tumor_cramino.txt:md5,1df7d3694566e29e3d9c46720f04cf18", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", - "somatic_smallvariants.vcf.gz:md5,1eb6db5d30ea3e1ab26685deac24983d", - "somatic_smallvariants.vcf.gz.tbi:md5,902fd2a82e6317f9e789638efacdd613", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", - "sample3_tumor_cramino.txt:md5,d3d6eecc58eb3ddd27b0a6929051b50e", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", - "somatic_smallvariants.vcf.gz:md5,4f86dad061abc4c06481b668a2e7123f", - "somatic_smallvariants.vcf.gz.tbi:md5,b214ac172efbf09133bda2ab6b93987d", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], - "timestamp": "2026-03-13T14:09:46.004582221", + "timestamp": "2026-03-13T14:26:30.747596368", "meta": { - "nf-test": "0.9.2", + "nf-test": "0.9.4", "nextflow": "25.10.0" - }, - "timestamp": "2026-03-13T13:26:29.323724893" + } } } \ No newline at end of file From af3a58e2122b3e48bd0453dd1ec42b4e87c86da6 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 13 Mar 2026 15:12:36 +0100 Subject: [PATCH 131/183] add deep somatic and split processes for more efficent gpu requests --- conf/modules.config | 40 +++++ conf/test.config | 10 ++ .../local/deepsomatic/callvariants/main.nf | 49 ++++++ .../local/deepsomatic/makeexamples/main.nf | 58 +++++++ .../deepsomatic/postprocessvariants/main.nf | 87 +++++++++++ modules/nf-core/deepsomatic/main.nf | 71 --------- modules/nf-core/deepsomatic/meta.yml | 144 ------------------ .../nf-core/deepsomatic/tests/main.nf.test | 59 ------- .../deepsomatic/tests/main.nf.test.snap | 20 --- .../nf-core/deepsomatic/tests/nextflow.config | 6 - subworkflows/local/deepsomatic.nf | 42 +++++ subworkflows/local/tumor_normal_happhase.nf | 16 ++ subworkflows/local/tumor_only_happhase.nf | 18 +++ 13 files changed, 320 insertions(+), 300 deletions(-) create mode 100644 modules/local/deepsomatic/callvariants/main.nf create mode 100644 modules/local/deepsomatic/makeexamples/main.nf create mode 100644 modules/local/deepsomatic/postprocessvariants/main.nf delete mode 100644 modules/nf-core/deepsomatic/main.nf delete mode 100644 modules/nf-core/deepsomatic/meta.yml delete mode 100644 modules/nf-core/deepsomatic/tests/main.nf.test delete mode 100644 modules/nf-core/deepsomatic/tests/main.nf.test.snap delete mode 100644 modules/nf-core/deepsomatic/tests/nextflow.config create mode 100644 subworkflows/local/deepsomatic.nf diff --git a/conf/modules.config b/conf/modules.config index ce03c41c..697c1c2c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -115,6 +115,46 @@ process { ] } + withName: '.*DEEPSOMATIC_MAKEEXAMPLES' { + ext.args = { + meta.platform == 'pb' + ? meta.paired_data + ? '--channel_list "BASE_CHANNELS,haplotype" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"' + : '--channel_list "BASE_CHANNELS,haplotype,allele_frequency" --alt_aligned_pileup "diff_channels" --pileup_image_width "99" --population_vcfs "/opt/models/deepsomatic/pons/AF_pacbio_PON_CoLoRSdb.GRCh38.AF0.05.vcf.gz"' + : meta.paired_data + ? '--channel_list "BASE_CHANNELS,haplotype" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"' + : '--channel_list "BASE_CHANNELS,haplotype,allele_frequency" --alt_aligned_pileup "diff_channels" --pileup_image_width "99" --population_vcfs "/opt/models/deepsomatic/pons/ON_dbsnp138_gnomad_ILMN1000g_pon.vcf.gz"' + } + publishDir = [ + enabled: false + ] + } + + withName: '.*DEEPSOMATIC_POSTPROCESSVARIANTS' { + ext.args = { + '--process_somatic=true' + } + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/deepsomatic" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: '.*DEEPSOMATIC_CALLVARIANTS' { + ext.args = { + meta.platform == 'pb' + ? (meta.paired_data + ? "--checkpoint '/opt/models/deepsomatic/pacbio'" + : "--checkpoint '/opt/models/deepsomatic/pacbio_tumor_only'" ) + : (meta.paired_data + ? "--checkpoint '/opt/models/deepsomatic/ont'" + : "--checkpoint '/opt/models/deepsomatic/ont_tumor_only'") + } + publishDir = [ + enabled : false + ] + } withName: '.*:UNZIP_.*' { diff --git a/conf/test.config b/conf/test.config index 8b9b08f4..96e61b28 100644 --- a/conf/test.config +++ b/conf/test.config @@ -30,6 +30,16 @@ process { "--regions 'chr19'" } } + withName: '.*DEEPSOMATIC_MAKEEXAMPLES' { + ext.args = { + "--regions 'chr19'" + } + } + withName: '.*DEEPSOMATIC_POSTPROCESSVARIANTS' { + ext.args = { + "--regions 'chr19'" + } + } } diff --git a/modules/local/deepsomatic/callvariants/main.nf b/modules/local/deepsomatic/callvariants/main.nf new file mode 100644 index 00000000..8491e664 --- /dev/null +++ b/modules/local/deepsomatic/callvariants/main.nf @@ -0,0 +1,49 @@ +process DEEPSOMATIC_CALLVARIANTS { + tag "$meta.id" + label 'process_high' + + //Conda is not supported at the moment + container "docker.io/google/deepsomatic:1.7.0" + + input: + tuple val(meta), path(make_examples_tfrecords) + + output: + tuple val(meta), path("${prefix}.call-*-of-*.tfrecord.gz"), emit: call_variants_tfrecords + tuple val("${task.process}"), val('deepsomatic'), val('1.7.0'), topic: versions, emit: versions_deepsomatic + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def matcher = make_examples_tfrecords[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/ + if (!matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + make_examples_tfrecords[0].baseName + "' doesn't match the expected pattern") + } + def examples_tfrecord_name = matcher[0][1] + def shardCount = matcher[0][2] + // Reconstruct the logical name - ${tfrecord_name}@.gz + def examples_tfrecords_logical_name = "${examples_tfrecord_name}@${shardCount}.gz" + + """ + /opt/deepvariant/bin/call_variants \\ + ${args} \\ + --outfile "${prefix}.call.tfrecord.gz" \\ + --examples "${examples_tfrecords_logical_name}" + + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.call-00000-of-00001.tfrecord.gz + + """ +} diff --git a/modules/local/deepsomatic/makeexamples/main.nf b/modules/local/deepsomatic/makeexamples/main.nf new file mode 100644 index 00000000..f1b148b4 --- /dev/null +++ b/modules/local/deepsomatic/makeexamples/main.nf @@ -0,0 +1,58 @@ +process DEEPSOMATIC_MAKEEXAMPLES { + tag "$meta.id" + label 'process_high' + + //Conda is not supported at the moment + container "docker.io/google/deepsomatic:1.7.0" + + input: + tuple val(meta), path(normal_input), path(normal_index), path(tumor_input), path(tumor_index) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(gzi) + + output: + tuple val(meta), path("${prefix}.examples.tfrecord-*-of-*.gz{,.example_info.json}"), emit: examples + tuple val(meta), path("${prefix}.gvcf.tfrecord-*-of-*.gz"), emit: gvcf + tuple val(meta), path("${prefix}_call_variant_outputs.tfrecord-*-of-*.gz", arity: "0..*"), emit: small_model_calls + tuple val("${task.process}"), val('deepsomatic'), val('1.7.0'), topic: versions, emit: versions_deepsomatic + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def normalReadsArg = (normal_input?.toString() && normal_input.toString() != '[]') ? "--reads_normal \"${normal_input}\"" : "" + def normalSampleArg = (normal_input?.toString() && normal_input.toString() != '[]') ? "--sample_name_normal \"${prefix}_normal\"" : "" + + """ + seq 0 ${task.cpus - 1} | parallel -q --halt 2 --line-buffer /opt/deepvariant/bin/make_examples_somatic \\ + --mode calling \\ + --ref "${fasta}" \\ + --reads_tumor "${tumor_input}" \\ + ${normalReadsArg} \\ + --sample_name_tumor "${prefix}_tumor" \\ + ${normalSampleArg} \\ + --examples "./${prefix}.examples.tfrecord@${task.cpus}.gz" \\ + --gvcf "./${prefix}.gvcf.tfrecord@${task.cpus}.gz" \\ + ${args} \\ + --task {} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + printf -v SHARD_COUNT "%04d" ${task.cpus} + for i in \$( seq -f "%04g" 0 ${task.cpus-1} ) + do + echo "" | gzip > ${prefix}.examples.tfrecord-\$i-of-\$SHARD_COUNT.gz + touch ${prefix}.examples.tfrecord-\$i-of-\$SHARD_COUNT.gz.example_info.json + echo "" | gzip > ${prefix}.gvcf.tfrecord-\$i-of-\$SHARD_COUNT.gz + done + """ +} diff --git a/modules/local/deepsomatic/postprocessvariants/main.nf b/modules/local/deepsomatic/postprocessvariants/main.nf new file mode 100644 index 00000000..a192b57f --- /dev/null +++ b/modules/local/deepsomatic/postprocessvariants/main.nf @@ -0,0 +1,87 @@ +process DEEPSOMATIC_POSTPROCESSVARIANTS { + tag "$meta.id" + label 'process_medium' + + //Conda is not supported at the moment + container "docker.io/google/deepsomatic:1.7.0" + + input: + tuple val(meta), path(variant_calls_tfrecord_files), path(gvcf_tfrecords), val(small_model_calls), val(intervals) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(gzi) + + output: + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.vcf.gz.{tbi,csi}") , emit: vcf_index + tuple val(meta), path("${prefix}.g.vcf.gz") , emit: gvcf + tuple val(meta), path("${prefix}.g.vcf.gz.{tbi,csi}") , emit: gvcf_index + tuple val("${task.process}"), val('deepsomatic'), val('1.7.0'), topic: versions, emit: versions_deepsomatic + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def regions = intervals ? "--regions ${intervals}" : "" + def variant_calls_tfrecord_name = variant_calls_tfrecord_files[0].name.replaceFirst(/-\d{5}-of-\d{5}/, "") + + def gvcf_matcher = gvcf_tfrecords[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/ + if (!gvcf_matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + gvcf_tfrecords[0].baseName + "' doesn't match the expected pattern") + } + def gvcf_tfrecord_name = gvcf_matcher[0][1] + def gvcf_shardCount = gvcf_matcher[0][2] + // Reconstruct the logical name - ${tfrecord_name}.examples.tfrecord@${task.cpus}.gz + def gvcf_tfrecords_logical_name = "${gvcf_tfrecord_name}@${gvcf_shardCount}.gz" + + // The following block determines whether the small model was used, and if so, adds the variant calls from it + // to the argument --small_model_cvo_records. + def small_model_arg = "" + if (small_model_calls && small_model_calls.size() > 0) { + def small_model_matcher = (small_model_calls[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/) + if (!small_model_matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + small_model_calls[0].baseName + "' doesn't match the expected pattern") + } + def small_model_tfrecord_name = small_model_matcher[0][1] + def small_model_shardCount = small_model_matcher[0][2] + // Reconstruct the logical name. Example: test_call_variant_outputs.examples.tfrecord@12.gz + def small_model_tfrecords_logical_name = "${small_model_tfrecord_name}@${small_model_shardCount}.gz" + small_model_arg = "--small_model_cvo_records ${small_model_tfrecords_logical_name}" + } + + """ + /opt/deepvariant/bin/postprocess_variants \\ + ${args} \\ + --ref "${fasta}" \\ + --infile "${variant_calls_tfrecord_name}" \\ + --outfile "${prefix}.vcf.gz" \\ + --process_somatic=true \\ + --nonvariant_site_tfrecord_path "${gvcf_tfrecords_logical_name}" \\ + --gvcf_outfile "${prefix}.g.vcf.gz" \\ + ${regions} \\ + ${small_model_arg} \\ + --cpus $task.cpus + + """ + + stub: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + echo "" | gzip > ${prefix}.g.vcf.gz + touch ${prefix}.g.vcf.gz.tbi + + """ +} diff --git a/modules/nf-core/deepsomatic/main.nf b/modules/nf-core/deepsomatic/main.nf deleted file mode 100644 index 7a17793e..00000000 --- a/modules/nf-core/deepsomatic/main.nf +++ /dev/null @@ -1,71 +0,0 @@ -process DEEPSOMATIC { - tag "$meta.id" - label 'process_high' - - container "docker.io/google/deepsomatic:1.7.0" - input: - tuple val(meta), path(input_normal), path(index_normal), path(input_tumor), path(index_tumor) - tuple val(meta2), path(intervals) - tuple val(meta3), path(fasta) - tuple val(meta4), path(fai) - tuple val(meta5), path(gzi) - - output: - tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf - tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: vcf_tbi - tuple val(meta), path("${prefix}.g.vcf.gz") , emit: gvcf - tuple val(meta), path("${prefix}.g.vcf.gz.tbi"), emit: gvcf_tbi - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." - } - def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" - def regions = intervals ? "--regions=${intervals}" : "" - def VERSION = '1.7.0' - - """ - run_deepsomatic \\ - --ref=${fasta} \\ - --reads_normal=${input_normal} \\ - --reads_tumor=${input_tumor} \\ - --output_vcf=${prefix}.vcf.gz \\ - --output_gvcf=${prefix}.g.vcf.gz \\ - --sample_name_tumor="tumor" \\ - --sample_name_normal="normal" \\ - ${args} \\ - ${regions} \\ - --intermediate_results_dir=tmp \\ - --num_shards=${task.cpus} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deepsomatic: $VERSION - END_VERSIONS - """ - - stub: - // Exit if running this module with -profile conda / -profile mamba - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "DEEPSOMATIC module does not support Conda. Please use Docker / Singularity / Podman instead." - } - prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = '1.7.0' - """ - echo "" | gzip > ${prefix}.vcf.gz - touch ${prefix}.vcf.gz.tbi - echo "" | gzip > ${prefix}.g.vcf.gz - touch ${prefix}.g.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - deepsomatic: $VERSION - END_VERSIONS - """ -} diff --git a/modules/nf-core/deepsomatic/meta.yml b/modules/nf-core/deepsomatic/meta.yml deleted file mode 100644 index 0d8afb5b..00000000 --- a/modules/nf-core/deepsomatic/meta.yml +++ /dev/null @@ -1,144 +0,0 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json -name: "deepsomatic" -description: DeepSomatic is an extension of deep learning-based variant caller DeepVariant - that takes aligned reads (in BAM or CRAM format) from tumor and normal data, produces - pileup image tensors from them, classifies each tensor using a convolutional neural - network, and finally reports somatic variants in a standard VCF or gVCF file. -keywords: - - variant calling - - machine learning - - neural network -tools: - - "deepsomatic": - description: "" - homepage: "https://github.com/google/deepsomatic" - documentation: "https://github.com/google/deepsomatic" - tool_dev_url: "https://github.com/google/deepsomatic" - doi: "10.1101/2024.08.16.608331" - licence: ["BSD-3-clause"] - identifier: "biotools:deepsomatic" - -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input_normal: - type: file - description: BAM/CRAM file - pattern: "*.bam/cram" - ontologies: [] - - index_normal: - type: file - description: Index of BAM/CRAM file - pattern: "*.bai/crai" - ontologies: [] - - input_tumor: - type: file - description: BAM/CRAM file - pattern: "*.bam/cram" - ontologies: [] - - index_tumor: - type: file - description: Index of BAM/CRAM file - pattern: "*.bai/crai" - ontologies: [] - - - meta2: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - intervals: - type: file - description: file containing intervals - ontologies: [] - - - meta3: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - ontologies: [] - - - meta4: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fai: - type: file - description: Index of reference fasta file - pattern: "*.fai" - ontologies: [] - - - meta5: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - gzi: - type: file - description: GZI index of reference fasta file - pattern: "*.gzi" - - ontologies: [] -output: - vcf: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ${prefix}.vcf.gz: - type: file - description: Compressed VCF file - pattern: "*.vcf.gz" - ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format - vcf_tbi: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ${prefix}.vcf.gz.tbi: - type: file - description: Index of compressed VCF file - pattern: "*.vcf.gz.tbi" - ontologies: [] - gvcf: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ${prefix}.g.vcf.gz: - type: file - description: Compressed GVCF file - pattern: "*.g.vcf.gz" - ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format - gvcf_tbi: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1', single_end:false ]` - - ${prefix}.g.vcf.gz.tbi: - type: file - description: Index of compressed Genotyped VCF file - pattern: "*.g.vcf.gz.tbi" - ontologies: [] - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML -authors: - - "@vaxyzek" -maintainers: - - "@vaxyzek" diff --git a/modules/nf-core/deepsomatic/tests/main.nf.test b/modules/nf-core/deepsomatic/tests/main.nf.test deleted file mode 100644 index eaa5f8fe..00000000 --- a/modules/nf-core/deepsomatic/tests/main.nf.test +++ /dev/null @@ -1,59 +0,0 @@ -nextflow_process { - - name "Test Process DEEPSOMATIC" - script "../main.nf" - process "DEEPSOMATIC" - - tag "modules" - tag "modules_nfcore" - tag "deepsomatic" - - test("tumor_normal_pair") { - config './nextflow.config' - - when { - process { - """ - input[0] = [ - [ id:'tumor_vs_normal' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam.bai', checkIfExists: true) - ] - input[1] = [ - [ id:'intervals' ], - [] - ] - input[2] = [ - [ id:'genome' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true) - ] - input[3] = [ - [ id:'genome' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true) - ] - input[4] = [ - [ id: 'gzi' ], - [] - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { - assert snapshot( - process.out.vcf.collect { file(it[1]).getName() }, - process.out.tbi.collect { file(it[1]).getName() }, - process.out.versions, - ).match() - } - ) - } - - } - -} diff --git a/modules/nf-core/deepsomatic/tests/main.nf.test.snap b/modules/nf-core/deepsomatic/tests/main.nf.test.snap deleted file mode 100644 index 1a7886ec..00000000 --- a/modules/nf-core/deepsomatic/tests/main.nf.test.snap +++ /dev/null @@ -1,20 +0,0 @@ -{ - "tumor_normal_pair": { - "content": [ - [ - "tumor_vs_normal_out.vcf.gz" - ], - [ - - ], - [ - "versions.yml:md5,d64cbd049771dd1a8d0885499ea16f11" - ] - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" - }, - "timestamp": "2024-10-22T21:52:00.932502018" - } -} \ No newline at end of file diff --git a/modules/nf-core/deepsomatic/tests/nextflow.config b/modules/nf-core/deepsomatic/tests/nextflow.config deleted file mode 100644 index fff76401..00000000 --- a/modules/nf-core/deepsomatic/tests/nextflow.config +++ /dev/null @@ -1,6 +0,0 @@ -process { - withName: DEEPSOMATIC { - ext.args = "--regions='chr21:6110000-6120000'" - ext.prefix = { "${meta.id}_out" } - } -} diff --git a/subworkflows/local/deepsomatic.nf b/subworkflows/local/deepsomatic.nf new file mode 100644 index 00000000..920795ad --- /dev/null +++ b/subworkflows/local/deepsomatic.nf @@ -0,0 +1,42 @@ +include { DEEPSOMATIC_MAKEEXAMPLES } from '../../modules/local/deepsomatic/makeexamples/main' +include { DEEPSOMATIC_CALLVARIANTS } from '../../modules/local/deepsomatic/callvariants/main' +include { DEEPSOMATIC_POSTPROCESSVARIANTS } from '../../modules/local/deepsomatic/postprocessvariants/main' + +workflow DEEPSOMATIC { + take: + ch_input // channel: [ val(meta), path(normal), path(normal_index), path(tumor), path(tumor_index)] + ch_intervals + ch_fasta // channel: [ val(meta2), path(fasta) ] + ch_fai // channel: [ val(meta3), path(fai) ] + ch_gzi // channel: [ val(meta4), path(gzi) ] + + main: + + DEEPSOMATIC_MAKEEXAMPLES(ch_input, ch_fasta, ch_fai, ch_gzi) + + DEEPSOMATIC_CALLVARIANTS(DEEPSOMATIC_MAKEEXAMPLES.out.examples) + + // Input to postprocessing step needs both the gvcfs from MAKEEXAMPLES and the variant + // calls from CALLVARIANTS. Joining on meta, which is assumed to be unique. + + + ch_postproc_input = DEEPSOMATIC_CALLVARIANTS.out.call_variants_tfrecords.join( + DEEPSOMATIC_MAKEEXAMPLES.out.gvcf, + failOnMismatch: true + ).map { meta, call_tfrecord, gvcf_tfrecords -> + [meta, call_tfrecord, gvcf_tfrecords, [], []] + } + + DEEPSOMATIC_POSTPROCESSVARIANTS( + ch_postproc_input, + ch_fasta, + ch_fai, + ch_gzi + ) + + emit: + vcf = DEEPSOMATIC_POSTPROCESSVARIANTS.out.vcf + vcf_index = DEEPSOMATIC_POSTPROCESSVARIANTS.out.vcf_index + gvcf = DEEPSOMATIC_POSTPROCESSVARIANTS.out.gvcf + gvcf_index = DEEPSOMATIC_POSTPROCESSVARIANTS.out.gvcf_index +} diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 2ccdbf5d..9a0698ee 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -6,6 +6,7 @@ include { CLAIRS } from '../../modules/local/clairs/main.nf' include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat' include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort' include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' +include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' workflow TUMOR_NORMAL_HAPPHASE { @@ -284,6 +285,21 @@ workflow TUMOR_NORMAL_HAPPHASE { return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] } .set { clairs_input } + + tumor_normal_severus + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf, _tbi -> + return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + } + .set{ deepsomatic_input } + + DEEPSOMATIC ( + deepsomatic_input, + [[:],[]], + fasta, + fai, + [[:],[]] + ) + // // MODULE: CLAIRS // diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index e051541e..de797ebf 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -4,6 +4,8 @@ include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phas include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' +include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' + workflow TUMOR_ONLY_HAPPHASE { @@ -35,6 +37,14 @@ workflow TUMOR_ONLY_HAPPHASE { return [meta,bam,bai, intervals] } .set{tumor_bams_deepvar} + + tumor_bams + .map { meta, tumor_bam, tumor_bai, _clairSTO_model -> + def normal_bam = [] + def normal_bai = [] + return [meta,normal_bam,normal_bai,tumor_bam,tumor_bai] + } + .set{tumor_bams_deepsomatic} DEEPVARIANT ( tumor_bams_deepvar, @@ -44,6 +54,14 @@ workflow TUMOR_ONLY_HAPPHASE { [[:],[]] ) + DEEPSOMATIC ( + tumor_bams_deepsomatic, + [[:],[]], + fasta, + fai, + [[:],[]] + ) + // // MODULE: CLAIRSTO // From ba8cf59c5db4be101af462a4de0dcd113160e475 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 13 Mar 2026 15:21:59 +0100 Subject: [PATCH 132/183] add gpu process labels for deepvariant, clair3, fibertools --- conf/base.config | 4 ++++ modules/local/clair3/main.nf | 1 + modules/local/deepsomatic/callvariants/main.nf | 1 + modules/local/fibertoolsrs/fire/main.nf | 1 + modules/local/fibertoolsrs/nucleosomes/main.nf | 1 + modules/local/fibertoolsrs/predictm6a/main.nf | 1 + modules/nf-core/deepvariant/callvariants/main.nf | 1 + 7 files changed, 10 insertions(+) diff --git a/conf/base.config b/conf/base.config index 84625158..79e7c3ee 100644 --- a/conf/base.config +++ b/conf/base.config @@ -26,6 +26,10 @@ process { // adding in your local modules too. // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + withLabel: process_gpu { + ext.use_gpu = { workflow.profile.contains('gpu') } + accelerator = { workflow.profile.contains('gpu') ? 1 : null } + } withLabel:process_single { cpus = { 1 } memory = { 6.GB * task.attempt } diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 6619ef14..33ef8609 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -1,6 +1,7 @@ process CLAIR3 { tag "$meta.id" label 'process_very_high' + label 'process_gpu' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/deepsomatic/callvariants/main.nf b/modules/local/deepsomatic/callvariants/main.nf index 8491e664..f796de51 100644 --- a/modules/local/deepsomatic/callvariants/main.nf +++ b/modules/local/deepsomatic/callvariants/main.nf @@ -1,6 +1,7 @@ process DEEPSOMATIC_CALLVARIANTS { tag "$meta.id" label 'process_high' + label 'process_gpu' //Conda is not supported at the moment container "docker.io/google/deepsomatic:1.7.0" diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 1240f0d5..2d84e7e0 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -2,6 +2,7 @@ process FIBERTOOLSRS_FIRE { tag "$meta.id" label 'process_very_high' label 'process_high_memory' + label 'process_gpu' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 33a6c5ea..7462cd68 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -2,6 +2,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { tag "$meta.id" label 'process_very_high' label 'process_high_memory' + label 'process_gpu' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 5aa174b0..0dabcd20 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -2,6 +2,7 @@ process FIBERTOOLSRS_PREDICTM6A { tag "$meta.id" label 'process_very_high' label 'process_high_memory' + label 'process_gpu' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/deepvariant/callvariants/main.nf b/modules/nf-core/deepvariant/callvariants/main.nf index 2fc656ee..251f4c73 100644 --- a/modules/nf-core/deepvariant/callvariants/main.nf +++ b/modules/nf-core/deepvariant/callvariants/main.nf @@ -2,6 +2,7 @@ process DEEPVARIANT_CALLVARIANTS { tag "$meta.id" label 'process_high' + label 'process_gpu' //Conda is not supported at the moment container "docker.io/google/deepvariant:1.9.0" From 7077cd9a133db40b796ef3e7b15b680cf967cb3c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 15:34:03 +0100 Subject: [PATCH 133/183] snapshot update, schema fix --- nextflow_schema.json | 1 + tests/default.nf.test.snap | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 62b9e650..992f988c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -270,6 +270,7 @@ }, "skip_normalfiber": { "type": "boolean" + }, "skip_nanoplot": { "type": "boolean", "description": "Skip Nanoplot" diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index bd36bc15..8c1f85f8 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -475,7 +475,7 @@ "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], - "timestamp": "2026-03-13T14:26:30.747596368", + "timestamp": "2026-03-13T15:33:42.343920246", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.0" From 80451343b02a6c630c7bd47c25f6dc9afb4fe39c Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 13 Mar 2026 15:48:38 +0100 Subject: [PATCH 134/183] install helpful bcftools modules for consensus vcfs --- modules.json | 20 +- .../nf-core/bcftools/annotate/environment.yml | 10 + modules/nf-core/bcftools/annotate/main.nf | 81 ++ modules/nf-core/bcftools/annotate/meta.yml | 112 +++ .../bcftools/annotate/tests/main.nf.test | 429 +++++++++ .../bcftools/annotate/tests/main.nf.test.snap | 440 +++++++++ .../bcftools/annotate/tests/nextflow.config | 4 + modules/nf-core/bcftools/isec/environment.yml | 9 + modules/nf-core/bcftools/isec/main.nf | 47 + modules/nf-core/bcftools/isec/meta.yml | 101 ++ .../nf-core/bcftools/isec/tests/main.nf.test | 318 +++++++ .../bcftools/isec/tests/main.nf.test.snap | 348 +++++++ .../bcftools/isec/tests/nextflow.config | 3 + modules/nf-core/bcftools/norm/environment.yml | 10 + modules/nf-core/bcftools/norm/main.nf | 71 ++ modules/nf-core/bcftools/norm/meta.yml | 107 +++ .../nf-core/bcftools/norm/tests/main.nf.test | 545 +++++++++++ .../bcftools/norm/tests/main.nf.test.snap | 876 ++++++++++++++++++ .../bcftools/norm/tests/nextflow.bcf.config | 4 + .../norm/tests/nextflow.bcf_gz.config | 4 + .../bcftools/norm/tests/nextflow.config | 4 + .../bcftools/norm/tests/nextflow.vcf.config | 4 + .../norm/tests/nextflow.vcf_gz.config | 4 + .../bcftools/norm/tests/vcf_gz_index.config | 4 + .../norm/tests/vcf_gz_index_csi.config | 4 + .../norm/tests/vcf_gz_index_tbi.config | 4 + subworkflows/local/small_variant_consensus.nf | 6 + 27 files changed, 3564 insertions(+), 5 deletions(-) create mode 100644 modules/nf-core/bcftools/annotate/environment.yml create mode 100644 modules/nf-core/bcftools/annotate/main.nf create mode 100644 modules/nf-core/bcftools/annotate/meta.yml create mode 100644 modules/nf-core/bcftools/annotate/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/annotate/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/annotate/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/isec/environment.yml create mode 100644 modules/nf-core/bcftools/isec/main.nf create mode 100644 modules/nf-core/bcftools/isec/meta.yml create mode 100644 modules/nf-core/bcftools/isec/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/isec/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/isec/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/norm/environment.yml create mode 100644 modules/nf-core/bcftools/norm/main.nf create mode 100644 modules/nf-core/bcftools/norm/meta.yml create mode 100644 modules/nf-core/bcftools/norm/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/norm/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.bcf.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.vcf.config create mode 100644 modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config create mode 100644 modules/nf-core/bcftools/norm/tests/vcf_gz_index.config create mode 100644 modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config create mode 100644 modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config create mode 100644 subworkflows/local/small_variant_consensus.nf diff --git a/modules.json b/modules.json index 2d23478c..8c9ad45c 100644 --- a/modules.json +++ b/modules.json @@ -11,27 +11,37 @@ "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, + "bcftools/annotate": { + "branch": "master", + "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", + "installed_by": ["modules"] + }, "bcftools/concat": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules", "vcf_gather_bcftools"] }, + "bcftools/isec": { + "branch": "master", + "git_sha": "3b2c3559699a7bca6a7c2b220695a072e030e17d", + "installed_by": ["modules"] + }, "bcftools/merge": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", "installed_by": ["modules"] }, + "bcftools/norm": { + "branch": "master", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", + "installed_by": ["modules"] + }, "bcftools/sort": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules", "vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, - "deepsomatic": { - "branch": "master", - "git_sha": "ddb0d667cf6cdee3bab9497241de4bbf6b88d8cc", - "installed_by": ["modules"] - }, "deepvariant/callvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", diff --git a/modules/nf-core/bcftools/annotate/environment.yml b/modules/nf-core/bcftools/annotate/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/annotate/main.nf b/modules/nf-core/bcftools/annotate/main.nf new file mode 100644 index 00000000..18778cc2 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/main.nf @@ -0,0 +1,81 @@ +process BCFTOOLS_ANNOTATE { + tag "${meta.id}" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" + + input: + tuple val(meta), path(input), path(index), path(annotations), path(annotations_index), path(columns), path(header_lines), path(rename_chrs) + + output: + tuple val(meta), path("${prefix}.${extension}"), emit: vcf + tuple val(meta), path("${prefix}.${extension}.tbi"), emit: tbi, optional: true + tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def annotations_file = annotations ? "--annotations ${annotations}" : '' + def columns_file = columns ? "--columns-file ${columns}" : '' + def header_file = header_lines ? "--header-lines ${header_lines}" : '' + def rename_chrs_file = rename_chrs ? "--rename-chrs ${rename_chrs}" : '' + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : "vcf" + def index_command = !index ? "bcftools index ${input}" : '' + + if ("${input}" == "${prefix}.${extension}") { + error("Input and output names are the same, set prefix in module configuration to disambiguate!") + } + """ + ${index_command} + + bcftools \\ + annotate \\ + ${args} \\ + ${annotations_file} \\ + ${columns_file} \\ + ${header_file} \\ + ${rename_chrs_file} \\ + --output ${prefix}.${extension} \\ + --threads ${task.cpus} \\ + ${input} + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : "vcf" + def index_extension = 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_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && index_extension.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index_extension}" : "" + + if ("${input}" == "${prefix}.${extension}") { + error("Input and output names are the same, set prefix in module configuration to disambiguate!") + } + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + """ +} diff --git a/modules/nf-core/bcftools/annotate/meta.yml b/modules/nf-core/bcftools/annotate/meta.yml new file mode 100644 index 00000000..86331661 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/meta.yml @@ -0,0 +1,112 @@ +name: bcftools_annotate +description: Add or remove annotations. +keywords: + - bcftools + - annotate + - vcf + - remove + - add +tools: + - annotate: + description: Add or remove annotations. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: https://samtools.github.io/bcftools/bcftools.html#annotate + 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 ] + - input: + type: file + description: Query VCF or BCF file, can be either uncompressed or compressed + ontologies: [] + - index: + type: file + description: Index of the query VCF or BCF file + ontologies: [] + - annotations: + type: file + description: Bgzip-compressed file with annotations + ontologies: [] + - annotations_index: + type: file + description: Index of the annotations file + ontologies: [] + - columns: + type: file + description: List of columns in the annotations file, one name per row + ontologies: [] + - header_lines: + type: file + description: Contains lines to append to the output VCF header + ontologies: [] + - rename_chrs: + type: file + description: Rename annotations according to this file containing "old_name new_name\n" + pairs separated by whitespaces, each on a separate line. + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.${extension}": + type: file + description: Compressed annotated VCF file + pattern: "*{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.${extension}.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.${extension}.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +authors: + - "@projectoriented" + - "@ramprasadn" +maintainers: + - "@projectoriented" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/annotate/tests/main.nf.test b/modules/nf-core/bcftools/annotate/tests/main.nf.test new file mode 100644 index 00000000..3e1d2573 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/main.nf.test @@ -0,0 +1,429 @@ +nextflow_process { + + name "Test Process BCFTOOLS_ANNOTATE" + script "../main.nf" + config "./nextflow.config" + process "BCFTOOLS_ANNOTATE" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/annotate" + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_output") { + + when { + params { + args_modules = "-x ID,INFO/DP,FORMAT/DP --output-type z" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.collect { it.collect { it instanceof Map ? it : file(it).name + ":variantsMD5," + path(it).vcf.variantsMD5 }}, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, [], annotation, annotation_tbi], [], [], [] - vcf_output") { + + when { + params { + args_modules = "-x ID,INFO/DP,FORMAT/DP --output-type z" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.collect { it.collect { it instanceof Map ? it : file(it).name + ":variantsMD5," + path(it).vcf.variantsMD5 }}, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index") { + + when { + params { + args_modules = "--output-type z --write-index --no-version" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.collect { it.collect { it instanceof Map ? it : file(it).name + ":variantsMD5," + path(it).vcf.variantsMD5 }}, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_csi") { + + when { + params { + args_modules = "--output-type z --write-index=csi --no-version" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.collect { it.collect { it instanceof Map ? it : file(it).name + ":variantsMD5," + path(it).vcf.variantsMD5 }}, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_tbi") { + + when { + params { + args_modules = "--output-type z --write-index=tbi --no-version" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.collect { it.collect { it instanceof Map ? it : file(it).name + ":variantsMD5," + path(it).vcf.variantsMD5 }}, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, [], annotation, annotation_tbi], [], header, [] - bcf_output") { + + when { + params { + args_modules = "-x ID,INFO/DP,FORMAT/DP --output-type u" + } + process { + """ + header = channel.of( + '##INFO=', + '##INFO=' + ).collectFile(name:"headers.vcf", newLine:true) + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + 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/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [] + ]) + .combine(header) + .combine(channel.of([[]])) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.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.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, [], annotation, annotation_tbi], columns, [], [] - bcf_output") { + + when { + params { + args_modules = "-x ID,INFO/DP,FORMAT/DP --output-type u" + } + process { + """ + columns = channel.of('INFO/ICB', 'INFO/HOB', 'INFO/DP4').collectFile(name:"columns.txt", newLine:true) + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + 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/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ]).combine(columns) + .combine(channel.of([[], []])) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.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.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, [], annotation, annotation_tbi], [], header, rename_chrs - vcf_gz_index") { + + when { + params { + args_modules = "--output-type z --write-index --no-version" + } + process { + """ + headers = channel.of( + '##INFO=', + '##INFO=' + ).collectFile(name:"headers.vcf", newLine:true) + rename = channel.of('MT192765.1 renamed').collectFile(name:"rename.txt", newLine:true) + input[0] = channel.of([ + [ id:'test', single_end:false ], // meta map + 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/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [] + ]).combine(headers) + .combine(rename) + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.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.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - stub") { + + options "-stub" + + when { + params { + args_modules = "-x ID,INFO/DP,FORMAT/DP --output-type z" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.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.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index - stub") { + + options "-stub" + + when { + params { + args_modules = "--output-type z --write-index --no-version" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.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.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_csi - stub") { + + options "-stub" + + when { + params { + args_modules = "--output-type z --write-index=csi --no-version" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.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.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_tbi - stub") { + + options "-stub" + + when { + params { + args_modules = "--output-type z --write-index=tbi --no-version" + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + 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.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true), + [], [], [] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + process.out.vcf.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.csi.collect { it.collect { it instanceof Map ? it : file(it).name }}, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } +} diff --git a/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap b/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap new file mode 100644 index 00000000..10af196a --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/main.nf.test.snap @@ -0,0 +1,440 @@ +{ + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz.csi" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:29:19.618749659" + }, + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz:variantsMD5,bc7bf3ee9e8430e064c539eb81e59bf9" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz.tbi" + ] + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:28:43.350060834" + }, + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz:variantsMD5,bc7bf3ee9e8430e064c539eb81e59bf9" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz.csi" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:28:36.101003418" + }, + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_tbi - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz" + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz.tbi" + ] + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:29:34.19449127" + }, + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index_csi - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz.csi" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:29:26.927815399" + }, + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz:variantsMD5,bc7bf3ee9e8430e064c539eb81e59bf9" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz.csi" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:28:28.891823681" + }, + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - stub": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz" + ] + ], + [ + + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:29:12.400301681" + }, + "sarscov2 - [vcf, [], annotation, annotation_tbi], [], header, [] - bcf_output": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.bcf" + ] + ], + [ + + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:28:50.375384421" + }, + "sarscov2 - [vcf, [], annotation, annotation_tbi], [], [], [] - vcf_output": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz:variantsMD5,250b64289ab9d48f76359d01699fdf7d" + ] + ], + [ + + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:28:21.320211288" + }, + "sarscov2 - [vcf, tbi, annotation, annotation_tbi], [], [], [] - vcf_output": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz:variantsMD5,250b64289ab9d48f76359d01699fdf7d" + ] + ], + [ + + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:28:13.274072987" + }, + "sarscov2 - [vcf, [], annotation, annotation_tbi], [], header, rename_chrs - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz" + ] + ], + [ + + ], + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.vcf.gz.csi" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:29:05.094685409" + }, + "sarscov2 - [vcf, [], annotation, annotation_tbi], columns, [], [] - bcf_output": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test_ann.bcf" + ] + ], + [ + + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_ANNOTATE", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.3" + }, + "timestamp": "2026-02-27T15:28:57.906382655" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/annotate/tests/nextflow.config b/modules/nf-core/bcftools/annotate/tests/nextflow.config new file mode 100644 index 00000000..10235100 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/tests/nextflow.config @@ -0,0 +1,4 @@ +process { + ext.args = "${params.args_modules}" + ext.prefix = { "${meta.id}_ann" } +} diff --git a/modules/nf-core/bcftools/isec/environment.yml b/modules/nf-core/bcftools/isec/environment.yml new file mode 100644 index 00000000..cb55500b --- /dev/null +++ b/modules/nf-core/bcftools/isec/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::bcftools=1.22 + - bioconda::htslib=1.22.1 diff --git a/modules/nf-core/bcftools/isec/main.nf b/modules/nf-core/bcftools/isec/main.nf new file mode 100644 index 00000000..f39c7101 --- /dev/null +++ b/modules/nf-core/bcftools/isec/main.nf @@ -0,0 +1,47 @@ +process BCFTOOLS_ISEC { + tag "${meta.id}" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" + + input: + tuple val(meta), path(vcfs), path(tbis), path(file_list), path(targets_file), path(regions_file) + + output: + tuple val(meta), path("${prefix}", type: "dir"), emit: results + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + targets_file_args = targets_file ? "-T ${targets_file}" : '' + regions_file_args = regions_file ? "-R ${regions_file}" : '' + vcf_files = file_list ? "-l ${file_list}" : "${vcfs}" + + """ + bcftools isec \\ + ${args} \\ + ${targets_file_args} \\ + ${regions_file_args} \\ + -p ${prefix} \\ + ${vcf_files} \\ + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + mkdir ${prefix} + touch ${prefix}/README.txt + touch ${prefix}/sites.txt + echo "" | gzip > ${prefix}/0000.vcf.gz + touch ${prefix}/0000.vcf.gz.tbi + echo "" | gzip > ${prefix}/0001.vcf.gz + touch ${prefix}/0001.vcf.gz.tbi + """ +} diff --git a/modules/nf-core/bcftools/isec/meta.yml b/modules/nf-core/bcftools/isec/meta.yml new file mode 100644 index 00000000..051e141e --- /dev/null +++ b/modules/nf-core/bcftools/isec/meta.yml @@ -0,0 +1,101 @@ +name: bcftools_isec +description: Apply set operations to VCF files +keywords: + - variant calling + - intersect + - union + - complement + - VCF + - BCF +tools: + - isec: + description: | + Computes intersections, unions and complements of 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/bcf files. These must be compressed and have an associated index. + e.g. [ 'file1.vcf.gz', 'file2.vcf' ] + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: + - edam: "http://edamontology.org/format_3016" # VCF + - edam: "http://edamontology.org/format_3570" # BCF + - tbis: + type: list + description: | + List containing the tbi index files corresponding to the vcf/bcf input files + pattern: "*.tbi" + ontologies: + - edam: "http://edamontology.org/format_3475" # Tabix index + - file_list: + type: file + description: | + Optional text file containing the list of VCF/BCF files to be processed by bcftools isec, one per line. + ontologies: + - edam: "http://edamontology.org/format_2330" # Text file + - targets_file: + type: file + description: | + Optional file containing target regions to restrict the analysis to. + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - edam: "http://edamontology.org/format_3475" # Tab-separated + - regions_file: + type: file + description: | + Optional file containing regions to restrict the analysis to. + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - edam: "http://edamontology.org/format_3475" # Tab-separated +output: + results: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}: + type: directory + description: Directory containing the output files from bcftools isec + pattern: "${prefix}/" + ontologies: + - edam: "http://edamontology.org/format_3016" # VCF + - edam: "http://edamontology.org/format_3570" # BCF + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - bcftools --version | sed '1!d; s/^.*bcftools //': + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - bcftools --version | sed '1!d; s/^.*bcftools //': + type: string + description: The command used to generate the version of the tool +authors: + - "@joseespinosa" + - "@drpatelh" +maintainers: + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/bcftools/isec/tests/main.nf.test b/modules/nf-core/bcftools/isec/tests/main.nf.test new file mode 100644 index 00000000..d0a1f751 --- /dev/null +++ b/modules/nf-core/bcftools/isec/tests/main.nf.test @@ -0,0 +1,318 @@ +nextflow_process { + + name "Test Process BCFTOOLS_ISEC" + script "../main.nf" + process "BCFTOOLS_ISEC" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/isec" + + config "./nextflow.config" + + test("sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]]") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [], + [], + [] + ] + """ + } + } + + then { + def results_dir = new File(process.out.results[0][1]) + def results_list = [] + results_dir.eachFileRecurse { file -> results_list << file.getName() } + assertAll( + { assert process.success }, + { assert snapshot( + process.out.findAll { key, val -> key.startsWith("versions") }, + results_list.sort(), + path("${process.out.results[0][1]}").list().findAll { + it.getFileName().toString() != "0000.vcf.gz.tbi" && it.getFileName().toString() != "0001.vcf.gz.tbi" + } + ).match() + } + ) + } + } + + test("sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [], + [], + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - targets") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [], + [file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test2.bed', checkIfExists: true)], + [] + ] + """ + } + } + + then { + def results_dir = new File(process.out.results[0][1]) + def results_list = [] + results_dir.eachFileRecurse { file -> results_list << file.getName() } + assertAll( + { assert process.success }, + { assert snapshot( + process.out.findAll { key, val -> key.startsWith("versions") }, + results_list.sort(), + path("${process.out.results[0][1]}").list().findAll { + it.getFileName().toString() != "0000.vcf.gz.tbi" && it.getFileName().toString() != "0001.vcf.gz.tbi" && it.getFileName().toString() != "sites.txt" + } + ).match() + } + ) + } + } + + test("sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - targets - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [], + [file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test2.bed', checkIfExists: true)], + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - regions") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [], + [], + [file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test2.bed', checkIfExists: true)] + ] + """ + } + } + + then { + def results_dir = new File(process.out.results[0][1]) + def results_list = [] + results_dir.eachFileRecurse { file -> results_list << file.getName() } + assertAll( + { assert process.success }, + { assert snapshot( + process.out.findAll { key, val -> key.startsWith("versions") }, + results_list.sort(), + path("${process.out.results[0][1]}").list().findAll { + it.getFileName().toString() != "0000.vcf.gz.tbi" && it.getFileName().toString() != "0001.vcf.gz.tbi" && it.getFileName().toString() != "sites.txt" + } + ).match() + } + ) + } + } + + test("sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - regions - stub") { + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [], + [], + [file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test2.bed', checkIfExists: true)] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - file_list") { + + setup{ + new File("${launchDir}/file_list.txt").text = """ + test.vcf.gz + test2.vcf.gz + """.stripIndent().trim() + } + + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [file("${launchDir}/file_list.txt", checkIfExists: true)], + [], + [] + ] + """ + } + } + + then { + def results_dir = new File(process.out.results[0][1]) + def results_list = [] + results_dir.eachFileRecurse { file -> results_list << file.getName() } + assertAll( + { assert process.success }, + { assert snapshot( + process.out.findAll { key, val -> key.startsWith("versions") }, + results_list.sort(), + path("${process.out.results[0][1]}").list().findAll { + it.getFileName().toString() != "0000.vcf.gz.tbi" && it.getFileName().toString() != "0001.vcf.gz.tbi" + } + ).match() + } + ) + } + } + test("sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - file_list - stub") { + options "-stub" + + setup{ + new File("${launchDir}/file_list.txt").text = """ + test.vcf.gz + test2.vcf.gz + """.stripIndent().trim() + } + + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + [ + 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/test2.vcf.gz', checkIfExists: true) + ], + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi', checkIfExists: true) + ], + [file("${launchDir}/file_list.txt", checkIfExists: true)], + [], + [] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + + ) + } + } +} diff --git a/modules/nf-core/bcftools/isec/tests/main.nf.test.snap b/modules/nf-core/bcftools/isec/tests/main.nf.test.snap new file mode 100644 index 00000000..8a2cb65f --- /dev/null +++ b/modules/nf-core/bcftools/isec/tests/main.nf.test.snap @@ -0,0 +1,348 @@ +{ + "sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]]": { + "content": [ + { + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + }, + [ + "0000.vcf.gz", + "0000.vcf.gz.tbi", + "0001.vcf.gz", + "0001.vcf.gz.tbi", + "README.txt", + "sites.txt" + ], + [ + "0000.vcf.gz:md5,8e722884ffb75155212a3fc053918766", + "0001.vcf.gz:md5,b39a72f91458b94b346dd73690207649", + "README.txt:md5,10fc33b66522645600d44afbd41fb792", + "sites.txt:md5,1cea3fbde7f6d3c97f3d39036f9690df" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:03:48.711543241" + }, + "sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - targets": { + "content": [ + { + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + }, + [ + "0000.vcf.gz", + "0000.vcf.gz.tbi", + "0001.vcf.gz", + "0001.vcf.gz.tbi", + "README.txt", + "sites.txt" + ], + [ + "0000.vcf.gz:md5,565cbbb0d930be20fc235604da695623", + "0001.vcf.gz:md5,d65e9e45a4c5f45873cb26b80c81b213", + "README.txt:md5,f4190b7943f8f12886ad57ecaedd0c43" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-28T11:48:46.533255686" + }, + "sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - regions - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ], + "results": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-23T19:06:04.239620535" + }, + "sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - targets - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ], + "results": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-23T18:58:08.73508502" + }, + "sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - file_list": { + "content": [ + { + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + }, + [ + "0000.vcf.gz", + "0000.vcf.gz.tbi", + "0001.vcf.gz", + "0001.vcf.gz.tbi", + "README.txt", + "sites.txt" + ], + [ + "0000.vcf.gz:md5,8e722884ffb75155212a3fc053918766", + "0001.vcf.gz:md5,b39a72f91458b94b346dd73690207649", + "README.txt:md5,4426b6b26b177d85e150f06bd5138411", + "sites.txt:md5,1cea3fbde7f6d3c97f3d39036f9690df" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-27T12:52:50.066330847" + }, + "sarscov2 - [[vcf1, vcf2], [tbi1, tbi2]] - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ], + "results": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:03:56.874977547" + }, + "sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - regions": { + "content": [ + { + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + }, + [ + "0000.vcf.gz", + "0000.vcf.gz.tbi", + "0001.vcf.gz", + "0001.vcf.gz.tbi", + "README.txt", + "sites.txt" + ], + [ + "0000.vcf.gz:md5,565cbbb0d930be20fc235604da695623", + "0001.vcf.gz:md5,d65e9e45a4c5f45873cb26b80c81b213", + "README.txt:md5,16eeab1b2463bab4d498a4dfdaa297fa" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-28T11:49:26.428693544" + }, + "sarscov2 - [[vcf1.gz, vcf2.gz], [tbi1, tbi2]] - file_list - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "1": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ], + "results": [ + [ + { + "id": "test" + }, + [ + "0000.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0000.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "0001.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "0001.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e", + "README.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sites.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_ISEC", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.04.8" + }, + "timestamp": "2026-01-28T11:55:27.123701797" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/isec/tests/nextflow.config b/modules/nf-core/bcftools/isec/tests/nextflow.config new file mode 100644 index 00000000..ac887d6b --- /dev/null +++ b/modules/nf-core/bcftools/isec/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = '--nfiles +2 --output-type z --no-version' +} diff --git a/modules/nf-core/bcftools/norm/environment.yml b/modules/nf-core/bcftools/norm/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/norm/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf new file mode 100644 index 00000000..443c8bbb --- /dev/null +++ b/modules/nf-core/bcftools/norm/main.nf @@ -0,0 +1,71 @@ +process BCFTOOLS_NORM { + tag "${meta.id}" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" + + input: + tuple val(meta), path(vcf), path(tbi) + tuple val(meta2), path(fasta) + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf.gz" + """ + bcftools norm \\ + --fasta-ref ${fasta} \\ + --output ${prefix}.${extension} \\ + ${args} \\ + --threads ${task.cpus} \\ + ${vcf} + """ + + stub: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf.gz" + def index = '' + if (extension in ['vcf.gz', 'bcf', 'bcf.gz']) { + if (['--write-index=tbi', '-W=tbi'].any { arg -> args.contains(arg) } && extension == 'vcf.gz') { + index = 'tbi' + } + else if (['--write-index=tbi', '-W=tbi', '--write-index=csi', '-W=csi', '--write-index', '-W'].any { arg -> args.contains(arg) }) { + index = 'csi' + } + } + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = index ? "touch ${prefix}.${extension}.${index}" : "" + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + """ +} diff --git a/modules/nf-core/bcftools/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml new file mode 100644 index 00000000..9feecac0 --- /dev/null +++ b/modules/nf-core/bcftools/norm/meta.yml @@ -0,0 +1,107 @@ +name: bcftools_norm +description: Normalize VCF file +keywords: + - normalize + - norm + - variant calling + - VCF +tools: + - norm: + description: | + Normalize 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 ] + - vcf: + type: file + description: | + The vcf file to be normalized + e.g. 'file1.vcf' + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - tbi: + type: file + description: | + An optional index of the VCF file (for when the VCF is compressed) + pattern: "*.vcf.gz.tbi" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: FASTA reference file + pattern: "*.{fasta,fa}" + ontologies: [] +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: One of uncompressed VCF (.vcf), compressed VCF (.vcf.gz), compressed + BCF (.bcf.gz) or uncompressed BCF (.bcf) normalized output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +authors: + - "@abhi18av" + - "@ramprasadn" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test b/modules/nf-core/bcftools/norm/tests/main.nf.test new file mode 100644 index 00000000..05851753 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test @@ -0,0 +1,545 @@ +nextflow_process { + + name "Test Process BCFTOOLS_NORM" + script "../main.nf" + process "BCFTOOLS_NORM" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/norm" + + test("sarscov2 - [ vcf, [] ], fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', 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 } } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', 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 } } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', 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 } } + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf output") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', 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.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf output") { + + config "./nextflow.bcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output") { + + config "./nextflow.bcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta -stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf output -stub") { + + config "./nextflow.vcf.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output - stub") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf output - stub") { + + config "./nextflow.bcf.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub") { + + config "./nextflow.bcf_gz.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + 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.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + } + + +} diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test.snap b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap new file mode 100644 index 00000000..ee2dadf7 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap @@ -0,0 +1,876 @@ +{ + "sarscov2 - [ vcf, tbi ], fasta - vcf_gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:29.987030961" + }, + "sarscov2 - [ vcf, [] ], fasta - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:06.488086505" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:34.863776359" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:54.718705045" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf_gz output": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:43.007377633" + }, + "sarscov2 - [ vcf, [] ], fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:07:54.877084219" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf output -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:22.220435939" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,bf88706ef69c44ca9e287bc953ba3593" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,bf88706ef69c44ca9e287bc953ba3593" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:58.483532889" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:10:03.22576704" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T13:53:28.356741947" + }, + "sarscov2 - [ vcf, tbi ], fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:27.281315407" + }, + "sarscov2 - [ vcf, tbi ], fasta -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:14.249715835" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:46.665932019" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T07:52:58.381931979" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:38.144449162" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:10:10.602984345" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T13:53:09.808834237" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,638c3c25bdd495c90ecbccb69ee77f07" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,638c3c25bdd495c90ecbccb69ee77f07" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:51.053195842" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config b/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config new file mode 100644 index 00000000..b79af868 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type b --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config b/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config new file mode 100644 index 00000000..f36f397c --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type u --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.config b/modules/nf-core/bcftools/norm/tests/nextflow.config new file mode 100644 index 00000000..510803b4 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config b/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config new file mode 100644 index 00000000..10bf93e3 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type v --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config b/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config new file mode 100644 index 00000000..b31dd2de --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type z ---no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config new file mode 100644 index 00000000..7dd696ee --- /dev/null +++ b/modules/nf-core/bcftools/norm/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/norm/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config new file mode 100644 index 00000000..aebffb6f --- /dev/null +++ b/modules/nf-core/bcftools/norm/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/norm/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config new file mode 100644 index 00000000..b192ae7d --- /dev/null +++ b/modules/nf-core/bcftools/norm/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/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf new file mode 100644 index 00000000..5afdd3ca --- /dev/null +++ b/subworkflows/local/small_variant_consensus.nf @@ -0,0 +1,6 @@ + +workflow SMALL_VARIANT_CONSENSUS.nf{ + take: + ch_vcf + main: +} \ No newline at end of file From 7df4742ee04a70d6df6acf3eae46fd9eb44e6887 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 16:07:46 +0100 Subject: [PATCH 135/183] add whatshap stats v1 --- workflows/lrsomatic.nf | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index aa50b0bb..c22a8363 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -402,12 +402,39 @@ workflow LRSOMATIC { gnomad ) + // Set channel for phased germline variants germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) // [meta, vcf, []] -- germline variants merged from T/N and tumor-only paths + + // Set channel for somatic variants somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) // [meta, vcf, []] -- somatic variants merged from T/N and tumor-only paths + + if (!params.skip_qc && !params.skip_whatshapstats) { + + // Create channel for whatshap stats + germline_vep + .map { meta, vcf, _extra -> + return [meta, vcf] } + .set { ch_whatshap_stats } + // + + // + // Module: WHATSHAP_STATS + // + + WHATSHAP_STATS ( + ch_whatshap_stats, + true, + true, + true + ) + + } + if (!params.skip_vep) { + // // MODULE: GERMLINE_VEP // From c1194ac4f4a7dfe8d0ab8a1f30b1a2108a146792 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 16:11:48 +0100 Subject: [PATCH 136/183] for some reason they wanted to install these --- .../nf-core/deepvariant/callvariants/main.nf | 50 +++++ .../nf-core/deepvariant/callvariants/meta.yml | 68 ++++++ .../callvariants/tests/main.nf.test | 84 ++++++++ .../callvariants/tests/main.nf.test.snap | 55 +++++ .../callvariants/tests/nextflow.config | 11 + .../nf-core/deepvariant/makeexamples/main.nf | 58 +++++ .../nf-core/deepvariant/makeexamples/meta.yml | 135 ++++++++++++ .../makeexamples/tests/main.nf.test | 204 ++++++++++++++++++ .../makeexamples/tests/main.nf.test.snap | 178 +++++++++++++++ .../makeexamples/tests/nextflow.config | 6 + .../deepvariant/postprocessvariants/main.nf | 86 ++++++++ .../deepvariant/postprocessvariants/meta.yml | 155 +++++++++++++ .../postprocessvariants/tests/main.nf.test | 123 +++++++++++ .../tests/main.nf.test.snap | 196 +++++++++++++++++ .../postprocessvariants/tests/nextflow.config | 10 + 15 files changed, 1419 insertions(+) create mode 100644 modules/nf-core/deepvariant/callvariants/main.nf create mode 100644 modules/nf-core/deepvariant/callvariants/meta.yml create mode 100644 modules/nf-core/deepvariant/callvariants/tests/main.nf.test create mode 100644 modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap create mode 100644 modules/nf-core/deepvariant/callvariants/tests/nextflow.config create mode 100644 modules/nf-core/deepvariant/makeexamples/main.nf create mode 100644 modules/nf-core/deepvariant/makeexamples/meta.yml create mode 100644 modules/nf-core/deepvariant/makeexamples/tests/main.nf.test create mode 100644 modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap create mode 100644 modules/nf-core/deepvariant/makeexamples/tests/nextflow.config create mode 100644 modules/nf-core/deepvariant/postprocessvariants/main.nf create mode 100644 modules/nf-core/deepvariant/postprocessvariants/meta.yml create mode 100644 modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test create mode 100644 modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap create mode 100644 modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config diff --git a/modules/nf-core/deepvariant/callvariants/main.nf b/modules/nf-core/deepvariant/callvariants/main.nf new file mode 100644 index 00000000..2fc656ee --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/main.nf @@ -0,0 +1,50 @@ + +process DEEPVARIANT_CALLVARIANTS { + tag "$meta.id" + label 'process_high' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" + + input: + tuple val(meta), path(make_examples_tfrecords) + + output: + tuple val(meta), path("${prefix}.call-*-of-*.tfrecord.gz"), emit: call_variants_tfrecords + tuple val("${task.process}"), val('deepvariant'), eval("/opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //'"), topic: versions, emit: versions_deepvariant + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def matcher = make_examples_tfrecords[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/ + if (!matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + make_examples_tfrecords[0].baseName + "' doesn't match the expected pattern") + } + def examples_tfrecord_name = matcher[0][1] + def shardCount = matcher[0][2] + // Reconstruct the logical name - ${tfrecord_name}.examples.tfrecord@${task.cpus}.gz + def examples_tfrecords_logical_name = "${examples_tfrecord_name}@${shardCount}.gz" + + """ + /opt/deepvariant/bin/call_variants \\ + ${args} \\ + --outfile "${prefix}.call.tfrecord.gz" \\ + --examples "${examples_tfrecords_logical_name}" + + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.call-00000-of-00001.tfrecord.gz + + """ +} diff --git a/modules/nf-core/deepvariant/callvariants/meta.yml b/modules/nf-core/deepvariant/callvariants/meta.yml new file mode 100644 index 00000000..fa1aaa42 --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/meta.yml @@ -0,0 +1,68 @@ +name: deepvariant_callvariants +description: Call variants from the examples produced by make_examples +keywords: + - variant calling + - machine learning + - neural network +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network + to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "10.1038/nbt.4235" + licence: ["BSD-3-clause"] + identifier: biotools:deepvariant +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - make_examples_tfrecords: + type: file + description: The actual sharded input files, from DEEPVARIANT_MAKEEXAMPLES process + pattern: "*.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format +output: + call_variants_tfrecords: + - - meta: + type: list + description: | + Each output contains: unique ID string from input channel, meta, tfrecord file with variant calls. + - ${prefix}.call-*-of-*.tfrecord.gz: + type: list + description: | + Each output contains: unique ID string from input channel, meta, tfrecord file with variant calls. + versions_deepvariant: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +authors: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/deepvariant/callvariants/tests/main.nf.test b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test new file mode 100644 index 00000000..d617650b --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test @@ -0,0 +1,84 @@ +nextflow_process { + + name "Test Process DEEPVARIANT_CALLVARIANTS" + script "../main.nf" + config "./nextflow.config" + process "DEEPVARIANT_CALLVARIANTS" + + tag "deepvariant/makeexamples" + tag "deepvariant/callvariants" + tag "deepvariant" + tag "modules" + tag "modules_nfcore" + + test("homo_sapiens - wgs") { + setup { + run("DEEPVARIANT_MAKEEXAMPLES") { + script "../../makeexamples/main.nf" + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + } + when { + process { + """ + input[0] = DEEPVARIANT_MAKEEXAMPLES.out.examples + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.call_variants_tfrecords.get(0).get(0) == [ id:'test', single_end:false ] }, + // The tfrecord binary representation is not stable, but we check the name of the output. + { assert snapshot(file(process.out.call_variants_tfrecords.get(0).get(1)).name).match("homo_sapiens-wgs-call_variants_tfrecords-filenames")}, + ) + } + } + + test("homo_sapiens - wgs - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta + [] // No input paths are needed in stub mode + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + +} diff --git a/modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap new file mode 100644 index 00000000..ce71dac2 --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap @@ -0,0 +1,55 @@ +{ + "homo_sapiens-wgs-call_variants_tfrecords-filenames": { + "content": [ + "test.call-00000-of-00001.tfrecord.gz" + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "24.04.4" + }, + "timestamp": "2024-09-04T17:04:33.276938" + }, + "homo_sapiens - wgs - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.call-00000-of-00001.tfrecord.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + "DEEPVARIANT_CALLVARIANTS", + "deepvariant", + "1.9.0" + ] + ], + "call_variants_tfrecords": [ + [ + { + "id": "test", + "single_end": false + }, + "test.call-00000-of-00001.tfrecord.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_deepvariant": [ + [ + "DEEPVARIANT_CALLVARIANTS", + "deepvariant", + "1.9.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:02:54.403068431" + } +} \ No newline at end of file diff --git a/modules/nf-core/deepvariant/callvariants/tests/nextflow.config b/modules/nf-core/deepvariant/callvariants/tests/nextflow.config new file mode 100644 index 00000000..68aec144 --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/tests/nextflow.config @@ -0,0 +1,11 @@ +process { + withName: "DEEPVARIANT_CALLVARIANTS" { + ext.args = '--checkpoint "/opt/models/wgs"' + cpus = 2 // Keep CPUs fixed so the number of output files is reproducible + } +} +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + ext.args = '--checkpoint "/opt/models/wgs" --call_small_model_examples --small_model_indel_gq_threshold "30" --small_model_snp_gq_threshold "25" --small_model_vaf_context_window_size "51" --trained_small_model_path "/opt/smallmodels/wgs"' + } +} diff --git a/modules/nf-core/deepvariant/makeexamples/main.nf b/modules/nf-core/deepvariant/makeexamples/main.nf new file mode 100644 index 00000000..77d2f331 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/main.nf @@ -0,0 +1,58 @@ +process DEEPVARIANT_MAKEEXAMPLES { + tag "$meta.id" + label 'process_high' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" + + input: + tuple val(meta), path(input), path(index), path(intervals) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(gzi) + tuple val(meta5), path(par_bed) + + output: + tuple val(meta), path("${prefix}.examples.tfrecord-*-of-*.gz{,.example_info.json}"), emit: examples + tuple val(meta), path("${prefix}.gvcf.tfrecord-*-of-*.gz"), emit: gvcf + tuple val(meta), path("${prefix}_call_variant_outputs.examples.tfrecord-*-of-*.gz", arity: "0..*"), emit: small_model_calls + tuple val("${task.process}"), val('deepvariant'), eval("/opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //'"), topic: versions, emit: versions_deepvariant + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def regions = intervals ? "--regions ${intervals}" : "" + def par_regions = par_bed ? "--par_regions_bed=${par_bed}" : "" + + """ + seq 0 ${task.cpus - 1} | parallel -q --halt 2 --line-buffer /opt/deepvariant/bin/make_examples \\ + --mode calling \\ + --ref "${fasta}" \\ + --reads "${input}" \\ + --examples "./${prefix}.examples.tfrecord@${task.cpus}.gz" \\ + --gvcf "./${prefix}.gvcf.tfrecord@${task.cpus}.gz" \\ + ${regions} \\ + ${par_regions} \\ + ${args} \\ + --task {} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}" + """ + printf -v SHARD_COUNT "%04d" ${task.cpus} + for i in \$( seq -f "%04g" 0 ${task.cpus-1} ) + do + echo "" | gzip > ${prefix}.examples.tfrecord-\$i-of-\$SHARD_COUNT.tfrecord.gz + touch ${prefix}.examples.tfrecord-\$i-of-\$SHARD_COUNT.tfrecord.gz.example_info.json + echo "" | gzip > ${prefix}.gvcf.tfrecord-\$i-of-\$SHARD_COUNT.tfrecord.gz + done + """ +} diff --git a/modules/nf-core/deepvariant/makeexamples/meta.yml b/modules/nf-core/deepvariant/makeexamples/meta.yml new file mode 100644 index 00000000..12056fbd --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/meta.yml @@ -0,0 +1,135 @@ +name: deepvariant_makeexamples +description: Transforms the input alignments to a format suitable for the deep neural + network variant caller +keywords: + - variant calling + - machine learning + - neural network +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network + to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "10.1038/nbt.4235" + licence: ["BSD-3-clause"] + identifier: biotools:deepvariant +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file + pattern: "*.bam/cram" + ontologies: [] + - index: + type: file + description: Index of BAM/CRAM file + pattern: "*.bai/crai" + ontologies: [] + - intervals: + type: file + description: Interval file for targeted regions + pattern: "*.bed" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - gzi: + type: file + description: GZI index of reference fasta file + ontologies: [] + - - meta5: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + pattern: "*.gzi" + - par_bed: + type: file + description: BED file containing PAR regions + pattern: "*.bed" + ontologies: [] +output: + examples: + - - meta: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + - ${prefix}.examples.tfrecord-*-of-*.gz{,.example_info.json}: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + gvcf: + - - meta: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + - ${prefix}.gvcf.tfrecord-*-of-*.gz: + type: list + description: | + Tuple containing sample metadata and the GVCF data in tfrecord format + small_model_calls: + - - meta: + type: list + description: | + Tuple containing sample metadata and examples that can be used for calling + - ${prefix}_call_variant_outputs.examples.tfrecord-*-of-*.gz: + type: list + description: | + Optional variant calls from the small model, if enabled, in tfrecord format + versions_deepvariant: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test new file mode 100644 index 00000000..cc06f780 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test @@ -0,0 +1,204 @@ +nextflow_process { + + name "Test Process DEEPVARIANT_MAKEEXAMPLES" + script "../main.nf" + config "./nextflow.config" + process "DEEPVARIANT_MAKEEXAMPLES" + + tag "deepvariant/makeexamples" + tag "deepvariant" + tag "modules" + tag "modules_nfcore" + + test("homo_sapiens - [bam, bai] - fasta - fai") { + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + + { assert process.out.examples[0][0] == [id:'test', single_end:false] }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test1-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test1-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test1-gvcf-filenames") } + ) + } + } + + test("homo_sapiens - [cram, crai, genome_bed] - fasta - fai") { + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.bed', checkIfExists: true) + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.examples[0][0] == [id:'test', single_end:false] }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test2-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test2-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test2-gvcf-filenames") } + ) + } + } + + test("homo_sapiens - [bam, bai] - fasta_gz - fasta_gz_fai") { + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.gz', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.gz.fai', checkIfExists: true) + ] + input[3] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.gz.gzi', checkIfExists: true) + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.examples[0][0] == [id:'test', single_end:false] }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test3-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test3-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test3-gvcf-filenames") } + ) + } + } + + test("stub") { + + options "-stub" + + when { + + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.gvcf[0][0] == [id:'test', single_end:false] }, + { assert process.out.examples[0][1].size() == 4 }, + { assert snapshot( + process.out.examples[0][1].collect { file(it).name } + ).match("test4-examples-filenames") }, + { assert process.out.gvcf[0][1].size() == 2 }, + { assert snapshot(process.out.versions_deepvariant).match("test4-versions") }, + { assert snapshot( + process.out.gvcf[0][1].collect { file(it).name } + ).match("test4-gvcf-filenames") } + ) + } + } +} diff --git a/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap new file mode 100644 index 00000000..729f0dc5 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap @@ -0,0 +1,178 @@ +{ + "test1-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-00000-of-00002.gz", + "test.gvcf.tfrecord-00001-of-00002.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:12:57.93412258" + }, + "test3-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:09:55.034298895" + }, + "test2-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-00000-of-00002.gz", + "test.examples.tfrecord-00000-of-00002.gz.example_info.json", + "test.examples.tfrecord-00001-of-00002.gz", + "test.examples.tfrecord-00001-of-00002.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:14:02.467533548" + }, + "test1-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-00000-of-00002.gz", + "test.examples.tfrecord-00000-of-00002.gz.example_info.json", + "test.examples.tfrecord-00001-of-00002.gz", + "test.examples.tfrecord-00001-of-00002.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:12:57.790379812" + }, + "test2-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:07:52.050411549" + }, + "test4-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:12:07.012233232" + }, + "test4-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-0000-of-0002.tfrecord.gz", + "test.examples.tfrecord-0000-of-0002.tfrecord.gz.example_info.json", + "test.examples.tfrecord-0001-of-0002.tfrecord.gz", + "test.examples.tfrecord-0001-of-0002.tfrecord.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:58.286077155" + }, + "test1-versions": { + "content": [ + [ + [ + "DEEPVARIANT_MAKEEXAMPLES", + "deepvariant", + "1.9.0" + ] + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:05:28.75651648" + }, + "test3-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-00000-of-00002.gz", + "test.gvcf.tfrecord-00001-of-00002.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:03.780115231" + }, + "test3-examples-filenames": { + "content": [ + [ + "test.examples.tfrecord-00000-of-00002.gz", + "test.examples.tfrecord-00000-of-00002.gz.example_info.json", + "test.examples.tfrecord-00001-of-00002.gz", + "test.examples.tfrecord-00001-of-00002.gz.example_info.json" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:03.702565392" + }, + "test2-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-00000-of-00002.gz", + "test.gvcf.tfrecord-00001-of-00002.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:14:02.550236324" + }, + "test4-gvcf-filenames": { + "content": [ + [ + "test.gvcf.tfrecord-0000-of-0002.tfrecord.gz", + "test.gvcf.tfrecord-0001-of-0002.tfrecord.gz" + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-01T02:15:58.412547051" + } +} \ No newline at end of file diff --git a/modules/nf-core/deepvariant/makeexamples/tests/nextflow.config b/modules/nf-core/deepvariant/makeexamples/tests/nextflow.config new file mode 100644 index 00000000..6811fe48 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + cpus = 2 // The number of output files is determined by cpus - keep it the same for tests + ext.args = '--checkpoint "/opt/models/wgs" --call_small_model_examples --small_model_indel_gq_threshold "30" --small_model_snp_gq_threshold "25" --small_model_vaf_context_window_size "51" --trained_small_model_path "/opt/smallmodels/wgs"' + } +} diff --git a/modules/nf-core/deepvariant/postprocessvariants/main.nf b/modules/nf-core/deepvariant/postprocessvariants/main.nf new file mode 100644 index 00000000..0830f9ac --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/main.nf @@ -0,0 +1,86 @@ +process DEEPVARIANT_POSTPROCESSVARIANTS { + tag "$meta.id" + label 'process_medium' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" + + input: + tuple val(meta), path(variant_calls_tfrecord_files), path(gvcf_tfrecords), path(small_model_calls), path(intervals) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(gzi) + + output: + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.vcf.gz.{tbi,csi}") , emit: vcf_index + tuple val(meta), path("${prefix}.g.vcf.gz") , emit: gvcf + tuple val(meta), path("${prefix}.g.vcf.gz.{tbi,csi}") , emit: gvcf_index + tuple val("${task.process}"), val('deepvariant'), eval("/opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //'"), topic: versions, emit: versions_deepvariant + + when: + task.ext.when == null || task.ext.when + + script: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def regions = intervals ? "--regions ${intervals}" : "" + def variant_calls_tfrecord_name = variant_calls_tfrecord_files[0].name.replaceFirst(/-\d{5}-of-\d{5}/, "") + + def gvcf_matcher = gvcf_tfrecords[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/ + if (!gvcf_matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + gvcf_tfrecords[0].baseName + "' doesn't match the expected pattern") + } + def gvcf_tfrecord_name = gvcf_matcher[0][1] + def gvcf_shardCount = gvcf_matcher[0][2] + // Reconstruct the logical name - ${tfrecord_name}.examples.tfrecord@${task.cpus}.gz + def gvcf_tfrecords_logical_name = "${gvcf_tfrecord_name}@${gvcf_shardCount}.gz" + + // The following block determines whether the small model was used, and if so, adds the variant calls from it + // to the argument --small_model_cvo_records. + def small_model_arg = "" + if (small_model_calls) { + small_model_matcher = (small_model_calls[0].baseName =~ /^(.+)-\d{5}-of-(\d{5})$/) + if (!small_model_matcher.matches()) { + throw new IllegalArgumentException("tfrecord baseName '" + small_model_calls[0].baseName + "' doesn't match the expected pattern") + } + small_model_tfrecord_name = small_model_matcher[0][1] + small_model_shardCount = small_model_matcher[0][2] + // Reconstruct the logical name. Example: test_call_variant_outputs.examples.tfrecord@12.gz + small_model_tfrecords_logical_name = "${small_model_tfrecord_name}@${small_model_shardCount}.gz" + small_model_arg = "--small_model_cvo_records ${small_model_tfrecords_logical_name}" + } + + """ + /opt/deepvariant/bin/postprocess_variants \\ + ${args} \\ + --ref "${fasta}" \\ + --infile "${variant_calls_tfrecord_name}" \\ + --outfile "${prefix}.vcf.gz" \\ + --nonvariant_site_tfrecord_path "${gvcf_tfrecords_logical_name}" \\ + --gvcf_outfile "${prefix}.g.vcf.gz" \\ + ${regions} \\ + ${small_model_arg} \\ + --cpus $task.cpus + + """ + + stub: + // Exit if running this module with -profile conda / -profile mamba + if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { + error "DEEPVARIANT module does not support Conda. Please use Docker / Singularity / Podman instead." + } + prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.vcf.gz + touch ${prefix}.vcf.gz.tbi + echo "" | gzip > ${prefix}.g.vcf.gz + touch ${prefix}.g.vcf.gz.tbi + + """ +} diff --git a/modules/nf-core/deepvariant/postprocessvariants/meta.yml b/modules/nf-core/deepvariant/postprocessvariants/meta.yml new file mode 100644 index 00000000..4a087011 --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/meta.yml @@ -0,0 +1,155 @@ +name: deepvariant_postprocessvariants +description: DeepVariant is an analysis pipeline that uses a deep neural network to + call genetic variants from next-generation DNA sequencing data +keywords: + - variant calling + - machine learning + - neural network +tools: + - deepvariant: + description: DeepVariant is an analysis pipeline that uses a deep neural network + to call genetic variants from next-generation DNA sequencing data + homepage: https://github.com/google/deepvariant + documentation: https://github.com/google/deepvariant + tool_dev_url: https://github.com/google/deepvariant + doi: "10.1038/nbt.4235" + licence: ["BSD-3-clause"] + identifier: biotools:deepvariant +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - variant_calls_tfrecord_files: + type: file + description: | + One or more data files containing variant calls from DEEPVARIANT_CALLVARIANTS + pattern: "*.tfrecord.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - gvcf_tfrecords: + type: file + description: | + Sharded tfrecord file from DEEPVARIANT_MAKEEXAMPLES with the coverage information used for GVCF output + pattern: "*.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - small_model_calls: + type: file + description: | + Sharded tfrecord file from DEEPVARIANT_MAKEEXAMPLES with variant calls from the small model + pattern: "*.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - intervals: + type: file + description: Interval file for targeted regions + pattern: "*.bed" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - gzi: + type: file + description: GZI index of reference fasta file + pattern: "*.gzi" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.vcf.gz: + type: file + description: Compressed VCF file + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + vcf_index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.vcf.gz.{tbi,csi}: + type: file + description: Index for VCF + pattern: "$*.vcf.gz.{tbi,csi}" + ontologies: [] + gvcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.g.vcf.gz: + type: file + description: Compressed GVCF file + pattern: "*.g.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + gvcf_index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - ${prefix}.g.vcf.gz.{tbi,csi}: + type: file + description: Index for GVCF + pattern: "*.g.vcf.gz.{tbi,csi}" + ontologies: [] + versions_deepvariant: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - deepvariant: + type: string + description: The tool name + - /opt/deepvariant/bin/run_deepvariant --version | sed 's/^.*version //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@abhi18av" + - "@ramprasadn" + - "@fa2k" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test new file mode 100644 index 00000000..ef9110b0 --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test @@ -0,0 +1,123 @@ +nextflow_process { + + name "Test Process DEEPVARIANT_POSTPROCESSVARIANTS" + script "../main.nf" + process "DEEPVARIANT_POSTPROCESSVARIANTS" + config "./nextflow.config" + + tag "deepvariant/makeexamples" + tag "deepvariant/callvariants" + tag "deepvariant/postprocessvariants" + tag "deepvariant" + tag "modules" + tag "modules_nfcore" + + test("homo_sapiens - wgs") { + setup { + run("DEEPVARIANT_MAKEEXAMPLES") { + script "../../makeexamples/main.nf" + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), + [], + + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + input[4] = [ + [],[] + ] + """ + } + } + run("DEEPVARIANT_CALLVARIANTS") { + script "../../callvariants/main.nf" + process { + """ + input[0] = DEEPVARIANT_MAKEEXAMPLES.out.examples + """ + } + } + } + when { + process { + """ + input[0] = DEEPVARIANT_CALLVARIANTS.out.call_variants_tfrecords.join( + DEEPVARIANT_MAKEEXAMPLES.out.gvcf, + failOnMismatch: true + ).join( + DEEPVARIANT_MAKEEXAMPLES.out.small_model_calls, + failOnMismatch: true + ).map { meta, tf, gvcf, small_model_calls -> [ meta, tf, gvcf, small_model_calls, [] ] } + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("homo_sapiens - wgs - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + [], + [], + [], + [], + ] + input[1] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = [ + [ id:'genome'], + file(params.modules_testdata_base_path + '/genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + input[3] = [ + [],[] + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match("stub") } + ) + } + } + +} diff --git a/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap new file mode 100644 index 00000000..a981cf84 --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap @@ -0,0 +1,196 @@ +{ + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ], + "gvcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "gvcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "vcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_deepvariant": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:22:12.888323156" + }, + "homo_sapiens - wgs": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ] + ], + "4": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ], + "gvcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz:md5,89b2e47883a65bb9cae8f173e782bb17" + ] + ], + "gvcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.g.vcf.gz.tbi:md5,1680c67fe988bc1d8220fbb4127c2c18" + ] + ], + "vcf": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz:md5,707212230030c8c3efbe5c2e0428da03" + ] + ], + "vcf_index": [ + [ + { + "id": "test", + "single_end": false + }, + "test.vcf.gz.tbi:md5,248648ca03f5fda904ebbef8821e0e37" + ] + ], + "versions_deepvariant": [ + [ + "DEEPVARIANT_POSTPROCESSVARIANTS", + "deepvariant", + "1.9.0" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-02-02T17:19:32.037352523" + } +} \ No newline at end of file diff --git a/modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config b/modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config new file mode 100644 index 00000000..b8f3f47a --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: "DEEPVARIANT_CALLVARIANTS" { + ext.args = '--checkpoint "/opt/models/wgs"' + } +} +process { + withName: "DEEPVARIANT_MAKEEXAMPLES" { + ext.args = '--checkpoint "/opt/models/wgs" --call_small_model_examples --small_model_indel_gq_threshold "30" --small_model_snp_gq_threshold "25" --small_model_vaf_context_window_size "51" --trained_small_model_path "/opt/smallmodels/wgs"' + } +} From 8e1ee1bbebbd8fc82268612c8d1d585979b34289 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 16:12:03 +0100 Subject: [PATCH 137/183] further whatshap implementations --- conf/modules.config | 9 +++++++++ subworkflows/local/tumor_normal_happhase.nf | 16 ++++++++-------- subworkflows/local/tumor_only_happhase.nf | 17 +++++++++-------- workflows/lrsomatic.nf | 9 +++++++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6fad45aa..68e4b06e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -96,6 +96,14 @@ process { ] } + withName: '.*:WHATSHAP_STATS' { + publishDir = [ + path: { "${params.outdir}/${meta.id}/qc/whatshap_stats" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + // // Preprocessing and other processes // @@ -222,6 +230,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*:LONGPHASE_HAPLOTAG' { ext.prefix = { "${meta.id}_${meta.type}" } publishDir = [ diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 0580c10e..b2cb135f 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -111,14 +111,6 @@ workflow TUMOR_NORMAL_HAPPHASE { .set{ normal_bams_germlinevcf } // [meta, bam, bai, germline_vcf, [], []] -- svs and mods are empty placeholders for LONGPHASE_PHASE input - CLAIR3.out.vcf - .map { meta, vcf -> - def extra = [] - return [meta, vcf, extra] - } - .set { germline_vep } - // [meta, clair3_vcf, []] -- germline small variants for VEP annotation - // // MODULE: LONGPHASE_PHASE // @@ -132,6 +124,14 @@ workflow TUMOR_NORMAL_HAPPHASE { ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) + LONGPHASE_PHASE.out.snv_vcf + .map { meta, vcf -> + def extra = [] + return [meta, vcf, extra] + } + .set { germline_vep } + // [meta, clair3_vcf, []] -- germline small variants for VEP annotation + // Add phased vcf to normal bams // Add type information back // both are needed for mixing with the tumor bams diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 2b8b3b75..24095c56 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -80,14 +80,6 @@ workflow TUMOR_ONLY_HAPPHASE { .set { somatic_vep } // [meta, somatic_vcf, []] -- PASS (somatic) variants for VEP annotation - VCFSPLIT.out.germline_vcf - .map { meta, vcf -> - def extra = [] - return [meta,vcf, extra] - } - .set { germline_vep } - // [meta, germline_vcf, []] -- non-somatic variants (relabelled PASS) for VEP annotation - // // MODULES: LONGPHASE_PHASE // @@ -100,6 +92,15 @@ workflow TUMOR_ONLY_HAPPHASE { ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) + LONGPHASE_PHASE.out.snv_vcf + .map { meta, vcf -> + def extra = [] + return [meta,vcf, extra] + } + .set { germline_vep } + // [meta, germline_vcf, []] -- non-somatic variants (relabelled PASS) for VEP annotation + + // Add phased nonsomatic vcf info // remove model info tumor_bams diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 60c1cc58..5a17e6e3 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -428,6 +428,8 @@ workflow LRSOMATIC { // [meta, vcf, []] -- somatic variants merged from T/N and tumor-only paths + whatshap_stats_txt = channel.empty() + if (!params.skip_qc && !params.skip_whatshapstats) { // Create channel for whatshap stats @@ -448,6 +450,8 @@ workflow LRSOMATIC { true ) + whatshap_stats_txt = WHATSHAP_STATS.OUT.txt + } if (!params.skip_vep) { @@ -563,8 +567,6 @@ workflow LRSOMATIC { } - - // // Module: MOSDEPTH // @@ -717,6 +719,9 @@ workflow LRSOMATIC { ch_multiqc_files = ch_multiqc_files.mix(ch_nanoplot_pre_txt.collect{it -> it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_nanoplot_post_txt.collect{it -> it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix(whatshap_stats_txt.collect{it -> it[1]}.ifEmpty([])) + + MULTIQC ( ch_multiqc_files .collect() From a5ca08a4e30bb6a0f4a93cc8d4b9d8ed246eeed2 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 13 Mar 2026 17:01:07 +0100 Subject: [PATCH 138/183] bcftools query --- modules.json | 5 + .../nf-core/bcftools/query/environment.yml | 10 ++ modules/nf-core/bcftools/query/main.nf | 46 +++++++++ modules/nf-core/bcftools/query/meta.yml | 89 +++++++++++++++++ .../nf-core/bcftools/query/tests/main.nf.test | 97 +++++++++++++++++++ .../bcftools/query/tests/main.nf.test.snap | 73 ++++++++++++++ .../bcftools/query/tests/nextflow.config | 3 + 7 files changed, 323 insertions(+) create mode 100644 modules/nf-core/bcftools/query/environment.yml create mode 100644 modules/nf-core/bcftools/query/main.nf create mode 100644 modules/nf-core/bcftools/query/meta.yml create mode 100644 modules/nf-core/bcftools/query/tests/main.nf.test create mode 100644 modules/nf-core/bcftools/query/tests/main.nf.test.snap create mode 100644 modules/nf-core/bcftools/query/tests/nextflow.config diff --git a/modules.json b/modules.json index 8c9ad45c..f188df47 100644 --- a/modules.json +++ b/modules.json @@ -36,6 +36,11 @@ "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, + "bcftools/query": { + "branch": "master", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", + "installed_by": ["modules"] + }, "bcftools/sort": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", diff --git a/modules/nf-core/bcftools/query/environment.yml b/modules/nf-core/bcftools/query/environment.yml new file mode 100644 index 00000000..ba863b38 --- /dev/null +++ b/modules/nf-core/bcftools/query/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/query/main.nf b/modules/nf-core/bcftools/query/main.nf new file mode 100644 index 00000000..726360f0 --- /dev/null +++ b/modules/nf-core/bcftools/query/main.nf @@ -0,0 +1,46 @@ +process BCFTOOLS_QUERY { + tag "${meta.id}" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" + + input: + tuple val(meta), path(vcf), path(tbi) + path regions + path targets + path samples + + output: + tuple val(meta), path("*.${suffix}"), emit: output + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + suffix = task.ext.suffix ?: "txt" + def regions_file = regions ? "--regions-file ${regions}" : "" + def targets_file = targets ? "--targets-file ${targets}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" + """ + bcftools query \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + ${args} \\ + ${vcf} \\ + > ${prefix}.${suffix} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + suffix = task.ext.suffix ?: "txt" + """ + touch ${prefix}.${suffix} \\ + """ +} diff --git a/modules/nf-core/bcftools/query/meta.yml b/modules/nf-core/bcftools/query/meta.yml new file mode 100644 index 00000000..6bcb5e57 --- /dev/null +++ b/modules/nf-core/bcftools/query/meta.yml @@ -0,0 +1,89 @@ +name: bcftools_query +description: Extracts fields from VCF or BCF files and outputs them in user-defined + format. +keywords: + - query + - variant calling + - bcftools + - VCF +tools: + - query: + description: | + Extracts fields from VCF or BCF files and outputs them in user-defined format. + 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 ] + - vcf: + type: file + description: | + The vcf file to be queried. + pattern: "*.{vcf.gz, vcf}" + ontologies: [] + - tbi: + type: file + description: | + The tab index for the VCF file to be inspected. + pattern: "*.tbi" + ontologies: [] + - regions: + type: file + description: | + Optionally, restrict the operation to regions listed in this file. + ontologies: [] + - targets: + type: file + description: | + Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) + ontologies: [] + - samples: + type: file + description: | + Optional, file of sample names to be included or excluded. + e.g. 'file.tsv' + ontologies: [] +output: + output: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.${suffix}": + type: file + description: BCFTools query output file + ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +authors: + - "@abhi18av" + - "@drpatelh" +maintainers: + - "@abhi18av" + - "@drpatelh" diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test b/modules/nf-core/bcftools/query/tests/main.nf.test new file mode 100644 index 00000000..63ac5af8 --- /dev/null +++ b/modules/nf-core/bcftools/query/tests/main.nf.test @@ -0,0 +1,97 @@ +nextflow_process { + + name "Test Process BCFTOOLS_QUERY" + script "../main.nf" + process "BCFTOOLS_QUERY" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/query" + + config "./nextflow.config" + + test("sarscov2 - [vcf, tbi], [], [], []") { + + when { + process { + """ + input[0] = [ + [ id:'out' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.output, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi], vcf, tsv, []") { + + when { + process { + """ + input[0] = [ + [ id:'out' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.targets.tsv.gz', checkIfExists: true) + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.output, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - stub") { + + when { + process { + """ + input[0] = [ + [ id:'out' ], // meta map + 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.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.output[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } +} diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test.snap b/modules/nf-core/bcftools/query/tests/main.nf.test.snap new file mode 100644 index 00000000..5168ef3f --- /dev/null +++ b/modules/nf-core/bcftools/query/tests/main.nf.test.snap @@ -0,0 +1,73 @@ +{ + "sarscov2 - [vcf, tbi], vcf, tsv, []": { + "content": [ + [ + [ + { + "id": "out" + }, + "out.txt:md5,75a6bd0084e2e1838cf7baba11b99d19" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:16:54.523612853" + }, + "sarscov2 - [vcf, tbi], [], [], [] - stub": { + "content": [ + "out.txt", + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:17:00.64798632" + }, + "sarscov2 - [vcf, tbi], [], [], []": { + "content": [ + [ + [ + { + "id": "out" + }, + "out.txt:md5,87a2ab194e1ee3219b44e58429ec3307" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:16:47.953130141" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/query/tests/nextflow.config b/modules/nf-core/bcftools/query/tests/nextflow.config new file mode 100644 index 00000000..8547ec10 --- /dev/null +++ b/modules/nf-core/bcftools/query/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = "-f '%CHROM %POS %REF %ALT[%SAMPLE=%GT]'" +} From d1c3d9969f10ca0348453fcba3799eed1f1827f1 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 17:01:33 +0100 Subject: [PATCH 139/183] whatshap stats included --- conf/modules.config | 4 + modules.json | 10 + .../nf-core/whatshap/stats/environment.yml | 7 + modules/nf-core/whatshap/stats/main.nf | 59 ++++ modules/nf-core/whatshap/stats/meta.yml | 109 +++++++ .../nf-core/whatshap/stats/tests/main.nf.test | 105 +++++++ .../whatshap/stats/tests/main.nf.test.snap | 276 ++++++++++++++++++ nextflow.config | 1 + nextflow_schema.json | 3 + workflows/lrsomatic.nf | 13 +- 10 files changed, 579 insertions(+), 8 deletions(-) create mode 100644 modules/nf-core/whatshap/stats/environment.yml create mode 100644 modules/nf-core/whatshap/stats/main.nf create mode 100644 modules/nf-core/whatshap/stats/meta.yml create mode 100644 modules/nf-core/whatshap/stats/tests/main.nf.test create mode 100644 modules/nf-core/whatshap/stats/tests/main.nf.test.snap diff --git a/conf/modules.config b/conf/modules.config index 68e4b06e..6b3afb5d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -97,6 +97,8 @@ process { } withName: '.*:WHATSHAP_STATS' { + ext.prefix = { "${meta.id}_whatshap_stats" } + ext.args = { "--sample ${meta.id}" } publishDir = [ path: { "${params.outdir}/${meta.id}/qc/whatshap_stats" }, mode: params.publish_dir_mode, @@ -271,6 +273,7 @@ process { ] } withName: '.*:CLAIRSTO' { + ext.args = { "--sample_name ${meta.id}" } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clairsto" }, mode: params.publish_dir_mode, @@ -288,6 +291,7 @@ process { } withName: '.*:CLAIR3' { + ext.args = { "--sample_name=${meta.id}" } publishDir = [ path: { "${params.outdir}/${meta.id}/variants/clair3" }, mode: params.publish_dir_mode, diff --git a/modules.json b/modules.json index 8947a202..5d114f9c 100644 --- a/modules.json +++ b/modules.json @@ -90,6 +90,11 @@ "git_sha": "2c73cc8fa92cf48de3da0b643fdf357a8a290b36", "installed_by": ["modules"] }, + "nanoplot": { + "branch": "master", + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c", + "installed_by": ["modules"] + }, "pigz/uncompress": { "branch": "master", "git_sha": "f84336b7fa91a65aa61d215b8c109fbb8e4b4ac6", @@ -146,6 +151,11 @@ "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", "installed_by": ["modules"] + }, + "whatshap/stats": { + "branch": "master", + "git_sha": "bfab71f4d68c1aaff09335a3433e7b2836918b2a", + "installed_by": ["modules"] } } }, diff --git a/modules/nf-core/whatshap/stats/environment.yml b/modules/nf-core/whatshap/stats/environment.yml new file mode 100644 index 00000000..389d6871 --- /dev/null +++ b/modules/nf-core/whatshap/stats/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::whatshap=2.8" diff --git a/modules/nf-core/whatshap/stats/main.nf b/modules/nf-core/whatshap/stats/main.nf new file mode 100644 index 00000000..54abecd0 --- /dev/null +++ b/modules/nf-core/whatshap/stats/main.nf @@ -0,0 +1,59 @@ + +process WHATSHAP_STATS { + tag "$meta.id" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/whatshap:2.8--py39h2de1943_0': + 'biocontainers/whatshap:2.8--py39h2de1943_0' }" + + input: + tuple val(meta), path(vcf) // channel: [ val(meta), path(vcf) ] + val(include_tsv_output) // value: [ true | false ] + val(include_gtf_output) // value: [ true | false ] + val(inlude_block_output) // value: [ true | false ] + + output: + tuple val(meta), path("${prefix}.tsv"), emit: tsv, optional: true + tuple val(meta), path("${prefix}.gtf"), emit: gtf, optional: true + tuple val(meta), path("${prefix}.txt"), emit: block, optional: true + tuple val(meta), path("${prefix}.log"), emit: log + tuple val("${task.process}"), val('whatshap'), eval("whatshap --version"), emit: versions_whatshap, topic: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + + def output_tsv = include_tsv_output ? "--tsv ${prefix}.tsv" : '' + def output_gtf = include_gtf_output ? "--gtf ${prefix}.gtf" : '' + def output_block = inlude_block_output ? "--block-list ${prefix}.txt" : '' + """ + whatshap stats \\ + $args \\ + $output_tsv \\ + $output_gtf \\ + $output_block \\ + $vcf \\ + | tee ${prefix}.log + """ + + stub: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def tsv_touch_cmd = include_tsv_output ? "touch ${prefix}.tsv" : '' + def gtf_touch_cmd = include_gtf_output ? "touch ${prefix}.gtf" : '' + def block_touch_cmd = inlude_block_output ? "touch ${prefix}.txt" : '' + def log_touch_cmd = "touch ${prefix}.log" + """ + echo $args + + $tsv_touch_cmd + $gtf_touch_cmd + $block_touch_cmd + $log_touch_cmd + """ +} diff --git a/modules/nf-core/whatshap/stats/meta.yml b/modules/nf-core/whatshap/stats/meta.yml new file mode 100644 index 00000000..5db5a176 --- /dev/null +++ b/modules/nf-core/whatshap/stats/meta.yml @@ -0,0 +1,109 @@ +name: "whatshap_stats" +description: Compute statistics from phased variant file using Whatshap +keywords: + - vcf + - whatshap + - stats + - phasing + - phase +tools: + - "whatshap": + description: Phase genomic variants using DNA sequencing reads (haplotype + assembly). + args_id: "$args" + homepage: "https://whatshap.readthedocs.io" + documentation: "https://whatshap.readthedocs.io" + tool_dev_url: "https://github.com/whatshap/whatshap" + doi: "10.1101/085050" + licence: ["MIT"] + identifier: biotools:whatshap +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - vcf: + type: file + description: Phased variant vcf file + pattern: "*.vcf" + ontologies: + - edam: "http://edamontology.org/format_3016" # VCF + - include_tsv_output: + type: boolean + description: Whether to include TSV output file + default: false + - include_gtf_output: + type: boolean + description: Whether to include GTF output file + default: false + - inlude_block_output: + type: boolean + description: Whether to include block list output file + default: false +output: + tsv: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - ${prefix}.tsv: + type: file + description: Whatshap stats output in TSV format + pattern: "*.tsv" + gtf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - ${prefix}.gtf: + type: file + description: Whatshap stats output in GTF format + pattern: "*.gtf" + block: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - ${prefix}.txt: + type: file + description: Whatshap stats block list output + pattern: "*.txt" + log: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - ${prefix}.log: + type: file + description: Whatshap stats output in TXT format + pattern: "*.log" + versions_whatshap: + - - ${task.process}: + type: string + description: The name of the process + - whatshap: + type: string + description: The name of the tool + - whatshap --version: + type: string + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - whatshap: + type: string + description: The name of the tool + - whatshap --version: + type: eval + description: The expression to obtain the version of the tool +authors: + - "@eliottBo" +maintainers: + - "@eliottBo" diff --git a/modules/nf-core/whatshap/stats/tests/main.nf.test b/modules/nf-core/whatshap/stats/tests/main.nf.test new file mode 100644 index 00000000..12cc2f57 --- /dev/null +++ b/modules/nf-core/whatshap/stats/tests/main.nf.test @@ -0,0 +1,105 @@ +nextflow_process { + + name "Test Process WHATSHAP_STATS" + script "../main.nf" + process "WHATSHAP_STATS" + + tag "modules" + tag "modules_nfcore" + tag "whatshap" + tag "whatshap/stats" + + test("homo_sapiens - all_output - vcf") { + + when { + process { + """ + + input[0] = [ + [ id:'test_sample' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/1000GP.chr21.vcf.gz', checkIfExists: true), + ] + input[1] = true + input[2] = true + input[3] = true + + """ + } + } + + then { + + assertAll( + { assert process.success }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}, + process.out).match()} + + ) + + } + + } + test("homo_sapiens - tsv_output - vcf") { + + when { + process { + """ + + input[0] = [ + [ id:'test_sample' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/1000GP.chr21.vcf.gz', checkIfExists: true), + ] + input[1] = true + input[2] = false + input[3] = false + + """ + } + } + + then { + + assertAll( + { assert process.success }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}, process.out).match() }, + + ) + + } + + } + + test("homo_sapiens - vcf -stub") { + + options "-stub" + + when { + process { + """ + + input[0] = [ + [ id:'test_sample' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/popgen/1000GP.chr21.vcf.gz', checkIfExists: true), + ] + input[1] = true + input[2] = true + input[3] = true + """ + } + } + + then { + + assertAll( + { assert process.success }, + { assert snapshot( + process.out.findAll { key, val -> key.startsWith("versions")}, + process.out + ).match() }, + ) + + } + + } + +} diff --git a/modules/nf-core/whatshap/stats/tests/main.nf.test.snap b/modules/nf-core/whatshap/stats/tests/main.nf.test.snap new file mode 100644 index 00000000..fea3adca --- /dev/null +++ b/modules/nf-core/whatshap/stats/tests/main.nf.test.snap @@ -0,0 +1,276 @@ +{ + "homo_sapiens - tsv_output - vcf": { + "content": [ + { + "versions_whatshap": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ] + }, + { + "0": [ + [ + { + "id": "test_sample" + }, + "test_sample.tsv:md5,647d19183ff8efb21e48bea633ca375c" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test_sample" + }, + "test_sample.log:md5,5f818f833f6f66d852b638e2327b7671" + ] + ], + "4": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ], + "block": [ + + ], + "gtf": [ + + ], + "log": [ + [ + { + "id": "test_sample" + }, + "test_sample.log:md5,5f818f833f6f66d852b638e2327b7671" + ] + ], + "tsv": [ + [ + { + "id": "test_sample" + }, + "test_sample.tsv:md5,647d19183ff8efb21e48bea633ca375c" + ] + ], + "versions_whatshap": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-09T10:56:19.643449202" + }, + "homo_sapiens - all_output - vcf": { + "content": [ + { + "versions_whatshap": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ] + }, + { + "0": [ + [ + { + "id": "test_sample" + }, + "test_sample.tsv:md5,647d19183ff8efb21e48bea633ca375c" + ] + ], + "1": [ + [ + { + "id": "test_sample" + }, + "test_sample.gtf:md5,4a2b521799cdccfc2a296f49df39e313" + ] + ], + "2": [ + [ + { + "id": "test_sample" + }, + "test_sample.txt:md5,aa64e268909459b49a82ebab3b8bde5f" + ] + ], + "3": [ + [ + { + "id": "test_sample" + }, + "test_sample.log:md5,5f818f833f6f66d852b638e2327b7671" + ] + ], + "4": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ], + "block": [ + [ + { + "id": "test_sample" + }, + "test_sample.txt:md5,aa64e268909459b49a82ebab3b8bde5f" + ] + ], + "gtf": [ + [ + { + "id": "test_sample" + }, + "test_sample.gtf:md5,4a2b521799cdccfc2a296f49df39e313" + ] + ], + "log": [ + [ + { + "id": "test_sample" + }, + "test_sample.log:md5,5f818f833f6f66d852b638e2327b7671" + ] + ], + "tsv": [ + [ + { + "id": "test_sample" + }, + "test_sample.tsv:md5,647d19183ff8efb21e48bea633ca375c" + ] + ], + "versions_whatshap": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-09T10:56:07.409933392" + }, + "homo_sapiens - vcf -stub": { + "content": [ + { + "versions_whatshap": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ] + }, + { + "0": [ + [ + { + "id": "test_sample" + }, + "test_sample.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test_sample" + }, + "test_sample.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test_sample" + }, + "test_sample.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test_sample" + }, + "test_sample.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ], + "block": [ + [ + { + "id": "test_sample" + }, + "test_sample.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gtf": [ + [ + { + "id": "test_sample" + }, + "test_sample.gtf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "log": [ + [ + { + "id": "test_sample" + }, + "test_sample.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tsv": [ + [ + { + "id": "test_sample" + }, + "test_sample.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_whatshap": [ + [ + "WHATSHAP_STATS", + "whatshap", + "2.8" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2025-12-09T10:56:23.489785877" + } +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index c1315f99..bed1fe49 100644 --- a/nextflow.config +++ b/nextflow.config @@ -40,6 +40,7 @@ params { skip_fiber = false skip_m6a = false skip_vep = false + skip_whatshapstats = false // minimap2 options minimap2_ont_model = null diff --git a/nextflow_schema.json b/nextflow_schema.json index b25ea2ee..8ca4e322 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -214,6 +214,9 @@ "skip_nanoplot": { "type": "boolean", "description": "Skip Nanoplot" + }, + "skip_whatshapstats": { + "type": "boolean" } } }, diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 5a17e6e3..e1f62eec 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -32,6 +32,8 @@ include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsr include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' +include { WHATSHAP_STATS } from '../modules/nf-core/whatshap/stats/main' + // // IMPORT SUBWORKFLOWS // @@ -42,9 +44,6 @@ include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_h include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' - - - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -437,8 +436,7 @@ workflow LRSOMATIC { .map { meta, vcf, _extra -> return [meta, vcf] } .set { ch_whatshap_stats } - // - + // // Module: WHATSHAP_STATS // @@ -447,10 +445,10 @@ workflow LRSOMATIC { ch_whatshap_stats, true, true, - true + false ) - whatshap_stats_txt = WHATSHAP_STATS.OUT.txt + whatshap_stats_txt = WHATSHAP_STATS.out.tsv } @@ -721,7 +719,6 @@ workflow LRSOMATIC { ch_multiqc_files = ch_multiqc_files.mix(whatshap_stats_txt.collect{it -> it[1]}.ifEmpty([])) - MULTIQC ( ch_multiqc_files .collect() From fe96b24d58bd742b02af22928e1d2c423cf292a7 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 17:06:16 +0100 Subject: [PATCH 140/183] fixed somatic to germline phased variants --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 6b3afb5d..97493a5e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -219,7 +219,7 @@ process { // withName: '.*:LONGPHASE_PHASE' { - ext.prefix = { "somatic_smallvariants" } + ext.prefix = { "germline_smallvariants" } ext.args = { [ meta.platform == 'pb' ? '--pb' : '--ont', From 83cd397fc795ea0d8ec418f8854b5ba63169e338 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 17:09:25 +0100 Subject: [PATCH 141/183] update snapshot --- tests/default.nf.test.snap | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index bd36bc15..693e0833 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -84,6 +84,9 @@ "WGET": { "wget": "1.21.4" }, + "WHATSHAP_STATS": { + "whatshap": 2.8 + }, "Workflow": { "IntGenomicsLab/lrsomatic": "v1.1.0dev" } @@ -107,6 +110,8 @@ "multiqc/multiqc_data/multiqc_samtools_stats.txt", "multiqc/multiqc_data/multiqc_software_versions.txt", "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_whatshap_phased_bp_plot.txt", + "multiqc/multiqc_data/multiqc_whatshap_stats.txt", "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", "multiqc/multiqc_data/samtools-flagstat-table.txt", "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", @@ -114,11 +119,13 @@ "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", "multiqc/multiqc_data/samtools-stats-dp.txt", "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/whatshap-stats-table.txt", "multiqc/multiqc_plots", "multiqc/multiqc_plots/pdf", "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/multiqc_whatshap_phased_bp_plot.pdf", "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", @@ -130,10 +137,12 @@ "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/whatshap-stats-table.pdf", "multiqc/multiqc_plots/png", "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/multiqc_whatshap_phased_bp_plot.png", "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", "multiqc/multiqc_plots/png/samtools-flagstat-table.png", "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", @@ -145,10 +154,12 @@ "multiqc/multiqc_plots/png/samtools-stats-dp.png", "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", + "multiqc/multiqc_plots/png/whatshap-stats-table.png", "multiqc/multiqc_plots/svg", "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/multiqc_whatshap_phased_bp_plot.svg", "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", @@ -160,6 +171,7 @@ "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", + "multiqc/multiqc_plots/svg/whatshap-stats-table.svg", "multiqc/multiqc_report.html", "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", @@ -232,6 +244,10 @@ "sample1/qc/tumor/samtools/sample1.flagstat", "sample1/qc/tumor/samtools/sample1.idxstats", "sample1/qc/tumor/samtools/sample1.stats", + "sample1/qc/whatshap_stats", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.gtf", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.log", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.tsv", "sample1/variants", "sample1/variants/clair3", "sample1/variants/clair3/merge_output.vcf.gz", @@ -335,6 +351,10 @@ "sample2/qc/tumor/samtools/sample2.flagstat", "sample2/qc/tumor/samtools/sample2.idxstats", "sample2/qc/tumor/samtools/sample2.stats", + "sample2/qc/whatshap_stats", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.gtf", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.log", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.tsv", "sample2/variants", "sample2/variants/clair3", "sample2/variants/clair3/merge_output.vcf.gz", @@ -405,6 +425,10 @@ "sample3/qc/tumor/samtools/sample3.flagstat", "sample3/qc/tumor/samtools/sample3.idxstats", "sample3/qc/tumor/samtools/sample3.stats", + "sample3/qc/whatshap_stats", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.gtf", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.log", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.tsv", "sample3/variants", "sample3/variants/clairsto", "sample3/variants/clairsto/germline.vcf.gz", @@ -452,6 +476,9 @@ "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", + "sample1_whatshap_stats.gtf:md5,eff050a68e36e778b06e0ec19435c569", + "sample1_whatshap_stats.log:md5,98753a74dd5f4dddf406023976608df8", + "sample1_whatshap_stats.tsv:md5,7d1e98f804b9e10408e7ee8256520b10", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", @@ -464,6 +491,9 @@ "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", + "sample2_whatshap_stats.gtf:md5,4d8f4393e3aebe4e945c0b8236cf3b3e", + "sample2_whatshap_stats.log:md5,aa6f7975b4cc0e0a33fe58b85e8147d8", + "sample2_whatshap_stats.tsv:md5,fda2deb44d3f065be0ecf32cfcb8cbee", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", @@ -471,11 +501,14 @@ "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", + "sample3_whatshap_stats.gtf:md5,46a97067376b06b476d180709bc9e3d8", + "sample3_whatshap_stats.log:md5,0e6cbfcaaf683824c6bcfe171d0cc2c5", + "sample3_whatshap_stats.tsv:md5,71ea264c2b2a676c544693a4d673dad7", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], - "timestamp": "2026-03-13T14:26:30.747596368", + "timestamp": "2026-03-13T17:09:00.707752563", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.0" From 20437ffaddc10daccd1b3a41e52697a7bcfdcdec Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 13 Mar 2026 17:11:06 +0100 Subject: [PATCH 142/183] preliminary small variant consensus calling stuff --- conf/modules.config | 33 +++++++++++ modules/nf-core/bcftools/isec/main.nf | 2 + subworkflows/local/small_variant_consensus.nf | 58 ++++++++++++++++++- 3 files changed, 92 insertions(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 697c1c2c..dae36220 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -87,6 +87,39 @@ process { ] } + withName: '.*:BCFTOOLS_NORM' { + publishDir = [ + enabled: false + ] + } + + withName: '.*:BCFTOOLS_ISEC' { + ext.args{ + "-n=2 -c all -w1 -Oz" + } + publishDir = [ + enabled: false + ] + } + withName: '.*:BCFTOOLS_ANNOTATE' { + ext.args{ + "-h <(echo '##INFO=') \\ + -c CHROM,POS,REF,ALT,INFO/CALLER \\ + -Oz" + } + publishDir = [ + enabled: false + ] + } + withName: '.*:BCFTOOLS_QUERY' { + ext.args{ + "-f '%CHROM\t%POS\t%REF\t%ALT\t${meta.variant_caller}\n'" + } + publishDir = [ + enabled: false + ] + } + withName: '.*DEEPVARIANT_MAKEEXAMPLES' { ext.args = { meta.platform == 'pb' diff --git a/modules/nf-core/bcftools/isec/main.nf b/modules/nf-core/bcftools/isec/main.nf index f39c7101..afa71069 100644 --- a/modules/nf-core/bcftools/isec/main.nf +++ b/modules/nf-core/bcftools/isec/main.nf @@ -12,6 +12,7 @@ process BCFTOOLS_ISEC { output: tuple val(meta), path("${prefix}", type: "dir"), emit: results + tuple val(meta), path("${prefix}_consensus.vcf.gz"), emit: consensus tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: @@ -27,6 +28,7 @@ process BCFTOOLS_ISEC { """ bcftools isec \\ ${args} \\ + -o ${$prefix}_consensus.vcf.gz ${targets_file_args} \\ ${regions_file_args} \\ -p ${prefix} \\ diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 5afdd3ca..6bb840c6 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -1,6 +1,62 @@ +include { BCFTOOLS_NORM } from '../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_ISEC } from '../../modules/nf-core/bcftools/isec/main' +include { BCFTOOLS_MERGE } from '../../modules/nf-core/bcftools/merge/main' +include { BCFTOOLS_QUERY } from '../../modules/nf-core/bcftools/merge/main' + + workflow SMALL_VARIANT_CONSENSUS.nf{ take: - ch_vcf + ch_vcf // [meta, vcfs, tbis] + fasta + fai + var_keep_method + main: + + if (var_keep_method == 'consensus') { + BCFTOOLS_NORM(ch_vcf, fasta) + BCFTOOLS_NORM.out.vcf + .join(BCFTOOLS_NORM.tbi) + .map{ meta, vcf, tbi -> + def file = [] + def target = [] + def regions = [] + return [meta, vcf, tbi,file,target,regions] + } + .set{isec_input} + BCFTOOLS_ISEC(isec_input) + } + else if (var_keep_method == 'all'){ + BCFTOOLS_NORM(ch_vcf,fasta) + BCFTOOLS_NORM.out.vcf + .join(BCFTOOLS_NORM.tbi) + .set { vcf_tbi} + BCFTOOLS_QUERY(vcf_tbi, [], [], []) + vcf_tbi + .join(BCFTOOLS_QUERY.out.output) + .map{ meta, vcf, tbi, annotations -> + def annotations_index = [] + def columns = [] + def header_lines = [] + def rename_chrs = [] + return [ meta, vcf, tbi,file,annotations,annotations_index, columns, header_lines, rename_chrs ] + } + .set{annotate_input} + + BCFTOOLS_ANNOTATE(ch_vcf) + + BCFTOOLS_ANNOTATE.out.vcf + .join(BCFTOOLS_ANNOTATE.out.tbi) + .map{ meta, vcf, tbi -> + def bed = [] + return [ bed ] + } + .set{ merge input} + fasta + .join(fai) + .set{ fasta_fai } + BCFTOOLS_MERGE(merge_input, fasta_fai) + } + } \ No newline at end of file From 4da23251410860467ed0c3db4c87b1489cf4be7b Mon Sep 17 00:00:00 2001 From: Luuk Harbers <40829819+ljwharbers@users.noreply.github.com> Date: Fri, 13 Mar 2026 18:06:04 +0100 Subject: [PATCH 143/183] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- nextflow_schema.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 8ca4e322..b68ffd1f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -216,7 +216,8 @@ "description": "Skip Nanoplot" }, "skip_whatshapstats": { - "type": "boolean" + "type": "boolean", + "description": "Skip WhatsHap stats" } } }, From ecf28089c2a4e8cbb2942b4d691b5b8b3dea296c Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 18:06:36 +0100 Subject: [PATCH 144/183] update snaps --- tests/default.nf.test.snap | 44 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 693e0833..8a214ec5 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -258,8 +258,8 @@ "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", "sample1/variants/phased", - "sample1/variants/phased/somatic_smallvariants.vcf.gz", - "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/germline_smallvariants.vcf.gz", + "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/severus_all.vcf.gz", @@ -365,8 +365,8 @@ "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", "sample2/variants/phased", - "sample2/variants/phased/somatic_smallvariants.vcf.gz", - "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/germline_smallvariants.vcf.gz", + "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/severus_all.vcf.gz", @@ -440,8 +440,8 @@ "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", "sample3/variants/phased", - "sample3/variants/phased/somatic_smallvariants.vcf.gz", - "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/germline_smallvariants.vcf.gz", + "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", "sample3/variants/severus", "sample3/variants/severus/all_SVs", "sample3/variants/severus/all_SVs/severus_all.vcf.gz", @@ -466,10 +466,10 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,58854f8d427538288322ac20df574fe1", - "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", - "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", - "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", + "sample1_normal.bam:md5,c4eda86b77d9280bbcb922ab944ce68b", + "sample1_normal.bam.bai:md5,0d0e6451f37ddd209bc8804c50e29e85", + "sample1_tumor.bam:md5,57ad020a25e02fe94e9d6199c396aaf1", + "sample1_tumor.bam.bai:md5,28ffee78ed0ed13e0749e8d08bbb52c6", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", @@ -477,13 +477,13 @@ "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", "sample1_whatshap_stats.gtf:md5,eff050a68e36e778b06e0ec19435c569", - "sample1_whatshap_stats.log:md5,98753a74dd5f4dddf406023976608df8", - "sample1_whatshap_stats.tsv:md5,7d1e98f804b9e10408e7ee8256520b10", + "sample1_whatshap_stats.log:md5,76b73731f74fe32ef2d11f6bb0a0f71a", + "sample1_whatshap_stats.tsv:md5,f566ae25b3c5a8f7e94b3d6c1b0417f8", "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", - "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", - "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", - "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", + "sample2_normal.bam:md5,32cb1237503f716d788c8d49106d57cc", + "sample2_normal.bam.bai:md5,bda7beaa98b119d07bb61da781af2033", + "sample2_tumor.bam:md5,b9ec59ff00a6c561a614eeb7553c352c", "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", @@ -492,23 +492,23 @@ "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", "sample2_whatshap_stats.gtf:md5,4d8f4393e3aebe4e945c0b8236cf3b3e", - "sample2_whatshap_stats.log:md5,aa6f7975b4cc0e0a33fe58b85e8147d8", - "sample2_whatshap_stats.tsv:md5,fda2deb44d3f065be0ecf32cfcb8cbee", + "sample2_whatshap_stats.log:md5,10bba7bae6dd99b989ece5e5dac7a8f9", + "sample2_whatshap_stats.tsv:md5,bb46226e486af9026ab76e014624e903", "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", - "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", - "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", + "sample3_tumor.bam:md5,72e067ec99d694f5e1549edca7196054", + "sample3_tumor.bam.bai:md5,4c7386eb59528e81bd48e6a77952f1c3", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", "sample3_whatshap_stats.gtf:md5,46a97067376b06b476d180709bc9e3d8", - "sample3_whatshap_stats.log:md5,0e6cbfcaaf683824c6bcfe171d0cc2c5", - "sample3_whatshap_stats.tsv:md5,71ea264c2b2a676c544693a4d673dad7", + "sample3_whatshap_stats.log:md5,376254ec9c98f9ba204895e7085516ed", + "sample3_whatshap_stats.tsv:md5,f7cc79156f23e884ead18e50b8434dbf", "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], - "timestamp": "2026-03-13T17:09:00.707752563", + "timestamp": "2026-03-13T17:15:05.714239372", "meta": { "nf-test": "0.9.4", "nextflow": "25.10.0" From 65edddc5fb998d858b1e64aa3934a923ae700e83 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Fri, 13 Mar 2026 18:08:13 +0100 Subject: [PATCH 145/183] linting --- workflows/lrsomatic.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index e1f62eec..e34b6363 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -32,7 +32,7 @@ include { FIBERTOOLSRS_QC } from '../modules/local/fibertoolsr include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' -include { WHATSHAP_STATS } from '../modules/nf-core/whatshap/stats/main' +include { WHATSHAP_STATS } from '../modules/nf-core/whatshap/stats/main' // // IMPORT SUBWORKFLOWS @@ -430,13 +430,13 @@ workflow LRSOMATIC { whatshap_stats_txt = channel.empty() if (!params.skip_qc && !params.skip_whatshapstats) { - + // Create channel for whatshap stats germline_vep - .map { meta, vcf, _extra -> + .map { meta, vcf, _extra -> return [meta, vcf] } .set { ch_whatshap_stats } - + // // Module: WHATSHAP_STATS // From 0ac7404cbc69bf4b5ed069413030868de4965b60 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 16 Mar 2026 10:47:35 +0100 Subject: [PATCH 146/183] fix channel structure --- conf/modules.config | 2 +- subworkflows/local/small_variant_consensus.nf | 64 +++++++++++++------ subworkflows/local/tumor_normal_happhase.nf | 27 ++++++++ 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index dae36220..d742bb3d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -113,7 +113,7 @@ process { } withName: '.*:BCFTOOLS_QUERY' { ext.args{ - "-f '%CHROM\t%POS\t%REF\t%ALT\t${meta.variant_caller}\n'" + "-f '%CHROM\t%POS\t%REF\t%ALT\t${meta.caller}\n'" } publishDir = [ enabled: false diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 6bb840c6..8be88766 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -7,44 +7,68 @@ include { BCFTOOLS_QUERY } from '../../modules/nf-core/bcftools/merge/mai workflow SMALL_VARIANT_CONSENSUS.nf{ take: - ch_vcf // [meta, vcfs, tbis] + mixed_vcfs // [meta: w caller_info,mixed_vcfs, mixed_indicies] fasta fai var_keep_method main: + //normalize VCFs + BCFTOOLS_NORM(mixed_vcfs, fasta) + BCFTOOLS_NORM.out.vcf + .join(BCFTOOLS_NORM.tbi) + .set {normalized_vcfs} + + // create annotation file with caller name + BCFTOOLS_QUERY(normalized_vcfs, [], [], []) + + normalized_vcfs + .join(BCFTOOLS_QUERY.out.output) + .map{ meta, vcf, tbi, annotations -> + def annotations_index = [] + def columns = [] + def header_lines = [] + def rename_chrs = [] + return [ meta, vcf, tbi,file,annotations,annotations_index, columns, header_lines, rename_chrs ] + } + .set{annotate_input} + + // Annotate vcfs with caller id + BCFTOOLS_ANNOTATE(annotate_input) + + BCFTOOLS_ANNOTATE.out.vcf + .join(BCFTOOLS_ANNOTATE.tbi) + .set{annotated_vcfs} + + annotated_vcfs + .branch { meta, _vcfs, _tbi -> + deepvariant: meta.caller in [ 'deepvariant', 'deepsomatic' ] + clair: meta.caller in ['clair3','clairs-to','clairs'] + } + .set{annotated_vcfs_branched} + + clair_ch = annotated_vcfs_branched.clair + deepvariant = annotated_vcfs_branched.deepvariant + + clair_ch. + map {meta, vcfs, tbi -> + meta + } if (var_keep_method == 'consensus') { - BCFTOOLS_NORM(ch_vcf, fasta) + BCFTOOLS_NORM.out.vcf .join(BCFTOOLS_NORM.tbi) .map{ meta, vcf, tbi -> def file = [] def target = [] def regions = [] - return [meta, vcf, tbi,file,target,regions] + return [meta, vcf, tbi, file, target, regions] } .set{isec_input} BCFTOOLS_ISEC(isec_input) } else if (var_keep_method == 'all'){ - BCFTOOLS_NORM(ch_vcf,fasta) - BCFTOOLS_NORM.out.vcf - .join(BCFTOOLS_NORM.tbi) - .set { vcf_tbi} - BCFTOOLS_QUERY(vcf_tbi, [], [], []) - vcf_tbi - .join(BCFTOOLS_QUERY.out.output) - .map{ meta, vcf, tbi, annotations -> - def annotations_index = [] - def columns = [] - def header_lines = [] - def rename_chrs = [] - return [ meta, vcf, tbi,file,annotations,annotations_index, columns, header_lines, rename_chrs ] - } - .set{annotate_input} - - BCFTOOLS_ANNOTATE(ch_vcf) BCFTOOLS_ANNOTATE.out.vcf .join(BCFTOOLS_ANNOTATE.out.tbi) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 9a0698ee..bedc7542 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -7,6 +7,7 @@ include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/conca include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort' include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' +include { SMALL_VARIANT_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' workflow TUMOR_NORMAL_HAPPHASE { @@ -124,6 +125,32 @@ workflow TUMOR_NORMAL_HAPPHASE { [[:],[]] ) + DEEPVARIANT.out.vcf + .join(DEEPVARIANT.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepvariant'] + return [new_meta, vcf, tbi] + } + .set{deepvariant_ch} + + CLAIR3.out.vcf + .join(CLAIR3.out.tbi) + .map { meta, vcf , tbi -> + def new_meta = meta + [caller:'clair'] + } + .set{clair3_ch} + // [meta,deepvar_vcf,deepvar_index,clair3_vcf,clair3_index] + clair3_ch + .mix(deepvariant_ch) + .set{mixed_vcfs} + SMALL_VARIANT_CONSENSUS( + mixed_vcfs, + fasta, + fai + params.germline_var_keep + ) + + // Add germline vcf to normal bams // remove clair3 model information From c3635d8e4e6846d57214a7cfffebeb235fc0550f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 16 Mar 2026 14:37:12 +0100 Subject: [PATCH 147/183] preliminary germline merging channel structure --- conf/modules.config | 22 +++-- modules/nf-core/bcftools/isec/main.nf | 8 +- modules/nf-core/bcftools/query/main.nf | 5 +- nextflow.config | 3 + subworkflows/local/small_variant_consensus.nf | 94 ++++++++++++++----- subworkflows/local/tumor_normal_happhase.nf | 16 +++- subworkflows/local/tumor_only_happhase.nf | 29 +++++- 7 files changed, 136 insertions(+), 41 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index f3fccc13..1f2ddd84 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -21,7 +21,6 @@ process { // // QC Processes - // withName: '.*:MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } @@ -107,31 +106,38 @@ process { } withName: '.*:BCFTOOLS_NORM' { + ext.prefix = { "${meta.id}.${meta.caller}_norm" } + ext.args = { + "-Oz -W=tbi" + } publishDir = [ enabled: false ] } withName: '.*:BCFTOOLS_ISEC' { - ext.args{ - "-n=2 -c all -w1 -Oz" + ext.prefix = { "${meta.id}_isec" } + ext.args ={ + "-n=2 -c all -Oz" } publishDir = [ enabled: false ] } withName: '.*:BCFTOOLS_ANNOTATE' { - ext.args{ - "-h <(echo '##INFO=') \\ - -c CHROM,POS,REF,ALT,INFO/CALLER \\ - -Oz" + ext.prefix = { "${meta.id}.${meta.caller}" } + ext.args = { + '''-h <(echo '##INFO=') \ + -c CHROM,POS,REF,ALT,INFO/CALLER \ + -Oz \ + -W=tbi''' } publishDir = [ enabled: false ] } withName: '.*:BCFTOOLS_QUERY' { - ext.args{ + ext.args = { "-f '%CHROM\t%POS\t%REF\t%ALT\t${meta.caller}\n'" } publishDir = [ diff --git a/modules/nf-core/bcftools/isec/main.nf b/modules/nf-core/bcftools/isec/main.nf index afa71069..1536c523 100644 --- a/modules/nf-core/bcftools/isec/main.nf +++ b/modules/nf-core/bcftools/isec/main.nf @@ -12,7 +12,10 @@ process BCFTOOLS_ISEC { output: tuple val(meta), path("${prefix}", type: "dir"), emit: results - tuple val(meta), path("${prefix}_consensus.vcf.gz"), emit: consensus + tuple val(meta), path("${prefix}/0000.vcf.gz"), emit: deepvar_style_consensus_vcf + tuple val(meta), path("${prefix}/0000.vcf.gz.tbi"), emit: deepvar_style_consensus_tbi + tuple val(meta), path("${prefix}/0001.vcf.gz"), emit: clair3_style_consensus_vcf + tuple val(meta), path("${prefix}/0001.vcf.gz.tbi"), emit: clair3_style_consensus_tbi tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: @@ -28,11 +31,10 @@ process BCFTOOLS_ISEC { """ bcftools isec \\ ${args} \\ - -o ${$prefix}_consensus.vcf.gz ${targets_file_args} \\ ${regions_file_args} \\ -p ${prefix} \\ - ${vcf_files} \\ + ${vcf_files} """ stub: diff --git a/modules/nf-core/bcftools/query/main.nf b/modules/nf-core/bcftools/query/main.nf index 726360f0..996214f1 100644 --- a/modules/nf-core/bcftools/query/main.nf +++ b/modules/nf-core/bcftools/query/main.nf @@ -14,7 +14,8 @@ process BCFTOOLS_QUERY { path samples output: - tuple val(meta), path("*.${suffix}"), emit: output + tuple val(meta), path("*.${suffix}.gz"), emit: output + tuple val(meta), path("*.${suffix}.gz.tbi"), emit: index tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: @@ -35,6 +36,8 @@ process BCFTOOLS_QUERY { ${args} \\ ${vcf} \\ > ${prefix}.${suffix} + bgzip -c ${prefix}.${suffix} > ${prefix}.${suffix}.gz + tabix -s 1 -b 2 -e 2 ${prefix}.${suffix}.gz """ stub: diff --git a/nextflow.config b/nextflow.config index c1315f99..68c9fd9b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,6 +13,9 @@ params { // Input options input = null + germline_var_keep = 'all' + + // References genome = null igenomes_base = 's3://ngi-igenomes/igenomes/' diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 8be88766..6ad1d12c 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -1,11 +1,13 @@ -include { BCFTOOLS_NORM } from '../../modules/nf-core/bcftools/norm/main' -include { BCFTOOLS_ISEC } from '../../modules/nf-core/bcftools/isec/main' -include { BCFTOOLS_MERGE } from '../../modules/nf-core/bcftools/merge/main' -include { BCFTOOLS_QUERY } from '../../modules/nf-core/bcftools/merge/main' +include { BCFTOOLS_NORM } from '../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_ISEC } from '../../modules/nf-core/bcftools/isec/main' +include { BCFTOOLS_MERGE } from '../../modules/nf-core/bcftools/merge/main' +include { BCFTOOLS_QUERY } from '../../modules/nf-core/bcftools/query/main' +include { BCFTOOLS_ANNOTATE } from '../../modules/nf-core/bcftools/annotate/main' -workflow SMALL_VARIANT_CONSENSUS.nf{ + +workflow SMALL_VARIANT_CONSENSUS { take: mixed_vcfs // [meta: w caller_info,mixed_vcfs, mixed_indicies] fasta @@ -17,7 +19,7 @@ workflow SMALL_VARIANT_CONSENSUS.nf{ BCFTOOLS_NORM(mixed_vcfs, fasta) BCFTOOLS_NORM.out.vcf - .join(BCFTOOLS_NORM.tbi) + .join(BCFTOOLS_NORM.out.tbi) .set {normalized_vcfs} // create annotation file with caller name @@ -25,12 +27,12 @@ workflow SMALL_VARIANT_CONSENSUS.nf{ normalized_vcfs .join(BCFTOOLS_QUERY.out.output) - .map{ meta, vcf, tbi, annotations -> - def annotations_index = [] + .join(BCFTOOLS_QUERY.out.index) + .map{ meta, vcf, tbi, annotations, annotations_index -> def columns = [] def header_lines = [] def rename_chrs = [] - return [ meta, vcf, tbi,file,annotations,annotations_index, columns, header_lines, rename_chrs ] + return [ meta, vcf, tbi, annotations, annotations_index, columns, header_lines, rename_chrs ] } .set{annotate_input} @@ -38,7 +40,7 @@ workflow SMALL_VARIANT_CONSENSUS.nf{ BCFTOOLS_ANNOTATE(annotate_input) BCFTOOLS_ANNOTATE.out.vcf - .join(BCFTOOLS_ANNOTATE.tbi) + .join(BCFTOOLS_ANNOTATE.out.tbi) .set{annotated_vcfs} annotated_vcfs @@ -49,38 +51,84 @@ workflow SMALL_VARIANT_CONSENSUS.nf{ .set{annotated_vcfs_branched} clair_ch = annotated_vcfs_branched.clair - deepvariant = annotated_vcfs_branched.deepvariant + deepvariant_ch = annotated_vcfs_branched.deepvariant clair_ch. map {meta, vcfs, tbi -> - meta + def new_meta = meta.subMap('id', + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [ new_meta, vcfs, tbi] } - if (var_keep_method == 'consensus') { + .set{clair_ch} - BCFTOOLS_NORM.out.vcf - .join(BCFTOOLS_NORM.tbi) - .map{ meta, vcf, tbi -> + deepvariant_ch + .map {meta, vcfs, tbi -> + def new_meta = meta.subMap('id', + 'paired_data', + 'type', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [ new_meta, vcfs, tbi] + } + .set{deepvariant_ch} + + deepvariant_ch + .join(clair_ch) + .map { meta, deepvar_vcf, deepvar_tbi, clair_vcf, clair_tbi -> + def vcfs = [deepvar_vcf, clair_vcf] + def tbis = [deepvar_tbi, clair_tbi] + return [ meta, vcfs, tbis] + } + .set{mixed_vcfs} + + if (var_keep_method == 'consensus') { + mixed_vcfs + .map{ meta, vcfs, tbis -> def file = [] def target = [] def regions = [] - return [meta, vcf, tbi, file, target, regions] + return [meta, vcfs, tbis, file, target, regions] } .set{isec_input} BCFTOOLS_ISEC(isec_input) + BCFTOOLS_ISEC.out.deepvar_style_consensus_vcf + .set{vcf} + BCFTOOLS_ISEC.out.deepvar_style_consensus_tbi + .set{tbi} } + else if (var_keep_method == 'all'){ - - BCFTOOLS_ANNOTATE.out.vcf - .join(BCFTOOLS_ANNOTATE.out.tbi) - .map{ meta, vcf, tbi -> + mixed_vcfs + .map{ meta, vcfs, tbis -> def bed = [] - return [ bed ] + return [ meta, vcfs, tbis, bed ] } - .set{ merge input} + .set{ merge_input} fasta .join(fai) .set{ fasta_fai } BCFTOOLS_MERGE(merge_input, fasta_fai) + BCFTOOLS_MERGE.out.vcf + .set{vcf} + BCFTOOLS_MERGE.out.index + .set{tbi} } + emit: + vcf + tbi + } \ No newline at end of file diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index a8aeffad..159dd906 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -128,26 +128,30 @@ workflow TUMOR_NORMAL_HAPPHASE { CLAIR3.out.vcf .join(CLAIR3.out.tbi) .map { meta, vcf , tbi -> - def new_meta = meta + [caller:'clair'] + def new_meta = meta + [caller:'clair3'] + return [new_meta, vcf, tbi] } .set{clair3_ch} // [meta,deepvar_vcf,deepvar_index,clair3_vcf,clair3_index] + clair3_ch .mix(deepvariant_ch) .set{mixed_vcfs} + SMALL_VARIANT_CONSENSUS( mixed_vcfs, fasta, - fai + fai, params.germline_var_keep ) // Add germline vcf to normal bams // remove clair3 model information - + SMALL_VARIANT_CONSENSUS.out.vcf.view() + normal_bams.view() normal_bams - .join(CLAIR3.out.vcf) + .join(SMALL_VARIANT_CONSENSUS.out.vcf) .map { meta, bam, bai, _clair3_model, _platform, vcf -> def svs = [] def mods = [] @@ -156,7 +160,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .set{ normal_bams_germlinevcf } // [meta, bam, bai, germline_vcf, [], []] -- svs and mods are empty placeholders for LONGPHASE_PHASE input - CLAIR3.out.vcf + SMALL_VARIANT_CONSENSUS.out.vcf .map { meta, vcf -> def extra = [] return [meta, vcf, extra] @@ -282,6 +286,8 @@ workflow TUMOR_NORMAL_HAPPHASE { } .set{ deepsomatic_input } + + DEEPSOMATIC ( deepsomatic_input, [[:],[]], diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 7759d3d0..48b25fed 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -5,6 +5,7 @@ include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/hapl include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' +include { SMALL_VARIANT_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' workflow TUMOR_ONLY_HAPPHASE { @@ -94,10 +95,36 @@ workflow TUMOR_ONLY_HAPPHASE { clairsto_vcf ) + VCFSPLIT.out.germline_vcf + .join(VCFSPLIT.out.germline_tbi) + .map { meta, vcf, tbi -> + def new_meta = meta + [caller:'clairs-to'] + return [ new_meta, vcf, tbi] + } + .set{clairsto_germline_ch} + + DEEPVARIANT.out.vcf + .join(DEEPVARIANT.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepvariant'] + return [new_meta, vcf, tbi] + } + .set{deepvariant_ch} + + clairsto_germline_ch + .mix(deepvariant_ch) + .set{mixed_vcfs} + + SMALL_VARIANT_CONSENSUS( + mixed_vcfs, + fasta, + fai, + params.germline_var_keep + ) // Add the nonsomatic vcf info // remove model info tumor_bams - .join(VCFSPLIT.out.germline_vcf) + .join(SMALL_VARIANT_CONSENSUS.out.vcf) .map{ meta, bam, bai, _model, snps -> def svs = [] def mods = [] From 713b11a977903d37055a48bc67f7dc2964e3613b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 16 Mar 2026 16:08:38 +0100 Subject: [PATCH 148/183] fix bcftool merge input to stop value channel conversion --- modules/nf-core/bcftools/merge/main.nf | 3 ++- subworkflows/local/small_variant_consensus.nf | 12 +++++------- subworkflows/local/tumor_normal_happhase.nf | 17 +++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf index f1acbd3d..f295c0e6 100644 --- a/modules/nf-core/bcftools/merge/main.nf +++ b/modules/nf-core/bcftools/merge/main.nf @@ -9,7 +9,8 @@ process BCFTOOLS_MERGE { input: tuple val(meta), path(vcfs), path(tbis), path(bed) - tuple val(meta2), path(fasta), path(fai) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) output: tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 6ad1d12c..92399dcd 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -42,7 +42,6 @@ workflow SMALL_VARIANT_CONSENSUS { BCFTOOLS_ANNOTATE.out.vcf .join(BCFTOOLS_ANNOTATE.out.tbi) .set{annotated_vcfs} - annotated_vcfs .branch { meta, _vcfs, _tbi -> deepvariant: meta.caller in [ 'deepvariant', 'deepsomatic' ] @@ -84,7 +83,8 @@ workflow SMALL_VARIANT_CONSENSUS { return [ new_meta, vcfs, tbi] } .set{deepvariant_ch} - + deepvariant_ch.view() + clair_ch.view() deepvariant_ch .join(clair_ch) .map { meta, deepvar_vcf, deepvar_tbi, clair_vcf, clair_tbi -> @@ -93,7 +93,8 @@ workflow SMALL_VARIANT_CONSENSUS { return [ meta, vcfs, tbis] } .set{mixed_vcfs} - + + mixed_vcfs.view() if (var_keep_method == 'consensus') { mixed_vcfs .map{ meta, vcfs, tbis -> @@ -117,10 +118,7 @@ workflow SMALL_VARIANT_CONSENSUS { return [ meta, vcfs, tbis, bed ] } .set{ merge_input} - fasta - .join(fai) - .set{ fasta_fai } - BCFTOOLS_MERGE(merge_input, fasta_fai) + BCFTOOLS_MERGE(merge_input, fasta, fai ) BCFTOOLS_MERGE.out.vcf .set{vcf} BCFTOOLS_MERGE.out.index diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 159dd906..209a9995 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -5,9 +5,12 @@ include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index include { CLAIRS } from '../../modules/local/clairs/main.nf' include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat' include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort' -include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' -include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' -include { SMALL_VARIANT_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' + +include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' +include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' +include { SMALL_VARIANT_CONSENSUS as GERMLINE_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' +include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' + workflow TUMOR_NORMAL_HAPPHASE { @@ -138,7 +141,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .mix(deepvariant_ch) .set{mixed_vcfs} - SMALL_VARIANT_CONSENSUS( + GERMLINE_CONSENSUS( mixed_vcfs, fasta, fai, @@ -148,10 +151,8 @@ workflow TUMOR_NORMAL_HAPPHASE { // Add germline vcf to normal bams // remove clair3 model information - SMALL_VARIANT_CONSENSUS.out.vcf.view() - normal_bams.view() normal_bams - .join(SMALL_VARIANT_CONSENSUS.out.vcf) + .join(GERMLINE_CONSENSUS.out.vcf) .map { meta, bam, bai, _clair3_model, _platform, vcf -> def svs = [] def mods = [] @@ -160,7 +161,7 @@ workflow TUMOR_NORMAL_HAPPHASE { .set{ normal_bams_germlinevcf } // [meta, bam, bai, germline_vcf, [], []] -- svs and mods are empty placeholders for LONGPHASE_PHASE input - SMALL_VARIANT_CONSENSUS.out.vcf + GERMLINE_CONSENSUS.out.vcf .map { meta, vcf -> def extra = [] return [meta, vcf, extra] From 57472838aaec47f5f0736fd8a70f6005d5f49c28 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 17 Mar 2026 11:34:45 +0100 Subject: [PATCH 149/183] channel revision --- conf/modules.config | 6 +- modules/local/clair3/main.nf | 15 ++-- modules/local/clairs/main.nf | 2 + modules/local/clairsto/main.nf | 2 + modules/nf-core/bcftools/isec/main.nf | 13 +++- .../nf-core/deepvariant/makeexamples/main.nf | 1 + .../deepvariant/postprocessvariants/main.nf | 1 + nextflow.config | 3 +- subworkflows/local/small_variant_consensus.nf | 77 +++++++++++++++---- 9 files changed, 91 insertions(+), 29 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1f2ddd84..b518a7bc 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -118,7 +118,7 @@ process { withName: '.*:BCFTOOLS_ISEC' { ext.prefix = { "${meta.id}_isec" } ext.args ={ - "-n=2 -c all -Oz" + "-Oz" } publishDir = [ enabled: false @@ -358,14 +358,14 @@ process { // Small variant calling processes // withName: '.*:BCFTOOLS_CONCAT' { - ext.args = '--output-type z -a' + ext.args = {'-Oz -a -W=tbi'} publishDir = [ enabled: false ] } withName: '.*:BCFTOOLS_SORT' { ext.prefix = { "${meta.id}_sorted" } - ext.arge = '--output-type z' + ext.arge = {'-Oz'} publishDir = [ enabled: false ] diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 33ef8609..ab398bab 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -25,15 +25,18 @@ process CLAIR3 { script: def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + """ run_clair3.sh \\ - --bam_fn=$bam \\ - --ref_fn=$reference \\ - --threads=$task.cpus \\ + --bam_fn=${bam} \\ + --ref_fn=${reference} \\ + --threads=${task.cpus} \\ --output=. \\ - --platform=$platform \\ - --model=$model \\ - $args + --platform=${platform} \\ + --model=${model} \\ + --sample_name=${prefix} \\ + ${args} """ stub: diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index d683c777..4342e401 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -20,6 +20,7 @@ process CLAIRS { task.ext.when == null || task.ext.when script: + prefix = task.ext.prefix ?: "${meta.id}" def args = task.ext.args ?: '' """ @@ -29,6 +30,7 @@ process CLAIRS { --ref_fn $reference \\ --threads $task.cpus \\ --platform $model \\ + --sample_name ${prefix} \\ --output_dir . \\ --output_prefix snvs \\ $args diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 9071487d..2d5b07ec 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -28,6 +28,7 @@ process CLAIRSTO { script: def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' def gnomad_arg = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' def dbSNP_arg = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' @@ -41,6 +42,7 @@ process CLAIRSTO { --platform $model \\ --threads $task.cpus \\ --output_dir . \\ + --sample_name ${prefix} \\ --panel_of_normals "${gnomad_arg},${dbSNP_arg},${onekgenomes_arg},${colors_arg}" \\ --panel_of_normals_require_allele_matching 'True,True,False,False' \\ $conda_prefix \\ diff --git a/modules/nf-core/bcftools/isec/main.nf b/modules/nf-core/bcftools/isec/main.nf index 1536c523..2bbf6263 100644 --- a/modules/nf-core/bcftools/isec/main.nf +++ b/modules/nf-core/bcftools/isec/main.nf @@ -12,10 +12,15 @@ process BCFTOOLS_ISEC { output: tuple val(meta), path("${prefix}", type: "dir"), emit: results - tuple val(meta), path("${prefix}/0000.vcf.gz"), emit: deepvar_style_consensus_vcf - tuple val(meta), path("${prefix}/0000.vcf.gz.tbi"), emit: deepvar_style_consensus_tbi - tuple val(meta), path("${prefix}/0001.vcf.gz"), emit: clair3_style_consensus_vcf - tuple val(meta), path("${prefix}/0001.vcf.gz.tbi"), emit: clair3_style_consensus_tbi + tuple val(meta), path("${prefix}/0002.vcf.gz"), emit: deepvar_consensus_vcf + tuple val(meta), path("${prefix}/0002.vcf.gz.tbi"), emit: deepvar_consensus_tbi + tuple val(meta), path("${prefix}/0003.vcf.gz"), emit: clair_consensus_vcf + tuple val(meta), path("${prefix}/0003.vcf.gz.tbi"), emit: clair_consensus_tbi + tuple val(meta), path("${prefix}/0001.vcf.gz"), emit: clair_private_vcf + tuple val(meta), path("${prefix}/0001.vcf.gz.tbi"), emit: clair_private_tbi + tuple val(meta), path("${prefix}/0000.vcf.gz"), emit: deepvar_private_vcf + tuple val(meta), path("${prefix}/0000.vcf.gz.tbi"), emit: deepvar_private_tbi + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: diff --git a/modules/nf-core/deepvariant/makeexamples/main.nf b/modules/nf-core/deepvariant/makeexamples/main.nf index 77d2f331..d553e980 100644 --- a/modules/nf-core/deepvariant/makeexamples/main.nf +++ b/modules/nf-core/deepvariant/makeexamples/main.nf @@ -36,6 +36,7 @@ process DEEPVARIANT_MAKEEXAMPLES { --mode calling \\ --ref "${fasta}" \\ --reads "${input}" \\ + --sample_name ${prefix} \\ --examples "./${prefix}.examples.tfrecord@${task.cpus}.gz" \\ --gvcf "./${prefix}.gvcf.tfrecord@${task.cpus}.gz" \\ ${regions} \\ diff --git a/modules/nf-core/deepvariant/postprocessvariants/main.nf b/modules/nf-core/deepvariant/postprocessvariants/main.nf index 0830f9ac..2a7e8fb6 100644 --- a/modules/nf-core/deepvariant/postprocessvariants/main.nf +++ b/modules/nf-core/deepvariant/postprocessvariants/main.nf @@ -64,6 +64,7 @@ process DEEPVARIANT_POSTPROCESSVARIANTS { --outfile "${prefix}.vcf.gz" \\ --nonvariant_site_tfrecord_path "${gvcf_tfrecords_logical_name}" \\ --gvcf_outfile "${prefix}.g.vcf.gz" \\ + --sample_name ${prefix} \\ ${regions} \\ ${small_model_arg} \\ --cpus $task.cpus diff --git a/nextflow.config b/nextflow.config index 68c9fd9b..010ad79e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,7 +13,8 @@ params { // Input options input = null - germline_var_keep = 'all' + germline_var_keep = 'consensus' + trust_caller = 'clair' // References diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 92399dcd..c82b3c7b 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -1,9 +1,10 @@ -include { BCFTOOLS_NORM } from '../../modules/nf-core/bcftools/norm/main' -include { BCFTOOLS_ISEC } from '../../modules/nf-core/bcftools/isec/main' -include { BCFTOOLS_MERGE } from '../../modules/nf-core/bcftools/merge/main' -include { BCFTOOLS_QUERY } from '../../modules/nf-core/bcftools/query/main' -include { BCFTOOLS_ANNOTATE } from '../../modules/nf-core/bcftools/annotate/main' +include { BCFTOOLS_NORM } from '../../modules/nf-core/bcftools/norm/main' +include { BCFTOOLS_ISEC } from '../../modules/nf-core/bcftools/isec/main' +include { BCFTOOLS_QUERY } from '../../modules/nf-core/bcftools/query/main' +include { BCFTOOLS_ANNOTATE } from '../../modules/nf-core/bcftools/annotate/main' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' +include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort/main' @@ -105,23 +106,69 @@ workflow SMALL_VARIANT_CONSENSUS { } .set{isec_input} BCFTOOLS_ISEC(isec_input) - BCFTOOLS_ISEC.out.deepvar_style_consensus_vcf + + if (params.trust_caller = 'deepvariant') { + BCFTOOLS_ISEC.out.clair_consensus_vcf .set{vcf} - BCFTOOLS_ISEC.out.deepvar_style_consensus_tbi + BCFTOOLS_ISEC.out.clair_consensus_tbi .set{tbi} + } + if (params.trust_caller = 'clair') { + BCFTOOLS_ISEC.out.clair_consensus_vcf + .set{vcf} + BCFTOOLS_ISEC.out.clair_consensus_tbi + .set{tbi} + } + } else if (var_keep_method == 'all'){ + mixed_vcfs - .map{ meta, vcfs, tbis -> - def bed = [] - return [ meta, vcfs, tbis, bed ] - } - .set{ merge_input} - BCFTOOLS_MERGE(merge_input, fasta, fai ) - BCFTOOLS_MERGE.out.vcf + .map{ meta, vcfs, tbis -> + def file = [] + def target = [] + def regions = [] + return [meta, vcfs, tbis, file, target, regions] + } + .set{isec_input} + + BCFTOOLS_ISEC(isec_input) + + if (params.trust_caller = 'deepvariant') { + BCFTOOLS_ISEC.out.deepvar_consensus_vcf + .join(BCFTOOLS_ISEC.out.deepvar_consensus_tbi) + .join(BCFTOOLS_ISEC.out.clair_private_vcf) + .join(BCFTOOLS_ISEC.out.clair_private_tbi) + .map{ meta, deepvar_vcf, deepvar_tbi, clair_vcf, clair_tbi -> + return[meta, [deepvar_vcf, clair_vcf], [deepvar_tbi, clair_tbi]] + } + .set{concat_input} + BCFTOOLS_CONCAT(concat_input) + BCFTOOLS_CONCAT.out.vcf + .join(BCFTOOLS_CONCAT.out.tbi) + .set{concat_out} + } + + else if (params.trust_caller = 'clair') { + BCFTOOLS_ISEC.out.deepvar_private_vcf + .join(BCFTOOLS_ISEC.out.deepvar_private_tbi) + .join(BCFTOOLS_ISEC.out.clair_consensus_vcf) + .join(BCFTOOLS_ISEC.out.clair_consensus_tbi) + .map{ meta, deepvar_vcf, deepvar_tbi, clair_vcf, clair_tbi -> + return[meta, [deepvar_vcf, clair_vcf], [deepvar_tbi, clair_tbi]] + } + .set{concat_input} + BCFTOOLS_CONCAT(concat_input) + BCFTOOLS_CONCAT.out.vcf + .join(BCFTOOLS_CONCAT.tbi) + .set{concat_out} + } + concat_out.view() + BCFTOOLS_SORT(concat_out) + BCFTOOLS_SORT.out.vcf .set{vcf} - BCFTOOLS_MERGE.out.index + BCFTOOLS_SORT.out.tbi .set{tbi} } From f676fd43535538c53911c2a235ad59b15db1ad00 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 17 Mar 2026 13:10:59 +0100 Subject: [PATCH 150/183] channel restructure --- conf/modules.config | 2 +- .../local/deepsomatic/makeexamples/main.nf | 2 +- nextflow.config | 3 +- nextflow_schema.json | 24 ++++++++++++ subworkflows/local/small_variant_consensus.nf | 6 --- subworkflows/local/tumor_normal_happhase.nf | 31 +++++++++++++++ subworkflows/local/tumor_only_happhase.nf | 39 ++++++++++++++++--- 7 files changed, 93 insertions(+), 14 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b518a7bc..5e54217c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -365,7 +365,7 @@ process { } withName: '.*:BCFTOOLS_SORT' { ext.prefix = { "${meta.id}_sorted" } - ext.arge = {'-Oz'} + ext.args = {'-Oz -W=tbi'} publishDir = [ enabled: false ] diff --git a/modules/local/deepsomatic/makeexamples/main.nf b/modules/local/deepsomatic/makeexamples/main.nf index f1b148b4..206e497c 100644 --- a/modules/local/deepsomatic/makeexamples/main.nf +++ b/modules/local/deepsomatic/makeexamples/main.nf @@ -36,7 +36,7 @@ process DEEPSOMATIC_MAKEEXAMPLES { --ref "${fasta}" \\ --reads_tumor "${tumor_input}" \\ ${normalReadsArg} \\ - --sample_name_tumor "${prefix}_tumor" \\ + --sample_name_tumor "${prefix}" \\ ${normalSampleArg} \\ --examples "./${prefix}.examples.tfrecord@${task.cpus}.gz" \\ --gvcf "./${prefix}.gvcf.tfrecord@${task.cpus}.gz" \\ diff --git a/nextflow.config b/nextflow.config index 010ad79e..fb67ff05 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,7 +14,8 @@ params { input = null germline_var_keep = 'consensus' - trust_caller = 'clair' + somatic_var_keep = 'all' + trust_caller = 'deepvariant' // References diff --git a/nextflow_schema.json b/nextflow_schema.json index b25ea2ee..f22408bc 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -43,6 +43,30 @@ } } }, + "small_variant_calling_options": { + "title": "options for small variant calling", + "type": "object", + "properties": { + "trust_caller": { + "type": "string", + "description": "specifies which variant caller format to use when both clair and deepvariant call the same variant", + "default": "deepvariant", + "enum": ["deepvariant", "clair"] + }, + "germline_var_keep": { + "type": "string", + "description": "specifies which germline variants are used for phasing and annotation. Must be [consensus, all,deepvariant,clair]", + "default": "consensus", + "enum": ["consensus", "all","deepvariant","clair"] + }, + "somatic_var_keep": { + "type": "string", + "description": "specifies which somatic variants are used for phasing and annotation. Must be [consensus, all,deepvariant,clair]", + "default": "all", + "enum": ["consensus", "all", "deepvariant","clair"] + } + } + }, "reference_genome_options": { "title": "Reference genome options", "type": "object", diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index c82b3c7b..266b52a5 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -84,8 +84,6 @@ workflow SMALL_VARIANT_CONSENSUS { return [ new_meta, vcfs, tbi] } .set{deepvariant_ch} - deepvariant_ch.view() - clair_ch.view() deepvariant_ch .join(clair_ch) .map { meta, deepvar_vcf, deepvar_tbi, clair_vcf, clair_tbi -> @@ -95,7 +93,6 @@ workflow SMALL_VARIANT_CONSENSUS { } .set{mixed_vcfs} - mixed_vcfs.view() if (var_keep_method == 'consensus') { mixed_vcfs .map{ meta, vcfs, tbis -> @@ -146,7 +143,6 @@ workflow SMALL_VARIANT_CONSENSUS { .set{concat_input} BCFTOOLS_CONCAT(concat_input) BCFTOOLS_CONCAT.out.vcf - .join(BCFTOOLS_CONCAT.out.tbi) .set{concat_out} } @@ -161,10 +157,8 @@ workflow SMALL_VARIANT_CONSENSUS { .set{concat_input} BCFTOOLS_CONCAT(concat_input) BCFTOOLS_CONCAT.out.vcf - .join(BCFTOOLS_CONCAT.tbi) .set{concat_out} } - concat_out.view() BCFTOOLS_SORT(concat_out) BCFTOOLS_SORT.out.vcf .set{vcf} diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf index 209a9995..8ef04aaa 100644 --- a/subworkflows/local/tumor_normal_happhase.nf +++ b/subworkflows/local/tumor_normal_happhase.nf @@ -326,13 +326,44 @@ workflow TUMOR_NORMAL_HAPPHASE { BCFTOOLS_SORT ( BCFTOOLS_CONCAT.out.vcf ) + BCFTOOLS_SORT.out.vcf.view() + BCFTOOLS_SORT.out.tbi.view() + + DEEPSOMATIC.out.vcf + .join(DEEPSOMATIC.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepsomatic'] + return [new_meta, vcf, tbi] + } + .set{deepsomatic_ch} BCFTOOLS_SORT.out.vcf + .join(BCFTOOLS_SORT.out.tbi) + .map { meta, vcf , tbi -> + def new_meta = meta + [caller:'clairs'] + return [new_meta, vcf, tbi] + } + .set{clairs_ch} + // [meta,deepvar_vcf,deepvar_index,clair3_vcf,clair3_index] + clairs_ch.view() + clairs_ch + .mix(deepsomatic_ch) + .set{mixed_somatic_vcfs} + mixed_somatic_vcfs.view() + SOMATIC_CONSENSUS( + mixed_somatic_vcfs, + fasta, + fai, + params.somatic_var_keep + ) + + SOMATIC_CONSENSUS.out.vcf .map { meta, vcf -> def extra = [] return [meta, vcf, extra] } .set { somatic_vep } + // [meta, sorted_clairs_vcf, []] -- somatic small variants (SNV+indel merged) for VEP annotation emit: diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index 48b25fed..c2bdf35a 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -5,7 +5,9 @@ include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/hapl include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' -include { SMALL_VARIANT_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' + +include { SMALL_VARIANT_CONSENSUS as GERMLINE_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' +include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' workflow TUMOR_ONLY_HAPPHASE { @@ -115,16 +117,43 @@ workflow TUMOR_ONLY_HAPPHASE { .mix(deepvariant_ch) .set{mixed_vcfs} - SMALL_VARIANT_CONSENSUS( + GERMLINE_CONSENSUS( mixed_vcfs, fasta, fai, params.germline_var_keep ) + + VCFSPLIT.out.somatic_vcf + .join(VCFSPLIT.out.somatic_tbi) + .map { meta, vcf, tbi -> + def new_meta = meta + [caller:'clairs-to'] + return [ new_meta, vcf, tbi] + } + .set{clairsto_somatic_ch} + + DEEPSOMATIC.out.vcf + .join(DEEPSOMATIC.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepsomatic'] + return [new_meta, vcf, tbi] + } + .set{deepsomatic_ch} + + clairsto_somatic_ch + .mix(deepsomatic_ch) + .set{mixed_somatic_vcfs} + + SOMATIC_CONSENSUS( + mixed_somatic_vcfs, + fasta, + fai, + params.somatic_var_keep + ) // Add the nonsomatic vcf info // remove model info tumor_bams - .join(SMALL_VARIANT_CONSENSUS.out.vcf) + .join(GERMLINE_CONSENSUS.out.vcf) .map{ meta, bam, bai, _model, snps -> def svs = [] def mods = [] @@ -133,7 +162,7 @@ workflow TUMOR_ONLY_HAPPHASE { .set{ tumor_bams_germlinevcf } // [meta, bam, bai, nonsomatic_vcf, [], []] -- non-somatic variants used for phasing; svs and mods are empty placeholders for LONGPHASE_PHASE input - VCFSPLIT.out.somatic_vcf + SOMATIC_CONSENSUS.out.vcf .map { meta, vcf -> def extra = [] return [meta,vcf, extra] @@ -141,7 +170,7 @@ workflow TUMOR_ONLY_HAPPHASE { .set { somatic_vep } // [meta, somatic_vcf, []] -- PASS (somatic) variants for VEP annotation - VCFSPLIT.out.germline_vcf + GERMLINE_CONSENSUS.out.vcf .map { meta, vcf -> def extra = [] return [meta,vcf, extra] From 43ca8f8600d886113fcf997120b93879c80adbb1 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 17 Mar 2026 14:03:48 +0100 Subject: [PATCH 151/183] improve clairsto pon handling --- modules/local/clairsto/main.nf | 16 +++------ nextflow.config | 2 ++ subworkflows/local/tumor_only_happhase.nf | 14 +++----- workflows/lrsomatic.nf | 40 ++++++++++++++++------- 4 files changed, 39 insertions(+), 33 deletions(-) diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 2d5b07ec..04e73819 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -8,13 +8,9 @@ process CLAIRSTO { 'docker.io/hkubal/clairs-to:v0.4.2' }" input: - tuple val(meta), path(tumor_bam), path(tumor_bai), val(model) + tuple val(meta), path(tumor_bam), path(tumor_bai), val(model), path(pon_vcfs), val(pon_flags) tuple val(meta2), path(reference) tuple val(meta3), path(index) - path(dbSNP) - path(colors) - path(onekgenomes) - path(gnomad) output: tuple val(meta), path("indel.vcf.gz"), emit: indel_vcf @@ -30,10 +26,8 @@ process CLAIRSTO { def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' - def gnomad_arg = gnomad ?: 'gnomad.r2.1.af-ge-0.001.sites.vcf.gz' - def dbSNP_arg = dbSNP ?: 'dbsnp.b138.non-somatic.sites.vcf.gz' - def onekgenomes_arg = onekgenomes ?: '1000g-pon.sites.vcf.gz' - def colors_arg = colors ?: 'colors-pon.sites.vcf.gz' + def pon_string = pon_vcfs.join(',') + def flags_string = pon_flags.join(',') """ /opt/bin/run_clairs_to \ @@ -43,8 +37,8 @@ process CLAIRSTO { --threads $task.cpus \\ --output_dir . \\ --sample_name ${prefix} \\ - --panel_of_normals "${gnomad_arg},${dbSNP_arg},${onekgenomes_arg},${colors_arg}" \\ - --panel_of_normals_require_allele_matching 'True,True,False,False' \\ + --panel_of_normals ${pon_string} \\ + --panel_of_normals_require_allele_matching ${flags_string} \\ $conda_prefix \\ $args \\ """ diff --git a/nextflow.config b/nextflow.config index fb67ff05..03531fb9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -17,6 +17,8 @@ params { somatic_var_keep = 'all' trust_caller = 'deepvariant' + pon_vcfs = null + pon_flags = null // References genome = null diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf index c2bdf35a..e68d4c06 100644 --- a/subworkflows/local/tumor_only_happhase.nf +++ b/subworkflows/local/tumor_only_happhase.nf @@ -16,10 +16,7 @@ workflow TUMOR_ONLY_HAPPHASE { tumor_bams fasta fai - dbsnp - colors - onekgenomes - gnomad + pon_channel main: @@ -71,15 +68,12 @@ workflow TUMOR_ONLY_HAPPHASE { // // call somatic/non-somatic variants // (* not called as germline * just non-somatic) - + tumor_bams.combine(pon_channel).set{new_combine} + new_combine.view() CLAIRSTO ( - tumor_bams, + new_combine, fasta, fai, - dbsnp, - colors, - onekgenomes, - gnomad ) CLAIRSTO.out.indel_vcf diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index fc61e9c6..6f296c9d 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -93,10 +93,33 @@ workflow LRSOMATIC { params.bed_file = getGenomeAttribute('bed_file') params.vep_genome = getGenomeAttribute('vep_genome') params.vep_species = getGenomeAttribute('vep_species') - params.dbsnp = getGenomeAttribute('dbsnp') - params.colors = getGenomeAttribute('colors') - params.onekgenomes = getGenomeAttribute('onekgenomes') - params.gnomad = getGenomeAttribute('gnomad') + + if (params.pons_vcfs != null) { + pon_files = params.pon_vcfs.collect { file(it) } + pon_flags = params.pon_flags + } + else { + pon_files = [ + getGenomeAttribute('gnomad'), + getGenomeAttribute('dbsnp'), + getGenomeAttribute('onekgenomes'), + getGenomeAttribute('colors'), + ] + pon_flags = [ + "True", + "True", + "False", + "False" + ] + } + if (pon_files.size() != pon_flags.size()) { + error "PoN VCFs and allele flags must have same length" + } + Channel + .of( tuple(pon_files, pon_flags) ) + .set { pon_channel } + + pon_channel.view() ch_versions = channel.empty() ch_multiqc_files = channel.empty() @@ -404,19 +427,12 @@ workflow LRSOMATIC { // // Phasing/haplotagging for tumor only samples - dbsnp = file(params.dbsnp) - colors = file(params.colors) - onekgenomes = file(params.onekgenomes) - gnomad = file(params.gnomad) TUMOR_ONLY_HAPPHASE ( branched_minimap.tumor_only, ch_fasta, ch_fai, - dbsnp, - colors, - onekgenomes, - gnomad + pon_channel ) germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) From 5fda74420daa47456fdfda3a90b04984d92381ef Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 23 Mar 2026 16:05:55 +0100 Subject: [PATCH 152/183] migrate some functions to different workflows to improve readability --- conf/modules.config | 2 +- log.txt | 0 modules/local/longphase/modcall/main.nf | 61 +++ modules/local/vcfsplit/main.nf | 4 +- modules/nf-core/longphase/phase/main.nf | 10 +- nextflow.config | 1 + .../local/paired/paired_smallvar_germline.nf | 144 +++++++ .../local/paired/paired_smallvar_somatic.nf | 126 ++++++ subworkflows/local/phasing_haplotyping.nf | 235 +++++++++++ subworkflows/local/small_variant_consensus.nf | 14 +- subworkflows/local/tumor_normal_happhase.nf | 375 ------------------ .../local/tumor_only/tumoronly_smallvar.nf | 207 ++++++++++ subworkflows/local/tumor_only_happhase.nf | 252 ------------ workflows/lrsomatic.nf | 160 ++++++-- 14 files changed, 913 insertions(+), 678 deletions(-) create mode 100644 log.txt create mode 100644 modules/local/longphase/modcall/main.nf create mode 100644 subworkflows/local/paired/paired_smallvar_germline.nf create mode 100644 subworkflows/local/paired/paired_smallvar_somatic.nf create mode 100644 subworkflows/local/phasing_haplotyping.nf delete mode 100644 subworkflows/local/tumor_normal_happhase.nf create mode 100644 subworkflows/local/tumor_only/tumoronly_smallvar.nf delete mode 100644 subworkflows/local/tumor_only_happhase.nf diff --git a/conf/modules.config b/conf/modules.config index 5e54217c..397e73aa 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -260,7 +260,7 @@ process { // withName: '.*:MINIMAP2_ALIGN' { - ext.prefix = { "${meta.id}_mapped" } + ext.prefix = { "${meta.id}_${meta.type}_mapped" } ext.args = { [ meta.platform == 'pb' ? ( params.minimap2_pb_model ? "-ax $params.minimap2_pb_model" : "-ax map-hifi" ) : diff --git a/log.txt b/log.txt new file mode 100644 index 00000000..e69de29b diff --git a/modules/local/longphase/modcall/main.nf b/modules/local/longphase/modcall/main.nf new file mode 100644 index 00000000..dd04482e --- /dev/null +++ b/modules/local/longphase/modcall/main.nf @@ -0,0 +1,61 @@ +process LONGPHASE_MODCALL { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': + 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" + + input: + tuple val(meta), path(bam), path(bai) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + + + output: + tuple val(meta), path("*.vcf") , emit: mod_vcf + tuple val(meta), path("*.log") , emit: log , 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}" + + """ + longphase \\ + modcall \\ + $args \\ + --threads $task.cpus \\ + -o ${prefix} \\ + --reference ${fasta} \\ + -b ${bam} \\ + --out-prefix ${prefix} + + if [ -f "${prefix}.out" ]; then + mv ${prefix}.out ${prefix}.log + fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def log = args.contains('--log') ? "touch ${prefix}.log" : '' + """ + touch ${prefix}.vcf + ${log} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ +} diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index df7ce318..5c9bb05f 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -31,8 +31,8 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $indel_vcf | bgzip -c > indels_filtered.vcf.gz - bcftools view -i 'FILTER="NonSomatic"' $snv_vcf | bgzip -c > snv_filtered.vcf.gz + bcftools view -i 'FILTER="NonSomatic" | Verdict_Germline' $indel_vcf | bgzip -c > indels_filtered.vcf.gz + bcftools view -i 'FILTER="NonSomatic" | Verdict_Germline' $snv_vcf | bgzip -c > snv_filtered.vcf.gz tabix -p vcf indels_filtered.vcf.gz tabix -p vcf snv_filtered.vcf.gz bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_filtered.vcf.gz snv_filtered.vcf.gz diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 3b942972..5a20381f 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -49,7 +49,15 @@ process LONGPHASE_PHASE { $args2 \\ ${prefix}*.vcf - tabix -p vcf ${prefix}*.vcf.gz + tabix -p vcf ${prefix}.vcf.gz + + if [ -f ${prefix}_SV.vcf.gz ]; then + tabix -p vcf ${prefix}_SV.vcf.gz + fi + + if [ -f ${prefix}_mod.vcf.gz ]; then + tabix -p vcf ${prefix}_mod.vcf.gz + fi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/nextflow.config b/nextflow.config index 03531fb9..1cef0a68 100644 --- a/nextflow.config +++ b/nextflow.config @@ -47,6 +47,7 @@ params { skip_fiber = false skip_m6a = false skip_vep = false + skip_modcall = false // minimap2 options minimap2_ont_model = null diff --git a/subworkflows/local/paired/paired_smallvar_germline.nf b/subworkflows/local/paired/paired_smallvar_germline.nf new file mode 100644 index 00000000..4ad2d727 --- /dev/null +++ b/subworkflows/local/paired/paired_smallvar_germline.nf @@ -0,0 +1,144 @@ +// IMPORT MODULES +include { CLAIR3 } from '../../../modules/local/clair3/main.nf' + +// IMPORT SUBWORKFLOWS +include { DEEPVARIANT } from '../../../subworkflows/nf-core/deepvariant/main.nf' +include { SMALL_VARIANT_CONSENSUS as GERMLINE_CONSENSUS } from '../../../subworkflows/local/small_variant_consensus.nf' + +workflow PAIRED_SMALLVAR_GERMLINE { + + take: + normal_bams // [ meta, normal_bam, normal_bai ] + fasta + fai + clair3_models + + main: + ch_versions = channel.empty() + germline_vcf = channel.empty() + germline_tbi = channel.empty() + // COMBINE NORMAL BAMS WITH DOWNLOADED CLAIR3 MODELS + if(params.germline_var_keep != 'deepvariant') { + + clair3_models + .map{ meta, file -> + def clair3_model_name = meta.id + return [meta, clair3_model_name, file] + } + .set{clair3_models} + normal_bams + .map{ meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [ new_meta, meta.clair3_model, bam, bai ] + } + .set { normal_bams_model } + + // CLAIR3 + normal_bams_model + .combine(clair3_models,by:1) + .map {_clair3_model, meta_bam, bam, bai, _meta_model, model -> + def platform = (meta_bam.platform == 'pb') ? 'hifi' : meta_bam.platform + return [meta_bam, bam, bai, model, platform] + } + .set{ clair3_input_ch } + + CLAIR3 ( + clair3_input_ch, + fasta, + fai + ) + + CLAIR3.out.vcf + .join(CLAIR3.out.tbi) + .map { meta, vcf , tbi -> + def new_meta = meta + [caller:'clair3'] + return [new_meta, vcf, tbi] + } + .set{clair3_ch} + } + // DEEPVARIANT + if(params.germline_var_keep != 'clair') { + + normal_bams + .map {meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + def intervals = [] + return [new_meta, bam, bai, intervals] + } + .set{deepvariant_input_ch} + + DEEPVARIANT ( + deepvariant_input_ch, + fasta, + fai, + [[:],[]], + [[:],[]] + ) + + DEEPVARIANT.out.vcf + .join(DEEPVARIANT.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepvariant'] + return [new_meta, vcf, tbi] + } + .set{deepvariant_ch} + } + // COMBINE GERMLINE VARIATION + if (params.germline_var_keep != 'clair' && params.germline_var_keep != 'deepvariant' ) { + clair3_ch + .mix(deepvariant_ch) + .set{combined_germline_ch} + + GERMLINE_CONSENSUS( + combined_germline_ch, + fasta, + fai, + params.germline_var_keep + ) + GERMLINE_CONSENSUS.out.vcf + .join(GERMLINE_CONSENSUS.out.tbi) + .set{ germline_vcf } + } + else if (params.germline_var_keep == 'clair') { + clair3_ch + .set{germline_vcf} + } + else if (params.germline_var_keep == 'deepvariant') { + deepvariant_ch + .set{germline_vcf} + } + + germline_vcf + .map{ meta, vcf, tbi -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, vcf, tbi] + } + .set{germline_vcf} + + emit: + germline_vcf +} diff --git a/subworkflows/local/paired/paired_smallvar_somatic.nf b/subworkflows/local/paired/paired_smallvar_somatic.nf new file mode 100644 index 00000000..e7cad038 --- /dev/null +++ b/subworkflows/local/paired/paired_smallvar_somatic.nf @@ -0,0 +1,126 @@ +// IMPORT MODULES +include { CLAIRS } from '../../../modules/local/clairs/main.nf' +include { BCFTOOLS_CONCAT } from '../../../modules/nf-core/bcftools/concat' +include { BCFTOOLS_SORT } from '../../../modules/nf-core/bcftools/sort' + +// IMPORT SUBWORKFLOWS +include { DEEPSOMATIC } from '../../../subworkflows/local/deepsomatic.nf' +include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../../subworkflows/local/small_variant_consensus.nf' + +workflow PAIRED_SMALLVAR_SOMATIC { + + take: + tumor_normal_bams // [ meta, tumor_bam, tumor_bai, normal_hapbam, normal_bai ] + fasta + fai + + main: + ch_versions = channel.empty() + somatic_vcf = channel.empty() + somatic_tbi = channel.empty() + + // CLAIRS + if(params.somatic_var_keep != 'deepvariant') { + tumor_normal_bams + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai -> + return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] + } + .set { clairs_input } + + CLAIRS ( + clairs_input, + fasta, + fai + ) + + // CONCAT CLAIRS INDEL AND SNV OUTPUT + + CLAIRS.out.vcfs + .join(CLAIRS.out.tbi) + .set{clairs_out} + + BCFTOOLS_CONCAT ( + clairs_out + ) + + BCFTOOLS_SORT ( + BCFTOOLS_CONCAT.out.vcf + ) + + BCFTOOLS_SORT.out.vcf + .join(BCFTOOLS_SORT.out.tbi) + .map { meta, vcf , tbi -> + def new_meta = meta + [caller:'clairs'] + return [new_meta, vcf, tbi] + } + .set{clairs_ch} + } + // DEEPSOMATIC + + if(params.somatic_var_keep != 'clair') { + + tumor_normal_bams + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai -> + return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + } + .set{ deepsomatic_input } + + DEEPSOMATIC ( + deepsomatic_input, + [[:],[]], + fasta, + fai, + [[:],[]] + ) + + DEEPSOMATIC.out.vcf + .join(DEEPSOMATIC.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepsomatic'] + return [new_meta, vcf, tbi] + } + .set{deepsomatic_ch} + + } + // COMBINE GERMLINE VARIATION + if (params.somatic_var_keep != 'clair' && params.somatic_var_keep != 'deepvariant' ) { + clairs_ch + .mix(deepsomatic_ch) + .set{combine_somatic_ch} + + SOMATIC_CONSENSUS( + combine_somatic_ch, + fasta, + fai, + params.somatic_var_keep + ) + + SOMATIC_CONSENSUS.out.vcf + .join(SOMATIC_CONSENSUS.out.tbi) + .set{ somatic_vcf } + } + else if (params.somatic_var_keep == 'clair') { + clairs_ch + .set{somatic_vcf} + } + else if (params.somatic_var_keep == 'deepvariant') { + deepsomatic_ch + .set{somatic_vcf} + } + somatic_vcf + .map{ meta, vcf, tbi -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, vcf, tbi] + } + .set{somatic_vcf} + emit: + somatic_vcf +} diff --git a/subworkflows/local/phasing_haplotyping.nf b/subworkflows/local/phasing_haplotyping.nf new file mode 100644 index 00000000..272b5ef0 --- /dev/null +++ b/subworkflows/local/phasing_haplotyping.nf @@ -0,0 +1,235 @@ +// Import modules +include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { LONGPHASE_MODCALL } from '../../modules/local/longphase/modcall/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +workflow PHASING_HAPLOTYPING { + take: + tumor_normal_bams // [meta, bam, bai] + germline_vcf + fasta + fai + + main: + + // SPLIT INTO PAIRED AND TUMOR ONLY + tumor_normal_bams + .branch { meta, _bams, _bai -> + paired: meta.paired_data + tumor_only: !meta.paired_data + } + .set { branched_bams } + + branched_bams.paired + .set{ paired_ch } + + branched_bams.tumor_only + .map { meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [ new_meta, bam, bai ] + } + .set{ tumor_only_ch } + + paired_ch + .branch { meta, _bam, _bai -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set {paired_ch_branched} + + paired_ch_branched.normal + .map { meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [ new_meta, bam, bai ] + } + .set{ paired_normal_ch } + + paired_ch_branched.tumor + .map { meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [ new_meta, bam, bai ] + } + .set{ paired_tumor_ch } + + tumor_only_ch + .mix(paired_normal_ch) + .set { longphase_modcall_input_ch } + + // MODCALL + + if (!params.skip_modcall) { + + LONGPHASE_MODCALL ( + longphase_modcall_input_ch, + fasta, + fai + ) + + } + // PHASING + if (!params.skip_modcall) { + longphase_modcall_input_ch + .join(germline_vcf) + .join(LONGPHASE_MODCALL.out.mod_vcf) + .map { meta, bam, bai, vcf, _tbi, mods-> + def svs = [] + return [ meta, bam, bai, vcf, svs, mods ] + } + .set{ longphase_phase_input_ch } + } + else { + longphase_modcall_input_ch + .join(germline_vcf) + .map { meta, bam, bai, vcf, _tbi-> + def svs = [] + def mods = [] + return [ meta, bam, bai, vcf, svs, mods ] + } + .set{ longphase_phase_input_ch } + } + LONGPHASE_PHASE ( + longphase_phase_input_ch, + fasta, + fai + ) + + LONGPHASE_PHASE.out.snv_vcf + .join(LONGPHASE_PHASE.out.snv_vcf_index) + .set{ phased_germline_vcf } + + // HAPLOTAGING + // remove type for merging + + + if(!params.skip_modcall) { + + LONGPHASE_MODCALL.out.mod_vcf + .map { meta, mods -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return [ new_meta, mods ] + } + .set{modcall_vcf_ch} + + tumor_only_ch + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(modcall_vcf_ch) + .map { meta, bam, bai, vcf, mods -> + def new_meta = meta + [type : "tumor"] + def svs = [] + return [new_meta, bam, bai, vcf, svs, mods] + } + .set{ tumor_only_ch } + + paired_tumor_ch + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(modcall_vcf_ch) + .map { meta, bam, bai, vcf, mods -> + def new_meta = meta + [type : "tumor"] + def svs = [] + return [new_meta, bam, bai, vcf, svs, mods] + } + .set{ paired_tumor_ch } + + paired_normal_ch + .join(LONGPHASE_PHASE.out.snv_vcf) + .join(modcall_vcf_ch) + .map { meta, bam, bai, vcf, mods -> + def new_meta = meta + [type : "normal"] + def svs = [] + return [new_meta, bam, bai, vcf, svs, mods] + } + .set{ paired_normal_ch } + + } + else { + + tumor_only_ch + .join(LONGPHASE_PHASE.out.snv_vcf) + .map { meta, bam, bai, vcf -> + def new_meta = meta + [type : "tumor"] + def svs = [] + def mods = [] + return [new_meta, bam, bai, vcf, svs, mods] + } + .set{ tumor_only_ch } + + paired_tumor_ch + .join(LONGPHASE_PHASE.out.snv_vcf) + .map { meta, bam, bai, vcf -> + def new_meta = meta + [type : "tumor"] + def svs = [] + def mods = [] + return [new_meta, bam, bai, vcf, svs, mods] + } + .set{ paired_tumor_ch } + + paired_normal_ch + .join(LONGPHASE_PHASE.out.snv_vcf) + .map { meta, bam, bai, vcf -> + def new_meta = meta + [type : "normal"] + def svs = [] + def mods = [] + return [new_meta, bam, bai, vcf, svs, mods] + } + .set{ paired_normal_ch } + + } + + tumor_only_ch + .join(paired_tumor_ch) + .join(paired_normal_ch) + .set {longphase_haplotag_input_ch} + + LONGPHASE_HAPLOTAG ( + longphase_haplotag_input_ch, + fasta, + fai + ) + + LONGPHASE_HAPLOTAG.out.bam + .set{ tumor_normal_hapbams_ch } + + SAMTOOLS_INDEX ( + tumor_normal_hapbams_ch + ) + tumor_normal_hapbams_ch + .join(SAMTOOLS_INDEX.out.bai) + .set{ tumor_normal_hapbams_ch } + + + emit: + tumor_normal_hapbams_ch + phased_germline_vcf +} \ No newline at end of file diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 266b52a5..823c38c9 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -84,6 +84,7 @@ workflow SMALL_VARIANT_CONSENSUS { return [ new_meta, vcfs, tbi] } .set{deepvariant_ch} + deepvariant_ch .join(clair_ch) .map { meta, deepvar_vcf, deepvar_tbi, clair_vcf, clair_tbi -> @@ -102,15 +103,16 @@ workflow SMALL_VARIANT_CONSENSUS { return [meta, vcfs, tbis, file, target, regions] } .set{isec_input} + BCFTOOLS_ISEC(isec_input) - if (params.trust_caller = 'deepvariant') { - BCFTOOLS_ISEC.out.clair_consensus_vcf + if (params.trust_caller == 'deepvariant') { + BCFTOOLS_ISEC.out.deepvar_consensus_vcf .set{vcf} - BCFTOOLS_ISEC.out.clair_consensus_tbi + BCFTOOLS_ISEC.out.deepvar_consensus_tbi .set{tbi} } - if (params.trust_caller = 'clair') { + if (params.trust_caller == 'clair') { BCFTOOLS_ISEC.out.clair_consensus_vcf .set{vcf} BCFTOOLS_ISEC.out.clair_consensus_tbi @@ -132,7 +134,7 @@ workflow SMALL_VARIANT_CONSENSUS { BCFTOOLS_ISEC(isec_input) - if (params.trust_caller = 'deepvariant') { + if (params.trust_caller == 'deepvariant') { BCFTOOLS_ISEC.out.deepvar_consensus_vcf .join(BCFTOOLS_ISEC.out.deepvar_consensus_tbi) .join(BCFTOOLS_ISEC.out.clair_private_vcf) @@ -146,7 +148,7 @@ workflow SMALL_VARIANT_CONSENSUS { .set{concat_out} } - else if (params.trust_caller = 'clair') { + else if (params.trust_caller == 'clair') { BCFTOOLS_ISEC.out.deepvar_private_vcf .join(BCFTOOLS_ISEC.out.deepvar_private_tbi) .join(BCFTOOLS_ISEC.out.clair_consensus_vcf) diff --git a/subworkflows/local/tumor_normal_happhase.nf b/subworkflows/local/tumor_normal_happhase.nf deleted file mode 100644 index 8ef04aaa..00000000 --- a/subworkflows/local/tumor_normal_happhase.nf +++ /dev/null @@ -1,375 +0,0 @@ -include { CLAIR3 } from '../../modules/local/clair3/main.nf' -include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' -include { CLAIRS } from '../../modules/local/clairs/main.nf' -include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat' -include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort' - -include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' -include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' -include { SMALL_VARIANT_CONSENSUS as GERMLINE_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' -include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' - - - -workflow TUMOR_NORMAL_HAPPHASE { - take: - mixed_bams - fasta - fai - downloaded_clair3_models - - main: - - ch_versions = channel.empty() - tumor_normal_severus = channel.empty() - somatic_vep = channel.empty() - germline_vep = channel.empty() - - // Branch input bams in normal and tumour - mixed_bams - .branch{ meta, _bam, _bai -> - normal: meta.type == "normal" - tumor: meta.type == "tumor" - } - .set{ mixed_bams } - - // Get normal bams and add platform/model info for Clair3 usage - // remove type from so that information can be merged easier later - - downloaded_clair3_models - .map{ meta, file -> - def clair3_model = meta.id - return [meta, clair3_model, file] - } - .set{downloaded_clair3_models} - - mixed_bams.normal - .map{ meta, bam, bai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - clair3_model: meta.clair3_model, - clairS_model: meta.clairS_model, - clairSTO_model: meta.clairSTO_model, - kinetics: meta.kinetics] - return [ new_meta, meta.clair3_model, bam, bai ] - } - .set { normal_bams_model } - // [meta, clair3_model_id, bam, bai] -- keyed by model ID for .combine() with downloaded_clair3_models - - normal_bams_model - .combine(downloaded_clair3_models,by:1) - .map {_clair3_model, meta_bam, bam, bai, _meta_model, model -> - def platform = (meta_bam.platform == 'pb') ? 'hifi' : meta_bam.platform - return [meta_bam, bam, bai, model, platform] - } - .set{ normal_bams } - // [meta, bam, bai, clair3_model_dir, platform] -- type excluded from meta; platform is "hifi" for PacBio - - /* - .map{ basecall_model, meta, bam, bai, meta2, model -> - def platform = (meta.platform == "pb") ? "hifi" : "ont" - return [meta, bam, bai, model, platform] - } - */ - - // Get tumour bams - // remove type from so that information can be merged easier later - mixed_bams.tumor - .map{ meta, bam, bai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - clair3_model: meta.clair3_model, - clairS_model: meta.clairS_model, - clairSTO_model: meta.clairSTO_model, - kinetics: meta.kinetics] - return[new_meta, bam, bai] - } - .set{ tumor_bams } - // [meta, bam, bai] -- type excluded from meta for downstream groupTuple merge - - // - // MODULE: CLAIR3 - // small germline variant calling - - CLAIR3 ( - normal_bams, - fasta, - fai - ) - - normal_bams - .map {meta, bam, bai, _model, _platform -> - def intervals = [] - return [meta, bam, bai, intervals] - } - .set{deepvar_normal_bams} - - DEEPVARIANT ( - deepvar_normal_bams, - fasta, - fai, - [[:],[]], - [[:],[]] - ) - - DEEPVARIANT.out.vcf - .join(DEEPVARIANT.out.vcf_index) - .map{ meta, vcf, tbi -> - def new_meta = meta + [caller:'deepvariant'] - return [new_meta, vcf, tbi] - } - .set{deepvariant_ch} - - CLAIR3.out.vcf - .join(CLAIR3.out.tbi) - .map { meta, vcf , tbi -> - def new_meta = meta + [caller:'clair3'] - return [new_meta, vcf, tbi] - } - .set{clair3_ch} - // [meta,deepvar_vcf,deepvar_index,clair3_vcf,clair3_index] - - clair3_ch - .mix(deepvariant_ch) - .set{mixed_vcfs} - - GERMLINE_CONSENSUS( - mixed_vcfs, - fasta, - fai, - params.germline_var_keep - ) - - - // Add germline vcf to normal bams - // remove clair3 model information - normal_bams - .join(GERMLINE_CONSENSUS.out.vcf) - .map { meta, bam, bai, _clair3_model, _platform, vcf -> - def svs = [] - def mods = [] - return [meta, bam, bai, vcf, svs, mods] - } - .set{ normal_bams_germlinevcf } - // [meta, bam, bai, germline_vcf, [], []] -- svs and mods are empty placeholders for LONGPHASE_PHASE input - - GERMLINE_CONSENSUS.out.vcf - .map { meta, vcf -> - def extra = [] - return [meta, vcf, extra] - } - .set { germline_vep } - // [meta, clair3_vcf, []] -- germline small variants for VEP annotation - - // - // MODULE: LONGPHASE_PHASE - // - // Phase normals - - LONGPHASE_PHASE ( - normal_bams_germlinevcf, - fasta, - fai - ) - - ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) - - // Add phased vcf to normal bams - // Add type information back - // both are needed for mixing with the tumor bams - - normal_bams - .join(LONGPHASE_PHASE.out.snv_vcf) - .map { meta, bam, bai, _clair3_model, _platform, vcf -> - def new_meta = meta + [type: "normal"] - def svs = [] - def mods = [] - return[new_meta, bam, bai, vcf, svs, mods] - } - .set{ normal_bams } - // [meta+{type:"normal"}, bam, bai, phased_vcf, [], []] -- type re-added; svs and mods are empty placeholders for LONGPHASE_HAPLOTAG - - // Add phased vcf to tumour bams and type information - // mix with the normal bams - - tumor_bams - .join(LONGPHASE_PHASE.out.snv_vcf) - .map { meta, bam, bai, vcf -> - def new_meta = meta + [type: "tumor"] - def svs = [] - def mods = [] - return [new_meta, bam, bai, vcf, svs, mods] - } - .mix(normal_bams) - .set{ mixed_bams_vcf } - // [meta+{type}, bam, bai, phased_normal_vcf, [], []] -- tumor and normal items both carry the same phased normal VCF - - // - // MODULE: LONGPHASE_HAPLOTAG - // - - // haplotag tumor and normal bams with normal vcf files for both - LONGPHASE_HAPLOTAG ( - mixed_bams_vcf, - fasta, - fai - ) - - ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) - - // Get final tagged bams - LONGPHASE_HAPLOTAG.out.bam - .set{ mixed_hapbams } - // [meta+{type}, haplotagged_bam] - - // - // MODULE: SAMTOOLS_INDEX - // - // index the haplotaged bams - - SAMTOOLS_INDEX ( - mixed_hapbams - ) - - // Add index to channel - mixed_bams_vcf - .join(mixed_hapbams) - .join(SAMTOOLS_INDEX.out.bai) - .set{ mixed_hapbams } - // [meta+{type}, orig_bam, orig_bai, vcf, svs, mods, hapbam, hapbai] - - // Group everything back together in one channel - mixed_hapbams - .map { meta, _bam, _bai, _vcf, _snvs, _mods, hapbam, hapbai -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - clair3_model: meta.clair3_model, - clairS_model: meta.clairS_model, - clairSTO_model: meta.clairSTO_model, - kinetics: meta.kinetics] - return[new_meta, [[type: meta.type], hapbam], [[type: meta.type], hapbai]] - } - .groupTuple(size: 2) - .map{ meta, bam, bai -> - def normal_bam = bam[0][0].type == "normal" ? bam[0][1] : bam[1][1] - def tumor_bam = bam[0][0].type == "tumor" ? bam[0][1] : bam[1][1] - def normal_bai = bai[0][0].type == "normal" ? bai[0][1] : bai[1][1] - def tumor_bai = bai[0][0].type == "tumor" ? bai[0][1] : bai[1][1] - // Return channel - return [ meta, tumor_bam, tumor_bai, normal_bam, normal_bai ] - } - .join(LONGPHASE_PHASE.out.snv_vcf) - .join(LONGPHASE_PHASE.out.snv_vcf_index) - .set{tumor_normal_severus} - // [meta, tumor_hapbam, tumor_bai, normal_hapbam, normal_bai, phased_vcf, phased_tbi] - - // Get ClairS input channel - tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf, _tbi -> - return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] - } - .set { clairs_input } - - tumor_normal_severus - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf, _tbi -> - return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] - } - .set{ deepsomatic_input } - - - - DEEPSOMATIC ( - deepsomatic_input, - [[:],[]], - fasta, - fai, - [[:],[]] - ) - - // - // MODULE: CLAIRS - // - - CLAIRS ( - clairs_input, - fasta, - fai - ) - - CLAIRS.out.vcfs - .join(CLAIRS.out.tbi) - .set{clairs_out} - - // - // MODULE: BCFTOOLS_CONCAT - // - - BCFTOOLS_CONCAT ( - clairs_out - ) - - // - // MODULE: BCFTOOLS_SORT - // - - BCFTOOLS_SORT ( - BCFTOOLS_CONCAT.out.vcf - ) - BCFTOOLS_SORT.out.vcf.view() - BCFTOOLS_SORT.out.tbi.view() - - DEEPSOMATIC.out.vcf - .join(DEEPSOMATIC.out.vcf_index) - .map{ meta, vcf, tbi -> - def new_meta = meta + [caller:'deepsomatic'] - return [new_meta, vcf, tbi] - } - .set{deepsomatic_ch} - - BCFTOOLS_SORT.out.vcf - .join(BCFTOOLS_SORT.out.tbi) - .map { meta, vcf , tbi -> - def new_meta = meta + [caller:'clairs'] - return [new_meta, vcf, tbi] - } - .set{clairs_ch} - // [meta,deepvar_vcf,deepvar_index,clair3_vcf,clair3_index] - clairs_ch.view() - clairs_ch - .mix(deepsomatic_ch) - .set{mixed_somatic_vcfs} - mixed_somatic_vcfs.view() - SOMATIC_CONSENSUS( - mixed_somatic_vcfs, - fasta, - fai, - params.somatic_var_keep - ) - - SOMATIC_CONSENSUS.out.vcf - .map { meta, vcf -> - def extra = [] - return [meta, vcf, extra] - } - .set { somatic_vep } - - // [meta, sorted_clairs_vcf, []] -- somatic small variants (SNV+indel merged) for VEP annotation - - emit: - tumor_normal_severus - somatic_vep - germline_vep - versions = ch_versions - -} diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf new file mode 100644 index 00000000..7db49724 --- /dev/null +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -0,0 +1,207 @@ +// IMPORT MODULES +include { CLAIRSTO } from '../../../modules/local/clairsto/main.nf' +include { VCFSPLIT } from '../../../modules/local/vcfsplit/main.nf' + +// IMPORT SUBWORKFLOWS +include { DEEPVARIANT } from '../../../subworkflows/nf-core/deepvariant/main.nf' +include { DEEPSOMATIC } from '../../../subworkflows/local/deepsomatic.nf' +include { SMALL_VARIANT_CONSENSUS as GERMLINE_CONSENSUS } from '../../../subworkflows/local/small_variant_consensus.nf' +include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../../subworkflows/local/small_variant_consensus.nf' + + +workflow TUMORONLY_SMALLVAR { + + take: + tumor_bams // [ meta, tumor_bams, tumor_bai ] + fasta + fai + pon_channel + + main: + + // empty channel emission + + ch_versions = channel.empty() + somatic_vcf = channel.empty() + germline_vcf = channel.empty() + somatic_tbi = channel.empty() + germline_tbi = channel.empty() + + // CLAIRS-TO (SOMATIC/NONGERMLINE VARIANT CALLING) + + if(params.somatic_var_keep != 'deepvariant') { + tumor_bams + .map { meta, bam, bai -> + return [ meta, bam, bai, meta.clairSTO_model] + } + .combine(pon_channel) + .set{ clairsto_input_ch} + CLAIRSTO ( + clairsto_input_ch, + fasta, + fai + ) + + + // SPLIT CLAIRSTO GERMLINE AND SOMATIC VARIATION + + CLAIRSTO.out.indel_vcf + .join(CLAIRSTO.out.snv_vcf) + .set{ clairsto_combined_vcf } + + VCFSPLIT ( + clairsto_combined_vcf + ) + + VCFSPLIT.out.germline_vcf + .join(VCFSPLIT.out.germline_tbi) + .map { meta, vcf, tbi -> + def new_meta = meta + [caller:'clairs-to'] + return [ new_meta, vcf, tbi] + } + .set{clairsto_germline_ch} + + VCFSPLIT.out.somatic_vcf + .join(VCFSPLIT.out.somatic_tbi) + .map { meta, vcf, tbi -> + def new_meta = meta + [caller:'clairs-to'] + return [ new_meta, vcf, tbi] + } + .set{clairsto_somatic_ch} + } + // DEEPVARIANT + if(params.somatic_var_keep != 'clair') { + tumor_bams + .map { meta, bam, bai -> + def intervals = [] + return [meta,bam,bai, intervals] + } + .set{deepvariant_input_ch} + + DEEPVARIANT ( + deepvariant_input_ch, + fasta, + fai, + [[:],[]], + [[:],[]] + ) + + + DEEPVARIANT.out.vcf + .join(DEEPVARIANT.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepvariant'] + return [new_meta, vcf, tbi] + } + .set{deepvariant_ch} + } + + // COMBINE GERMLINE VARIANTS + if (params.germline_var_keep != 'clair' | params.germline_var_keep != 'deepvariant' ) { + clairsto_germline_ch + .mix(deepvariant_ch) + .set{combined_germline_ch} + + GERMLINE_CONSENSUS( + combined_germline_ch, + fasta, + fai, + params.germline_var_keep + ) + GERMLINE_CONSENSUS.out.vcf + .join(GERMLINE_CONSENSUS.out.tbi) + .set{germline_vcf} + } + else if (params.germline_var_keep == 'clair') { + clairsto_germline_ch + .set{germline_vcf} + } + else if (params.germline_var_keep == 'deepvariant') { + deepvariant_ch + .set{germline_vcf} + } + // DEEPSOMATIC + if(params.somatic_var_keep != 'clair') { + tumor_bams + .map { meta, tumor_bam, tumor_bai -> + def normal_bam = [] + def normal_bai = [] + return [meta,normal_bam,normal_bai,tumor_bam,tumor_bai] + } + .set{deepsomatic_input_ch} + + DEEPSOMATIC ( + deepsomatic_input_ch, + [[:],[]], + fasta, + fai, + [[:],[]] + ) + DEEPSOMATIC.out.vcf + .join(DEEPSOMATIC.out.vcf_index) + .map{ meta, vcf, tbi -> + def new_meta = meta + [caller:'deepsomatic'] + return [new_meta, vcf, tbi] + } + .set{deepsomatic_ch} + } + // COMBINE SOMATIC VARIATION + if (params.somatic_var_keep != 'clair' | params.somatic_var_keep != 'deepvariant' ) { + clairsto_somatic_ch + .mix(deepsomatic_ch) + .set{combined_somatic_ch} + + SOMATIC_CONSENSUS( + combined_somatic_ch, + fasta, + fai, + params.somatic_var_keep + ) + SOMATIC_CONSENSUS.out.vcf + .join(SOMATIC_CONSENSUS.out.tbi) + .set{somatic_vcf} + } + else if (params.somatic_var_keep == 'clair') { + clairsto_somatic_ch + .set{somatic_vcf} + } + else if (params.somatic_var_keep == 'deepvariant') { + deepvariant_ch + .set{somatic_vcf} + } + + somatic_vcf + .map{ meta, vcf, tbi -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, vcf, tbi] + } + .set{somatic_vcf} + + germline_vcf + .map{ meta, vcf, tbi -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, vcf, tbi] + } + .set{germline_vcf} + emit: + somatic_vcf + germline_vcf + + +} \ No newline at end of file diff --git a/subworkflows/local/tumor_only_happhase.nf b/subworkflows/local/tumor_only_happhase.nf deleted file mode 100644 index e68d4c06..00000000 --- a/subworkflows/local/tumor_only_happhase.nf +++ /dev/null @@ -1,252 +0,0 @@ -include { CLAIRSTO } from '../../modules/local/clairsto/main.nf' -include { VCFSPLIT } from '../../modules/local/vcfsplit/main.nf' -include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' -include { DEEPVARIANT } from '../../subworkflows/nf-core/deepvariant/main.nf' -include { DEEPSOMATIC } from '../../subworkflows/local/deepsomatic.nf' - -include { SMALL_VARIANT_CONSENSUS as GERMLINE_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' -include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../subworkflows/local/small_variant_consensus.nf' - - -workflow TUMOR_ONLY_HAPPHASE { - - take: - tumor_bams - fasta - fai - pon_channel - - main: - - ch_versions = channel.empty() - tumor_only_severus = channel.empty() - somatic_vep = channel.empty() - germline_vep = channel.empty() - - tumor_bams - .map{ meta, bam, bai -> - return [meta, bam, bai, meta.clairSTO_model] - } - .set{ tumor_bams } - // [meta, bam, bai, clairSTO_model] -- ClairS-TO model string appended for CLAIRSTO input - - tumor_bams - .map { meta, bam, bai, _clairSTO_model -> - def intervals = [] - return [meta,bam,bai, intervals] - } - .set{tumor_bams_deepvar} - - tumor_bams - .map { meta, tumor_bam, tumor_bai, _clairSTO_model -> - def normal_bam = [] - def normal_bai = [] - return [meta,normal_bam,normal_bai,tumor_bam,tumor_bai] - } - .set{tumor_bams_deepsomatic} - - DEEPVARIANT ( - tumor_bams_deepvar, - fasta, - fai, - [[:],[]], - [[:],[]] - ) - - DEEPSOMATIC ( - tumor_bams_deepsomatic, - [[:],[]], - fasta, - fai, - [[:],[]] - ) - - // - // MODULE: CLAIRSTO - // - // call somatic/non-somatic variants - // (* not called as germline * just non-somatic) - tumor_bams.combine(pon_channel).set{new_combine} - new_combine.view() - CLAIRSTO ( - new_combine, - fasta, - fai, - ) - - CLAIRSTO.out.indel_vcf - .join(CLAIRSTO.out.snv_vcf) - .set{ clairsto_vcf } - // [meta, indel_vcf, snv_vcf] -- raw ClairS-TO variant calls - - // - // MODULE: VCFSPLIT - // - // ClairSTO gives outputs in snv.vcf and indel.vcf - // reformats them to be in somatic.vcf and nonsomatic.vcf - - VCFSPLIT ( - clairsto_vcf - ) - - VCFSPLIT.out.germline_vcf - .join(VCFSPLIT.out.germline_tbi) - .map { meta, vcf, tbi -> - def new_meta = meta + [caller:'clairs-to'] - return [ new_meta, vcf, tbi] - } - .set{clairsto_germline_ch} - - DEEPVARIANT.out.vcf - .join(DEEPVARIANT.out.vcf_index) - .map{ meta, vcf, tbi -> - def new_meta = meta + [caller:'deepvariant'] - return [new_meta, vcf, tbi] - } - .set{deepvariant_ch} - - clairsto_germline_ch - .mix(deepvariant_ch) - .set{mixed_vcfs} - - GERMLINE_CONSENSUS( - mixed_vcfs, - fasta, - fai, - params.germline_var_keep - ) - - VCFSPLIT.out.somatic_vcf - .join(VCFSPLIT.out.somatic_tbi) - .map { meta, vcf, tbi -> - def new_meta = meta + [caller:'clairs-to'] - return [ new_meta, vcf, tbi] - } - .set{clairsto_somatic_ch} - - DEEPSOMATIC.out.vcf - .join(DEEPSOMATIC.out.vcf_index) - .map{ meta, vcf, tbi -> - def new_meta = meta + [caller:'deepsomatic'] - return [new_meta, vcf, tbi] - } - .set{deepsomatic_ch} - - clairsto_somatic_ch - .mix(deepsomatic_ch) - .set{mixed_somatic_vcfs} - - SOMATIC_CONSENSUS( - mixed_somatic_vcfs, - fasta, - fai, - params.somatic_var_keep - ) - // Add the nonsomatic vcf info - // remove model info - tumor_bams - .join(GERMLINE_CONSENSUS.out.vcf) - .map{ meta, bam, bai, _model, snps -> - def svs = [] - def mods = [] - return[meta, bam, bai, snps, svs, mods] - } - .set{ tumor_bams_germlinevcf } - // [meta, bam, bai, nonsomatic_vcf, [], []] -- non-somatic variants used for phasing; svs and mods are empty placeholders for LONGPHASE_PHASE input - - SOMATIC_CONSENSUS.out.vcf - .map { meta, vcf -> - def extra = [] - return [meta,vcf, extra] - } - .set { somatic_vep } - // [meta, somatic_vcf, []] -- PASS (somatic) variants for VEP annotation - - GERMLINE_CONSENSUS.out.vcf - .map { meta, vcf -> - def extra = [] - return [meta,vcf, extra] - } - .set { germline_vep } - // [meta, germline_vcf, []] -- non-somatic variants (relabelled PASS) for VEP annotation - - // - // MODULES: LONGPHASE_PHASE - // - // Phase tumor bams on nonsomatic vcf - LONGPHASE_PHASE ( - tumor_bams_germlinevcf, - fasta, - fai - ) - - ch_versions = ch_versions.mix(LONGPHASE_PHASE.out.versions) - - // Add phased nonsomatic vcf info - // remove model info - tumor_bams - .join(LONGPHASE_PHASE.out.snv_vcf) - .map { meta, bam, bai, _model, vcf -> - def new_meta = meta + [type: "tumor"] - def svs = [] - def mods = [] - return [new_meta, bam, bai, vcf, svs, mods] - } - .set{ tumor_bams_phasedvcf } - // [meta+{type:"tumor"}, bam, bai, phased_nonsomatic_vcf, [], []] -- type added; svs and mods are empty placeholders for LONGPHASE_HAPLOTAG - - // - // MODULES: LONGPHASE_HAPLOTAG - // - // Haplotag the tumor bams - - LONGPHASE_HAPLOTAG ( - tumor_bams_phasedvcf, - fasta, - fai - ) - - ch_versions = ch_versions.mix(LONGPHASE_HAPLOTAG.out.versions) - - // grab phased bams - LONGPHASE_HAPLOTAG.out.bam - .set{ haplotagged_bams } - // [meta+{type:"tumor"}, haplotagged_bam] - - // - // MODULES: SAMTOOLS_INDEX - // - // index the haplotagged bams - SAMTOOLS_INDEX ( - haplotagged_bams - ) - - // join information and the phased VCF file - haplotagged_bams - .join(SAMTOOLS_INDEX.out.bai) - .join(LONGPHASE_PHASE.out.snv_vcf) - .join(LONGPHASE_PHASE.out.snv_vcf_index) - .map{ meta, hap_bam, hap_bai, vcf, tbi -> - def new_meta = [id: meta.id, - paired_data: meta.paired_data, - platform: meta.platform, - sex: meta.sex, - fiber: meta.fiber, - clair3_model: meta.clair3_model, - clairS_model: meta.clairS_model, - clairSTO_model: meta.clairSTO_model, - kinetics: meta.kinetics] - return [new_meta, hap_bam, hap_bai, [], [], vcf, tbi] - } - .set{ tumor_only_severus } - // [meta, hap_bam, hap_bai, [], [], phased_vcf, phased_tbi] -- normal_bam and normal_bai are [] (tumor-only mode) - - emit: - tumor_only_severus - somatic_vep - germline_vep - versions = ch_versions - -} diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 6f296c9d..714b35b4 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -35,13 +35,15 @@ include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblve // // IMPORT SUBWORKFLOWS // -include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' -include { PREPARE_ANNOTATION } from '../subworkflows/local/prepare_annotation' -include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' -include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' -include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' - - +include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' +include { PREPARE_ANNOTATION } from '../subworkflows/local/prepare_annotation' +include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' +include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' +include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' +include { TUMORONLY_SMALLVAR } from '../subworkflows/local/tumor_only/tumoronly_smallvar' +include { PAIRED_SMALLVAR_SOMATIC } from '../subworkflows/local/paired/paired_smallvar_somatic' +include { PAIRED_SMALLVAR_GERMLINE } from '../subworkflows/local/paired/paired_smallvar_germline' +include { PHASING_HAPLOTYPING } from '../subworkflows/local/phasing_haplotyping' @@ -119,8 +121,6 @@ workflow LRSOMATIC { .of( tuple(pon_files, pon_flags) ) .set { pon_channel } - pon_channel.view() - ch_versions = channel.empty() ch_multiqc_files = channel.empty() @@ -159,9 +159,6 @@ workflow LRSOMATIC { [ meta, bam.flatten()] } .set{ch_samplesheet} - // [meta_full, [bam...]] -- meta now includes: id, paired_data, type, platform, sex, fiber, clair3_model, clairS_model, clairSTO_model, kinetics - - // // SUBWORKFLOW: PREPARE_REFERENCE_FILES @@ -400,44 +397,114 @@ workflow LRSOMATIC { ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) + .set {ch_index_minimap} + + ch_index_minimap .branch { meta, _bams, _bais -> paired: meta.paired_data tumor_only: !meta.paired_data } .set { branched_minimap } + // branched_minimap.paired: [meta, bam, bai] -- one item per sample (tumor AND normal flow separately) // branched_minimap.tumor_only: [meta, bam, bai] - // - // SUBWORKFLOW: TUMOR_NORMAL_HAPPHASE - // - // Phasing/haplotaging/small germline variant calling for tumor-normal samples + TUMORONLY_SMALLVAR( + branched_minimap.tumor_only, + ch_fasta, + ch_fai, + pon_channel + ) + + branched_minimap.paired + .set{paired_ch} + + paired_ch + .branch { meta, _bams, _bais -> + normal: meta.type == "normal" + tumor: meta.type == "tumor" + } + .set{branched_paired_ch} + + branched_paired_ch.normal + .map{ meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, bam, bai] + } + .set{paired_normal_bams} + + branched_paired_ch.tumor + .map{ meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, bam, bai] + } + .join(paired_normal_bams) + .set { somatic_smallvar_input } - TUMOR_NORMAL_HAPPHASE ( - branched_minimap.paired, + PAIRED_SMALLVAR_SOMATIC ( + somatic_smallvar_input, + ch_fasta, + ch_fai + ) + PAIRED_SMALLVAR_GERMLINE ( + branched_paired_ch.normal, ch_fasta, ch_fai, downloaded_clair3_models ) + + PAIRED_SMALLVAR_GERMLINE.out.germline_vcf + .mix(TUMORONLY_SMALLVAR.out.germline_vcf) + .set{ch_germline_vcf} - ch_versions = ch_versions.mix(TUMOR_NORMAL_HAPPHASE.out.versions) - // - // SUBWORKFLOW: TUMOR_ONLY_HAPPHASE - // - // Phasing/haplotagging for tumor only samples + TUMORONLY_SMALLVAR.out.somatic_vcf + .mix(PAIRED_SMALLVAR_SOMATIC.out.somatic_vcf) + .set{ch_somatic_vcf} + ch_index_minimap.view() + ch_germline_vcf.view() - TUMOR_ONLY_HAPPHASE ( - branched_minimap.tumor_only, + PHASING_HAPLOTYPING ( + ch_index_minimap, + ch_germline_vcf, ch_fasta, - ch_fai, - pon_channel + ch_fai ) - germline_vep = TUMOR_NORMAL_HAPPHASE.out.germline_vep.mix(TUMOR_ONLY_HAPPHASE.out.germline_vep) - // [meta, vcf, []] -- germline variants merged from T/N and tumor-only paths - somatic_vep = TUMOR_NORMAL_HAPPHASE.out.somatic_vep.mix(TUMOR_ONLY_HAPPHASE.out.somatic_vep) + + ch_somatic_vcf + .map { meta, vcf, _tbi -> + def extra = [] + return [meta, vcf, extra] + } + .set { somatic_vep } + + ch_germline_vcf + .map { meta, vcf, _tbi -> + def extra = [] + return [meta, vcf, extra] + } + .set { germline_vep } + + /// figure out severus channel structure then test + // [meta, vcf, []] -- somatic variants merged from T/N and tumor-only paths if (!params.skip_vep) { @@ -483,23 +550,34 @@ workflow LRSOMATIC { ) } - ch_versions = ch_versions.mix(TUMOR_ONLY_HAPPHASE.out.versions) - - // Get Severus input channel - TUMOR_NORMAL_HAPPHASE.out.tumor_normal_severus - .mix(TUMOR_ONLY_HAPPHASE.out.tumor_only_severus) - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi -> - return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi] + branched_minimap.tumor_only + .map{ meta, bam, bai -> + def new_meta = meta.subMap('id', + 'paired_data', + 'platform', + 'sex', + 'fiber', + 'clair3_model', + 'clairS_model', + 'clairSTO_model', + 'kinetics') + return[new_meta, bam, bai] } - .set { severus_reformat } - // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, phased_tbi] -- normal_bam/bai are [] for tumor-only - + .map{meta, tumor_bam, tumor_bai-> + def normal_bam = [] + def normal_bai = [] + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai] + } + .mix(somatic_smallvar_input) + .join(PHASING_HAPLOTYPING.out.phased_germline_vcf) + .set{severus_input} + // // MODULE: SEVERUS // SEVERUS ( - severus_reformat, + severus_input, [[:], params.bed_file, params.pon_file] ) From ad88f88c160fff5cb8e7e4bfb213f24ec5b3b832 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 09:19:26 +0100 Subject: [PATCH 153/183] somatic phasing --- conf/modules.config | 18 ++- log.txt | 0 subworkflows/local/phasing_haplotyping.nf | 113 ++++++++++++---- tests/default.nf.test.snap | 154 +++++++++++++++------- workflows/lrsomatic.nf | 6 +- 5 files changed, 213 insertions(+), 78 deletions(-) delete mode 100644 log.txt diff --git a/conf/modules.config b/conf/modules.config index 397e73aa..3b7bd7e9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -317,7 +317,21 @@ process { // Phasing processes // - withName: '.*:LONGPHASE_PHASE' { + withName: '.*:LONGPHASE_PHASE_GERMLINE' { + ext.prefix = { "germline_smallvariants" } + ext.args = { + [ + meta.platform == 'pb' ? '--pb' : '--ont', + "--indels", + ].join(' ').trim() + } + publishDir = [ + path: { "${params.outdir}/${meta.id}/variants/phased" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: '.*:LONGPHASE_PHASE_SOMATIC' { ext.prefix = { "somatic_smallvariants" } ext.args = { [ @@ -331,7 +345,7 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: '.*:LONGPHASE_HAPLOTAG' { + withName: '.*:LONGPHASE_HAPLOTAG*' { ext.prefix = { "${meta.id}_${meta.type}" } publishDir = [ path: { "${params.outdir}/${meta.id}/bamfiles" }, diff --git a/log.txt b/log.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/subworkflows/local/phasing_haplotyping.nf b/subworkflows/local/phasing_haplotyping.nf index 272b5ef0..b543e3cc 100644 --- a/subworkflows/local/phasing_haplotyping.nf +++ b/subworkflows/local/phasing_haplotyping.nf @@ -1,12 +1,19 @@ // Import modules -include { LONGPHASE_PHASE } from '../../modules/nf-core/longphase/phase/main.nf' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' -include { LONGPHASE_MODCALL } from '../../modules/local/longphase/modcall/main.nf' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { LONGPHASE_PHASE as LONGPHASE_PHASE_GERMLINE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_PHASE as LONGPHASE_PHASE_SOMATIC } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { LONGPHASE_MODCALL as LONGPHASE_MODCALL_GERMLINE } from '../../modules/local/longphase/modcall/main.nf' +include { LONGPHASE_MODCALL as LONGPHASE_MODCALL_SOMATIC } from '../../modules/local/longphase/modcall/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' +include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort/main' + + workflow PHASING_HAPLOTYPING { take: tumor_normal_bams // [meta, bam, bai] germline_vcf + somatic_vcf fasta fai @@ -77,14 +84,23 @@ workflow PHASING_HAPLOTYPING { tumor_only_ch .mix(paired_normal_ch) - .set { longphase_modcall_input_ch } + .set { normal_bams_w_tumoronly_ch } + tumor_only_ch + .mix(paired_tumor_ch) + .set{ tumor_bams_ch} // MODCALL if (!params.skip_modcall) { - LONGPHASE_MODCALL ( - longphase_modcall_input_ch, + LONGPHASE_MODCALL_GERMLINE ( + normal_bams_w_tumoronly_ch, + fasta, + fai + ) + + LONGPHASE_MODCALL_SOMATIC ( + tumor_bams_ch, fasta, fai ) @@ -92,33 +108,78 @@ workflow PHASING_HAPLOTYPING { } // PHASING if (!params.skip_modcall) { - longphase_modcall_input_ch + normal_bams_w_tumoronly_ch .join(germline_vcf) - .join(LONGPHASE_MODCALL.out.mod_vcf) + .join(LONGPHASE_MODCALL_GERMLINE.out.mod_vcf) .map { meta, bam, bai, vcf, _tbi, mods-> def svs = [] return [ meta, bam, bai, vcf, svs, mods ] } - .set{ longphase_phase_input_ch } + .set{ longphase_phase_germline_input_ch } + + germline_vcf + .join(somatic_vcf) + .map { meta, germline_vcf, germline_tbi, somatic_vcf, somatic_tbi -> + def vcfs = [somatic_vcf, germline_vcf] + def tbis = [somatic_tbi, germline_tbi] + return [ meta, vcfs, tbis] + } + .set{germline_somatic_vcfs} + BCFTOOLS_CONCAT(germline_somatic_vcfs) + BCFTOOLS_CONCAT.out.vcf + .set{concat_out} + BCFTOOLS_SORT(concat_out) + BCFTOOLS_SORT.out.vcf + .set{germline_somatic_vcfs} + + tumor_bams_ch + .join(germline_somatic_vcfs) + .join(LONGPHASE_MODCALL_SOMATIC.out.mod_vcf) + .map { meta, bam, bai, vcf, mods-> + def svs = [] + return [ meta, bam, bai, vcf, svs, mods ] + } + .set{ longphase_phase_somatic_input_ch } } else { - longphase_modcall_input_ch + normal_bams_w_tumoronly_ch .join(germline_vcf) - .map { meta, bam, bai, vcf, _tbi-> + .map { meta, bam, bai, vcf, _tbi -> def svs = [] def mods = [] return [ meta, bam, bai, vcf, svs, mods ] } - .set{ longphase_phase_input_ch } + .set{ longphase_phase_germline_input_ch } + + tumor_bams_ch + .join(germline_somatic_vcfs) + .join(LONGPHASE_MODCALL_SOMATIC.out.mod_vcf) + .map { meta, bam, bai, vcf -> + def svs = [] + def mods = [] + return [ meta, bam, bai, vcf, svs, mods ] + } + .set{ longphase_phase_somatic_input_ch } } - LONGPHASE_PHASE ( - longphase_phase_input_ch, + + LONGPHASE_PHASE_GERMLINE ( + longphase_phase_germline_input_ch, fasta, fai ) - LONGPHASE_PHASE.out.snv_vcf - .join(LONGPHASE_PHASE.out.snv_vcf_index) + LONGPHASE_PHASE_GERMLINE.out.snv_vcf + .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf_index) + .set{ phased_germline_vcf } + + LONGPHASE_PHASE_SOMATIC ( + longphase_phase_somatic_input_ch, + fasta, + fai + ) + + LONGPHASE_PHASE_SOMATIC.out.snv_vcf + .join(LONGPHASE_PHASE_SOMATIC.out.snv_vcf_index) .set{ phased_germline_vcf } // HAPLOTAGING @@ -127,7 +188,7 @@ workflow PHASING_HAPLOTYPING { if(!params.skip_modcall) { - LONGPHASE_MODCALL.out.mod_vcf + LONGPHASE_MODCALL_GERMLINE.out.mod_vcf .map { meta, mods -> def new_meta = meta.subMap('id', 'paired_data', @@ -143,7 +204,7 @@ workflow PHASING_HAPLOTYPING { .set{modcall_vcf_ch} tumor_only_ch - .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .join(modcall_vcf_ch) .map { meta, bam, bai, vcf, mods -> def new_meta = meta + [type : "tumor"] @@ -153,7 +214,7 @@ workflow PHASING_HAPLOTYPING { .set{ tumor_only_ch } paired_tumor_ch - .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .join(modcall_vcf_ch) .map { meta, bam, bai, vcf, mods -> def new_meta = meta + [type : "tumor"] @@ -163,7 +224,7 @@ workflow PHASING_HAPLOTYPING { .set{ paired_tumor_ch } paired_normal_ch - .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .join(modcall_vcf_ch) .map { meta, bam, bai, vcf, mods -> def new_meta = meta + [type : "normal"] @@ -176,7 +237,7 @@ workflow PHASING_HAPLOTYPING { else { tumor_only_ch - .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .map { meta, bam, bai, vcf -> def new_meta = meta + [type : "tumor"] def svs = [] @@ -186,7 +247,7 @@ workflow PHASING_HAPLOTYPING { .set{ tumor_only_ch } paired_tumor_ch - .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .map { meta, bam, bai, vcf -> def new_meta = meta + [type : "tumor"] def svs = [] @@ -196,7 +257,7 @@ workflow PHASING_HAPLOTYPING { .set{ paired_tumor_ch } paired_normal_ch - .join(LONGPHASE_PHASE.out.snv_vcf) + .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .map { meta, bam, bai, vcf -> def new_meta = meta + [type : "normal"] def svs = [] @@ -208,8 +269,8 @@ workflow PHASING_HAPLOTYPING { } tumor_only_ch - .join(paired_tumor_ch) - .join(paired_normal_ch) + .mix(paired_tumor_ch) + .mix(paired_normal_ch) .set {longphase_haplotag_input_ch} LONGPHASE_HAPLOTAG ( diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index bd36bc15..778a5df1 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -2,9 +2,21 @@ "-profile test": { "content": [ { + "BCFTOOLS_ANNOTATE": { + "bcftools": 1.22 + }, "BCFTOOLS_CONCAT": { "bcftools": 1.22 }, + "BCFTOOLS_ISEC": { + "bcftools": 1.22 + }, + "BCFTOOLS_NORM": { + "bcftools": 1.22 + }, + "BCFTOOLS_QUERY": { + "bcftools": 1.22 + }, "BCFTOOLS_SORT": { "bcftools": 1.22 }, @@ -23,18 +35,29 @@ "CRAMINO_PRE": { "cramino": "1.3.0" }, + "DEEPSOMATIC_CALLVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_MAKEEXAMPLES": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_POSTPROCESSVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPVARIANT_CALLVARIANTS": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_MAKEEXAMPLES": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_POSTPROCESSVARIANTS": { + "deepvariant": "1.9.0" + }, "GERMLINE_VEP": { "ensemblvep": 115.2, "perl-math-cdf": 0.1, "tabix": 1.21 }, - "LONGPHASE_HAPLOTAG": { - "longphase": 2.0 - }, - "LONGPHASE_PHASE": { - "longphase": 2.0, - "tabix": "1.22.1" - }, "METAEXTRACT": { "samtools": 1.21 }, @@ -53,9 +76,6 @@ "SAMTOOLS_IDXSTATS": { "samtools": "1.22.1" }, - "SAMTOOLS_INDEX": { - "samtools": "1.22.1" - }, "SAMTOOLS_STATS": { "samtools": "1.22.1" }, @@ -89,6 +109,10 @@ } }, [ + "longphase", + "longphase/sample1.vcf", + "longphase/sample2.vcf", + "longphase/sample3.vcf", "multiqc", "multiqc/multiqc_data", "multiqc/multiqc_data/llms-full.txt", @@ -164,11 +188,6 @@ "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", "sample1", - "sample1/bamfiles", - "sample1/bamfiles/sample1_normal.bam", - "sample1/bamfiles/sample1_normal.bam.bai", - "sample1/bamfiles/sample1_tumor.bam", - "sample1/bamfiles/sample1_tumor.bam.bai", "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", @@ -241,9 +260,21 @@ "sample1/variants/clairs/indel.vcf.gz.tbi", "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/deepsomatic", + "sample1/variants/deepsomatic/sample1.g.vcf.gz", + "sample1/variants/deepsomatic/sample1.g.vcf.gz.tbi", + "sample1/variants/deepsomatic/sample1.vcf.gz", + "sample1/variants/deepsomatic/sample1.vcf.gz.tbi", + "sample1/variants/deepvariant", + "sample1/variants/deepvariant/sample1.g.vcf.gz", + "sample1/variants/deepvariant/sample1.g.vcf.gz.tbi", + "sample1/variants/deepvariant/sample1.vcf.gz", + "sample1/variants/deepvariant/sample1.vcf.gz.tbi", "sample1/variants/phased", "sample1/variants/phased/somatic_smallvariants.vcf.gz", "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz", + "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", "sample1/variants/severus/all_SVs/severus_all.vcf.gz", @@ -267,11 +298,6 @@ "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample2", - "sample2/bamfiles", - "sample2/bamfiles/sample2_normal.bam", - "sample2/bamfiles/sample2_normal.bam.bai", - "sample2/bamfiles/sample2_tumor.bam", - "sample2/bamfiles/sample2_tumor.bam.bai", "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", @@ -344,9 +370,21 @@ "sample2/variants/clairs/indel.vcf.gz.tbi", "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/deepsomatic", + "sample2/variants/deepsomatic/sample2.g.vcf.gz", + "sample2/variants/deepsomatic/sample2.g.vcf.gz.tbi", + "sample2/variants/deepsomatic/sample2.vcf.gz", + "sample2/variants/deepsomatic/sample2.vcf.gz.tbi", + "sample2/variants/deepvariant", + "sample2/variants/deepvariant/sample2.g.vcf.gz", + "sample2/variants/deepvariant/sample2.g.vcf.gz.tbi", + "sample2/variants/deepvariant/sample2.vcf.gz", + "sample2/variants/deepvariant/sample2.vcf.gz.tbi", "sample2/variants/phased", "sample2/variants/phased/somatic_smallvariants.vcf.gz", "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz", + "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", "sample2/variants/severus/all_SVs/severus_all.vcf.gz", @@ -370,9 +408,6 @@ "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample3", - "sample3/bamfiles", - "sample3/bamfiles/sample3_tumor.bam", - "sample3/bamfiles/sample3_tumor.bam.bai", "sample3/qc", "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", @@ -415,9 +450,21 @@ "sample3/variants/clairsto/snv.vcf.gz.tbi", "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/deepsomatic", + "sample3/variants/deepsomatic/sample3.g.vcf.gz", + "sample3/variants/deepsomatic/sample3.g.vcf.gz.tbi", + "sample3/variants/deepsomatic/sample3.vcf.gz", + "sample3/variants/deepsomatic/sample3.vcf.gz.tbi", + "sample3/variants/deepvariant", + "sample3/variants/deepvariant/sample3.g.vcf.gz", + "sample3/variants/deepvariant/sample3.g.vcf.gz.tbi", + "sample3/variants/deepvariant/sample3.vcf.gz", + "sample3/variants/deepvariant/sample3.vcf.gz.tbi", "sample3/variants/phased", "sample3/variants/phased/somatic_smallvariants.vcf.gz", "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz", + "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample3/variants/severus", "sample3/variants/severus/all_SVs", "sample3/variants/severus/all_SVs/severus_all.vcf.gz", @@ -442,43 +489,60 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,58854f8d427538288322ac20df574fe1", - "sample1_normal.bam.bai:md5,398a33445ef807ebc83c851c3f3c0df6", - "sample1_tumor.bam:md5,0e2ebc65d456e9aa614f5e4714ea2f97", - "sample1_tumor.bam.bai:md5,b92667a80d721b8d515ad099e4f97925", + "sample1.vcf:md5,26cef7c7c05a6d2e076aeb0e0bef7fe2", + "sample2.vcf:md5,e50e314896682852a973f1f9236f908c", + "sample3.vcf:md5,009e8d6ef6736c8f7760d3cbbbf91f73", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", - "sample1.stats:md5,5a76f92088d36f8e93d72351e521b59b", + "sample1.stats:md5,70fabbdc07dec0479b3fc7dcec344054", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", - "sample1.stats:md5,8cec99bd9c1ba4ee22619b66d4fec02a", - "breakpoints_double.csv:md5,fd92fe40bc0ab3b836dedc395b80d6e2", + "sample1.stats:md5,5012c82d3d3ca60ffdd2fb970f772566", + "sample1.g.vcf.gz:md5,e9c0e1c7f90d334faccab6b854611643", + "sample1.g.vcf.gz.tbi:md5,6110e6f6ab72dbc0bee604afe690893f", + "sample1.vcf.gz:md5,92c0fa9016c3d8b192eb382fd6a81199", + "sample1.vcf.gz.tbi:md5,04e82577dc57f80b9db25897389364b2", + "sample1.g.vcf.gz:md5,5ed06f35ccecf7aadbec54873dc07e64", + "sample1.g.vcf.gz.tbi:md5,ca628ef368d34a7a6c77098a4c4bdf36", + "sample1.vcf.gz:md5,ad971a535d2b8014fabdabe72995a5db", + "sample1.vcf.gz.tbi:md5,65de5caace8d4312afa707c3bfd6fa45", + "breakpoints_double.csv:md5,d63f058075bfe791248954ca2ee6c4fb", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", - "sample2_normal.bam:md5,c9b1ac8d2faec01ecb178f0b351af69c", - "sample2_normal.bam.bai:md5,b8f81d2703b1d06128e23b860a9fd635", - "sample2_tumor.bam:md5,2ba9456992d944b63d63e067d5e3bc56", - "sample2_tumor.bam.bai:md5,8342f0fbbc8ce4f4c79aa42c7804df9d", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", - "sample2.stats:md5,9afe66549bed997cce97dfa11c0f0cca", + "sample2.stats:md5,87cb6e9adf8a133244e8b331be43bb14", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", - "sample2.stats:md5,7cbbff1faaf2e030470a8c1e69434b48", - "breakpoints_double.csv:md5,d3f0957887406fb79f9dcc3707324d8c", + "sample2.stats:md5,1e044857eeefb284fda88ee58ff7a04a", + "sample2.g.vcf.gz:md5,1cb2d7bf929e4e87a8591c11bf5034c7", + "sample2.g.vcf.gz.tbi:md5,67674d00b976135fe29f318067a01f7a", + "sample2.vcf.gz:md5,f9d6266ee49c2544dc28eef0cdd9dcae", + "sample2.vcf.gz.tbi:md5,433ecd219947787d00dd0fada6307661", + "sample2.g.vcf.gz:md5,7998d15ce582ec94e86568e3fae654f9", + "sample2.g.vcf.gz.tbi:md5,9498e3266900eee2448ff05b0bce87c0", + "sample2.vcf.gz:md5,33330d8444a1774864883b33e1e2235c", + "sample2.vcf.gz.tbi:md5,384b8b5ea7c1559b464031f8e0863532", + "breakpoints_double.csv:md5,a68d7fc9c7a7cb2f31e73189c5412f7b", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", - "sample3_tumor.bam:md5,7107cfc84eafca8f1ae918e775111090", - "sample3_tumor.bam.bai:md5,d2855691846361e01999895250c835e4", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", - "sample3.stats:md5,6825d4e497aef80ed7160afbef5076d9", - "breakpoints_double.csv:md5,41bb00e81dd6c319c13e754fa853ca68", + "sample3.stats:md5,d7a8552a8a41a217954a0c825d468a60", + "sample3.g.vcf.gz:md5,2392430290a5d6a9a43b359faebc025b", + "sample3.g.vcf.gz.tbi:md5,4349b51070a4274707b94ef9b4d8c0bd", + "sample3.vcf.gz:md5,ee4f7a5bbd471c1370accf888b8262c0", + "sample3.vcf.gz.tbi:md5,944349ec46ecc95bab7db2f6848d0c36", + "sample3.g.vcf.gz:md5,64adc407ef2434254e76763b72c67b08", + "sample3.g.vcf.gz.tbi:md5,ac0397f7a840cf618d56f097defba878", + "sample3.vcf.gz:md5,9c52a803d796157a08b565c653d4685c", + "sample3.vcf.gz.tbi:md5,f0b3599e4281a6f3bbb8bc408740e58e", + "breakpoints_double.csv:md5,46e03bf2d67aa736b599f00fe7f01e06", "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" ] ], - "timestamp": "2026-03-13T14:26:30.747596368", "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.0" - } + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-03-23T16:14:08.943804849" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 714b35b4..add2d641 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -38,8 +38,6 @@ include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblve include { PREPARE_REFERENCE_FILES } from '../subworkflows/local/prepare_reference_files' include { PREPARE_ANNOTATION } from '../subworkflows/local/prepare_annotation' include { BAM_STATS_SAMTOOLS } from '../subworkflows/nf-core/bam_stats_samtools/main' -include { TUMOR_NORMAL_HAPPHASE } from '../subworkflows/local/tumor_normal_happhase' -include { TUMOR_ONLY_HAPPHASE } from '../subworkflows/local/tumor_only_happhase' include { TUMORONLY_SMALLVAR } from '../subworkflows/local/tumor_only/tumoronly_smallvar' include { PAIRED_SMALLVAR_SOMATIC } from '../subworkflows/local/paired/paired_smallvar_somatic' include { PAIRED_SMALLVAR_GERMLINE } from '../subworkflows/local/paired/paired_smallvar_germline' @@ -478,12 +476,10 @@ workflow LRSOMATIC { .mix(PAIRED_SMALLVAR_SOMATIC.out.somatic_vcf) .set{ch_somatic_vcf} - ch_index_minimap.view() - ch_germline_vcf.view() - PHASING_HAPLOTYPING ( ch_index_minimap, ch_germline_vcf, + ch_somatic_vcf, ch_fasta, ch_fai ) From 7e414e01403eef4b7db03059faf3db0a310db266 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 12:50:41 +0100 Subject: [PATCH 154/183] gpu optional flag, and snap updates --- .gitignore | 2 +- conf/base.config | 8 +- conf/modules.config | 21 +++-- modules.json | 26 ++++-- modules/local/clair3/main.nf | 2 +- .../local/deepsomatic/callvariants/main.nf | 2 +- modules/local/fibertoolsrs/fire/main.nf | 2 +- .../local/fibertoolsrs/nucleosomes/main.nf | 2 +- modules/local/fibertoolsrs/predictm6a/main.nf | 2 +- .../nf-core/bcftools/isec/bcftools-isec.diff | 36 ++++++++ .../bcftools/merge/bcftools-merge.diff | 21 +++++ .../bcftools/query/bcftools-query.diff | 30 +++++++ .../deepvariant-callvariants.diff | 18 ++++ .../nf-core/deepvariant/callvariants/main.nf | 2 +- .../deepvariant-makeexamples.diff | 18 ++++ .../deepvariant-postprocessvariants.diff | 18 ++++ modules/nf-core/severus/main.nf | 8 +- nextflow.config | 1 + nextflow_schema.json | 7 +- ro-crate-metadata.json | 2 +- subworkflows/local/deepsomatic.nf | 2 +- .../local/paired/paired_smallvar_germline.nf | 2 +- .../local/paired/paired_smallvar_somatic.nf | 6 +- subworkflows/local/phasing_haplotyping.nf | 56 ++++++------ subworkflows/local/small_variant_consensus.nf | 12 +-- .../local/tumor_only/tumoronly_smallvar.nf | 10 +-- .../nf-core/deepvariant/deepvariant.diff | 23 +++++ tests/default.nf.test.snap | 85 ++++++++++++++----- workflows/lrsomatic.nf | 16 ++-- 29 files changed, 333 insertions(+), 107 deletions(-) create mode 100644 modules/nf-core/bcftools/isec/bcftools-isec.diff create mode 100644 modules/nf-core/bcftools/merge/bcftools-merge.diff create mode 100644 modules/nf-core/bcftools/query/bcftools-query.diff create mode 100644 modules/nf-core/deepvariant/callvariants/deepvariant-callvariants.diff create mode 100644 modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff create mode 100644 modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff create mode 100644 subworkflows/nf-core/deepvariant/deepvariant.diff diff --git a/.gitignore b/.gitignore index 8be7152c..c5c144e3 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,4 @@ testing* null/ .nf-test .nf-test.log -out/ \ No newline at end of file +out/ diff --git a/conf/base.config b/conf/base.config index 79e7c3ee..cd23b577 100644 --- a/conf/base.config +++ b/conf/base.config @@ -27,8 +27,8 @@ process { // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors withLabel: process_gpu { - ext.use_gpu = { workflow.profile.contains('gpu') } - accelerator = { workflow.profile.contains('gpu') ? 1 : null } + ext.use_gpu = { params.use_gpu as boolean } + accelerator = { (params.use_gpu as boolean) ? 1 : null } } withLabel:process_single { cpus = { 1 } @@ -68,8 +68,4 @@ process { errorStrategy = 'retry' maxRetries = 2 } - withLabel: process_gpu { - ext.use_gpu = { workflow.profile.contains('gpu') } - accelerator = { workflow.profile.contains('gpu') ? 1 : null } - } } diff --git a/conf/modules.config b/conf/modules.config index 3b7bd7e9..d9dac1fa 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -195,17 +195,19 @@ process { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/deepsomatic" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> + (filename.equals('versions.yml') || filename.endsWith('.g.vcf.gz') || filename.endsWith('.g.vcf.gz.tbi')) ? null : filename + } ] } withName: '.*DEEPSOMATIC_CALLVARIANTS' { ext.args = { - meta.platform == 'pb' - ? (meta.paired_data - ? "--checkpoint '/opt/models/deepsomatic/pacbio'" - : "--checkpoint '/opt/models/deepsomatic/pacbio_tumor_only'" ) - : (meta.paired_data + meta.platform == 'pb' + ? (meta.paired_data + ? "--checkpoint '/opt/models/deepsomatic/pacbio'" + : "--checkpoint '/opt/models/deepsomatic/pacbio_tumor_only'" ) + : (meta.paired_data ? "--checkpoint '/opt/models/deepsomatic/ont'" : "--checkpoint '/opt/models/deepsomatic/ont_tumor_only'") } @@ -213,7 +215,7 @@ process { enabled : false ] } - + withName: '.*:UNZIP_.*' { publishDir = [ @@ -353,6 +355,11 @@ process { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: '.*:LONGPHASE_MODCALL.*' { + publishDir = [ + enabled: false + ] + } // // Structural variant calling processes diff --git a/modules.json b/modules.json index ce434e66..c0168555 100644 --- a/modules.json +++ b/modules.json @@ -24,12 +24,14 @@ "bcftools/isec": { "branch": "master", "git_sha": "3b2c3559699a7bca6a7c2b220695a072e030e17d", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/bcftools/isec/bcftools-isec.diff" }, "bcftools/merge": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/bcftools/merge/bcftools-merge.diff" }, "bcftools/norm": { "branch": "master", @@ -39,7 +41,8 @@ "bcftools/query": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/bcftools/query/bcftools-query.diff" }, "bcftools/sort": { "branch": "master", @@ -50,17 +53,20 @@ "deepvariant/callvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["deepvariant"] + "installed_by": ["deepvariant"], + "patch": "modules/nf-core/deepvariant/callvariants/deepvariant-callvariants.diff" }, "deepvariant/makeexamples": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["deepvariant"] + "installed_by": ["deepvariant"], + "patch": "modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff" }, "deepvariant/postprocessvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["deepvariant"] + "installed_by": ["deepvariant"], + "patch": "modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff" }, "ensemblvep/download": { "branch": "master", @@ -110,6 +116,11 @@ "git_sha": "2c73cc8fa92cf48de3da0b643fdf357a8a290b36", "installed_by": ["modules"] }, + "nanoplot": { + "branch": "master", + "git_sha": "682f789f93070bd047868300dd018faf3d434e7c", + "installed_by": ["modules"] + }, "pigz/uncompress": { "branch": "master", "git_sha": "f84336b7fa91a65aa61d215b8c109fbb8e4b4ac6", @@ -179,7 +190,8 @@ "deepvariant": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["subworkflows"] + "installed_by": ["subworkflows"], + "patch": "subworkflows/nf-core/deepvariant/deepvariant.diff" }, "utils_nextflow_pipeline": { "branch": "master", diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index ab398bab..f53b8b58 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -1,7 +1,7 @@ process CLAIR3 { tag "$meta.id" label 'process_very_high' - label 'process_gpu' + label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/deepsomatic/callvariants/main.nf b/modules/local/deepsomatic/callvariants/main.nf index f796de51..4906b954 100644 --- a/modules/local/deepsomatic/callvariants/main.nf +++ b/modules/local/deepsomatic/callvariants/main.nf @@ -1,7 +1,7 @@ process DEEPSOMATIC_CALLVARIANTS { tag "$meta.id" label 'process_high' - label 'process_gpu' + label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" //Conda is not supported at the moment container "docker.io/google/deepsomatic:1.7.0" diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index 2d84e7e0..e78bf544 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -2,7 +2,7 @@ process FIBERTOOLSRS_FIRE { tag "$meta.id" label 'process_very_high' label 'process_high_memory' - label 'process_gpu' + label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 7462cd68..2357d638 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -2,7 +2,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { tag "$meta.id" label 'process_very_high' label 'process_high_memory' - label 'process_gpu' + label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 0dabcd20..0ac25676 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -2,7 +2,7 @@ process FIBERTOOLSRS_PREDICTM6A { tag "$meta.id" label 'process_very_high' label 'process_high_memory' - label 'process_gpu' + label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/nf-core/bcftools/isec/bcftools-isec.diff b/modules/nf-core/bcftools/isec/bcftools-isec.diff new file mode 100644 index 00000000..36911c50 --- /dev/null +++ b/modules/nf-core/bcftools/isec/bcftools-isec.diff @@ -0,0 +1,36 @@ +Changes in component 'nf-core/bcftools/isec' +'modules/nf-core/bcftools/isec/meta.yml' is unchanged +Changes in 'bcftools/isec/main.nf': +--- modules/nf-core/bcftools/isec/main.nf ++++ modules/nf-core/bcftools/isec/main.nf +@@ -12,6 +12,15 @@ + + output: + tuple val(meta), path("${prefix}", type: "dir"), emit: results ++ tuple val(meta), path("${prefix}/0002.vcf.gz"), emit: deepvar_consensus_vcf ++ tuple val(meta), path("${prefix}/0002.vcf.gz.tbi"), emit: deepvar_consensus_tbi ++ tuple val(meta), path("${prefix}/0003.vcf.gz"), emit: clair_consensus_vcf ++ tuple val(meta), path("${prefix}/0003.vcf.gz.tbi"), emit: clair_consensus_tbi ++ tuple val(meta), path("${prefix}/0001.vcf.gz"), emit: clair_private_vcf ++ tuple val(meta), path("${prefix}/0001.vcf.gz.tbi"), emit: clair_private_tbi ++ tuple val(meta), path("${prefix}/0000.vcf.gz"), emit: deepvar_private_vcf ++ tuple val(meta), path("${prefix}/0000.vcf.gz.tbi"), emit: deepvar_private_tbi ++ + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: +@@ -30,7 +39,7 @@ + ${targets_file_args} \\ + ${regions_file_args} \\ + -p ${prefix} \\ +- ${vcf_files} \\ ++ ${vcf_files} + """ + + stub: + +'modules/nf-core/bcftools/isec/environment.yml' is unchanged +'modules/nf-core/bcftools/isec/tests/main.nf.test' is unchanged +'modules/nf-core/bcftools/isec/tests/main.nf.test.snap' is unchanged +'modules/nf-core/bcftools/isec/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/bcftools/merge/bcftools-merge.diff b/modules/nf-core/bcftools/merge/bcftools-merge.diff new file mode 100644 index 00000000..6a8812db --- /dev/null +++ b/modules/nf-core/bcftools/merge/bcftools-merge.diff @@ -0,0 +1,21 @@ +Changes in component 'nf-core/bcftools/merge' +'modules/nf-core/bcftools/merge/meta.yml' is unchanged +Changes in 'bcftools/merge/main.nf': +--- modules/nf-core/bcftools/merge/main.nf ++++ modules/nf-core/bcftools/merge/main.nf +@@ -9,7 +9,8 @@ + + input: + tuple val(meta), path(vcfs), path(tbis), path(bed) +- tuple val(meta2), path(fasta), path(fai) ++ tuple val(meta2), path(fasta) ++ tuple val(meta3), path(fai) + + output: + tuple val(meta), path("*.{bcf,vcf}{,.gz}"), emit: vcf + +'modules/nf-core/bcftools/merge/environment.yml' is unchanged +'modules/nf-core/bcftools/merge/tests/main.nf.test' is unchanged +'modules/nf-core/bcftools/merge/tests/main.nf.test.snap' is unchanged +'modules/nf-core/bcftools/merge/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/bcftools/query/bcftools-query.diff b/modules/nf-core/bcftools/query/bcftools-query.diff new file mode 100644 index 00000000..12ebaeaa --- /dev/null +++ b/modules/nf-core/bcftools/query/bcftools-query.diff @@ -0,0 +1,30 @@ +Changes in component 'nf-core/bcftools/query' +'modules/nf-core/bcftools/query/meta.yml' is unchanged +Changes in 'bcftools/query/main.nf': +--- modules/nf-core/bcftools/query/main.nf ++++ modules/nf-core/bcftools/query/main.nf +@@ -14,7 +14,8 @@ + path samples + + output: +- tuple val(meta), path("*.${suffix}"), emit: output ++ tuple val(meta), path("*.${suffix}.gz"), emit: output ++ tuple val(meta), path("*.${suffix}.gz.tbi"), emit: index + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: +@@ -35,6 +36,8 @@ + ${args} \\ + ${vcf} \\ + > ${prefix}.${suffix} ++ bgzip -c ${prefix}.${suffix} > ${prefix}.${suffix}.gz ++ tabix -s 1 -b 2 -e 2 ${prefix}.${suffix}.gz + """ + + stub: + +'modules/nf-core/bcftools/query/environment.yml' is unchanged +'modules/nf-core/bcftools/query/tests/main.nf.test' is unchanged +'modules/nf-core/bcftools/query/tests/main.nf.test.snap' is unchanged +'modules/nf-core/bcftools/query/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/deepvariant/callvariants/deepvariant-callvariants.diff b/modules/nf-core/deepvariant/callvariants/deepvariant-callvariants.diff new file mode 100644 index 00000000..e4aa7b97 --- /dev/null +++ b/modules/nf-core/deepvariant/callvariants/deepvariant-callvariants.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/deepvariant/callvariants' +'modules/nf-core/deepvariant/callvariants/meta.yml' is unchanged +Changes in 'deepvariant/callvariants/main.nf': +--- modules/nf-core/deepvariant/callvariants/main.nf ++++ modules/nf-core/deepvariant/callvariants/main.nf +@@ -2,6 +2,7 @@ + process DEEPVARIANT_CALLVARIANTS { + tag "$meta.id" + label 'process_high' ++ label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" + +'modules/nf-core/deepvariant/callvariants/tests/main.nf.test' is unchanged +'modules/nf-core/deepvariant/callvariants/tests/main.nf.test.snap' is unchanged +'modules/nf-core/deepvariant/callvariants/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/deepvariant/callvariants/main.nf b/modules/nf-core/deepvariant/callvariants/main.nf index 251f4c73..d9218062 100644 --- a/modules/nf-core/deepvariant/callvariants/main.nf +++ b/modules/nf-core/deepvariant/callvariants/main.nf @@ -2,7 +2,7 @@ process DEEPVARIANT_CALLVARIANTS { tag "$meta.id" label 'process_high' - label 'process_gpu' + label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" //Conda is not supported at the moment container "docker.io/google/deepvariant:1.9.0" diff --git a/modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff b/modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff new file mode 100644 index 00000000..8e5312b2 --- /dev/null +++ b/modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/deepvariant/makeexamples' +'modules/nf-core/deepvariant/makeexamples/meta.yml' is unchanged +Changes in 'deepvariant/makeexamples/main.nf': +--- modules/nf-core/deepvariant/makeexamples/main.nf ++++ modules/nf-core/deepvariant/makeexamples/main.nf +@@ -36,6 +36,7 @@ + --mode calling \\ + --ref "${fasta}" \\ + --reads "${input}" \\ ++ --sample_name ${prefix} \\ + --examples "./${prefix}.examples.tfrecord@${task.cpus}.gz" \\ + --gvcf "./${prefix}.gvcf.tfrecord@${task.cpus}.gz" \\ + ${regions} \\ + +'modules/nf-core/deepvariant/makeexamples/tests/main.nf.test' is unchanged +'modules/nf-core/deepvariant/makeexamples/tests/main.nf.test.snap' is unchanged +'modules/nf-core/deepvariant/makeexamples/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff b/modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff new file mode 100644 index 00000000..c7acc49a --- /dev/null +++ b/modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff @@ -0,0 +1,18 @@ +Changes in component 'nf-core/deepvariant/postprocessvariants' +'modules/nf-core/deepvariant/postprocessvariants/meta.yml' is unchanged +Changes in 'deepvariant/postprocessvariants/main.nf': +--- modules/nf-core/deepvariant/postprocessvariants/main.nf ++++ modules/nf-core/deepvariant/postprocessvariants/main.nf +@@ -64,6 +64,7 @@ + --outfile "${prefix}.vcf.gz" \\ + --nonvariant_site_tfrecord_path "${gvcf_tfrecords_logical_name}" \\ + --gvcf_outfile "${prefix}.g.vcf.gz" \\ ++ --sample_name ${prefix} \\ + ${regions} \\ + ${small_model_arg} \\ + --cpus $task.cpus + +'modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test' is unchanged +'modules/nf-core/deepvariant/postprocessvariants/tests/main.nf.test.snap' is unchanged +'modules/nf-core/deepvariant/postprocessvariants/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/severus/main.nf b/modules/nf-core/severus/main.nf index f191fd0b..95fe7912 100644 --- a/modules/nf-core/severus/main.nf +++ b/modules/nf-core/severus/main.nf @@ -20,12 +20,12 @@ process SEVERUS { tuple val(meta), path("${prefix}/severus_collaped_dup.bed") , emit: collapsed_dup , optional: true tuple val(meta), path("${prefix}/severus_LOH.bed") , emit: loh , optional: true tuple val(meta), path("${prefix}/all_SVs/severus_all.vcf.gz") , emit: all_vcf , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true - tuple val(meta), path("${prefix}/all_SVs/breakpoints_clusters.tsv") , emit: all_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters_list.tsv") , emit: all_breakpoints_clusters_list , optional: true + tuple val(meta), path("${prefix}/all_SVs/breakpoint_clusters.tsv") , emit: all_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/all_SVs/plots/severus_*.html") , emit: all_plots , optional: true tuple val(meta), path("${prefix}/somatic_SVs/severus_somatic.vcf.gz") , emit: somatic_vcf , optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true - tuple val(meta), path("${prefix}/somatic_SVs/breakpoints_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters_list.tsv"), emit: somatic_breakpoints_clusters_list, optional: true + tuple val(meta), path("${prefix}/somatic_SVs/breakpoint_clusters.tsv") , emit: somatic_breakpoints_clusters , optional: true tuple val(meta), path("${prefix}/somatic_SVs/plots/severus_*.html") , emit: somatic_plots , optional: true path "versions.yml" , emit: versions diff --git a/nextflow.config b/nextflow.config index 1cef0a68..2aaf892d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -48,6 +48,7 @@ params { skip_m6a = false skip_vep = false skip_modcall = false + use_gpu = false // minimap2 options minimap2_ont_model = null diff --git a/nextflow_schema.json b/nextflow_schema.json index f22408bc..f6b15390 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -57,13 +57,13 @@ "type": "string", "description": "specifies which germline variants are used for phasing and annotation. Must be [consensus, all,deepvariant,clair]", "default": "consensus", - "enum": ["consensus", "all","deepvariant","clair"] + "enum": ["consensus", "all", "deepvariant", "clair"] }, "somatic_var_keep": { "type": "string", "description": "specifies which somatic variants are used for phasing and annotation. Must be [consensus, all,deepvariant,clair]", "default": "all", - "enum": ["consensus", "all", "deepvariant","clair"] + "enum": ["consensus", "all", "deepvariant", "clair"] } } }, @@ -410,6 +410,9 @@ { "$ref": "#/$defs/input_output_options" }, + { + "$ref": "#/$defs/small_variant_calling_options" + }, { "$ref": "#/$defs/reference_genome_options" }, diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 35fb56bf..09c9961f 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -23,7 +23,7 @@ "@type": "Dataset", "creativeWorkStatus": "InProgress", "datePublished": "2025-12-23T12:58:53+00:00", - "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n![image](./assets/lrsomatic_1.0.png)\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\nIf you use IntGenomicsLab/lrsomatic for your analysis, please cite it using the following doi: [10.5281/zenodo.17751829](https://doi.org/10.5281/zenodo.17751829)\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", + "description": "# IntGenomicsLab/lrsomatic\n\n[![Open in GitHub Codespaces](https://img.shields.io/badge/Open_In_GitHub_Codespaces-black?labelColor=grey&logo=github)](https://github.com/codespaces/new/IntGenomicsLab/lrsomatic)\n[![GitHub Actions CI Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml/badge.svg)](https://github.com/IntGenomicsLab/lrsomatic/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.17751829-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.17751829)\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/version-%E2%89%A525.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\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/IntGenomicsLab/lrsomatic)\n\n## Introduction\n\n**IntGenomicsLab/lrsomatic** is a robust bioinformatics pipeline designed for processing and analyzing **somatic DNA sequencing** data for long-read sequencing technologies from **Oxford Nanopore** and **PacBio**. It supports both canonical base DNA and modified base calling, including specialized applications such as **Fiber-seq**.\n\nThis **end-to-end pipeline** handles the entire workflow \u2014 **from raw read processing and alignment, to comprehensive somatic variant calling**, including single nucleotide variants, indels, structural variants, copy number alterations, and modified bases.\n\nIt can be run in both **matched tumour-normal** and **tumour-only mode**, offering flexibility depending on the users study design.\n\nDeveloped using **Nextflow DSL2**, it offers high portability and scalability across diverse computing environments. By leveraging Docker or Singularity containers, installation is streamlined and results are highly reproducible. Each process runs in an isolated container, simplifying dependency management and updates. Where applicable, pipeline components are sourced from **nf-core/modules**, promoting reuse, interoperability, and consistency within the broader Nextflow and nf-core ecosystems.\n\n## Pipeline summary\n\n![image](./assets/lrsomatic_1.0.png)\n\n**1) Pre-processing:**\n\na. Raw read QC ([`cramino`](https://github.com/wdecoster/cramino))\n\nb. Alignment to the reference genome ([`minimap2`](https://github.com/lh3/minimap2))\n\nc. Post alignment QC ([`cramino`](https://github.com/wdecoster/cramino), [`samtools idxstats`](https://github.com/samtools/samtools), [`samtools flagstats`](https://github.com/samtools/samtools), [`samtools stats`](https://github.com/samtools/samtools))\n\nd. Specific for calling modified base calling ([`Modkit`](https://github.com/nanoporetech/modkit), [`Fibertools`](https://github.com/fiberseq/fibertools-rs))\n\n**2i) Matched mode: small variant calling:**\n\na. Calling Germline SNPs ([`Clair3`](https://github.com/HKU-BAL/Clair3))\n\nb. Phasing and Haplotagging the SNPs in the normal and tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\nc. Calling somatic SNVs ([`ClairS`](https://github.com/HKU-BAL/ClairS))\n\n**2ii) Tumour only mode: small variant calling:**\n\na. Calling Germline SNPs and somatic SNVs ([`ClairS-TO`](https://github.com/HKU-BAL/ClairS-TO))\n\nb. Phasing and Haplotagging germline SNPs in tumour BAM ([`LongPhase`](https://github.com/twolinin/longphase))\n\n**3) Large variant calling:**\n\na. Somatic structural variant calling ([`Severus`](https://github.com/KolmogorovLab/Severus))\n\nb. Copy number alterion calling; long read version of ([`ASCAT`](https://github.com/VanLoo-lab/ascat))\n\n**4) Annotation:**\n\na. Small variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\nb. Structural variant annotation ([`VEP`](https://github.com/Ensembl/ensembl-vep))\n\n\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```csv\nsample,bam_tumor,bam_normal,platform,sex,fiber\nsample1,tumour.bam,normal.bam,ont,female,n\nsample2,tumour.bam,,ont,female,y\nsample3,tumour.bam,,pb,male,n\nsample4,tumour.bam,normal.bam,pb,male,y\n```\n\nEach row represents a sample. The bam files should always be unaligned bam files. All fields except for `bam_normal` are required. If `bam_normal` is empty, the pipeline will run in tumour only mode. `platform` should be either `ont` or `pb` for Oxford Nanopore Sequencing or PacBio sequencing, respectively. `sex` refers to the biological sex of the sample and should be either `female` or `male`. Finally, `fiber` specifies whether your sample is Fiber-seq data or not and should have either `y` for Yes or `n` for No.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run IntGenomicsLab/lrsomatic \\\n -profile \\\n --input samplesheet.csv \\\n --outdir \n```\n\nMore detail is given in our [usage documentation](/docs/usage.md)\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\nIntGenomicsLab/lr_somatic was originally written by Luuk Harbers, Robert Forsyth, Alexandra Pan\u010d\u00edkov\u00e1, Marios Eftychiou, Ruben Cools, Laurens Lambrechts, and Jonas Demeulemeester.\n\n## Pipeline output\n\nThis pipeline produces a series of different output files. The main output is an aligned and phased tumour bam file. This bam file can be used by any typical downstream tool that uses bam files as input. Furthermore, we have sample-specific QC outputs from `cramino` (fastq), `cramino` (bam), `mosdepth`, `samtools` (stats/flagstat/idxstats), and optionally `fibertools`. Finally, we have a `multiqc` report from that combines the output from `mosdepth` and `samtools` into one html report.\n\nBesides QC and the aligned and phased bam file, we have output from (structural) variant and copy number callers, of which some are optional. The output from these variant callers can be found in their respective folders. For small and structural variant callers (`clairS`, `clairS-TO`, and `severus`) these will contain, among others, `vcf` files with called variants. For `ascat` these contain files with final copy number information and plots of the copy number profiles.\n\nExample output directory structure:\n\n```\n\u251c\u2500\u2500 Sample 1\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500clairS-TO\n\u2502 \u2502 \u251c\u2500\u2500severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u2502\n\u251c\u2500\u2500 Sample 2\n\u2502 \u251c\u2500\u2500 ascat\n\u2502 \u251c\u2500\u2500 bamfiles\n\u2502 \u251c\u2500\u2500 qc\n\u2502 \u2502 \u251c\u2500\u2500 tumor\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u2502 \u251c\u2500\u2500 normal\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_aln\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 cramino_ubam\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 fibertoolsrs\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 mosdepth\n\u2502 \u2502 \u2502 \u251c\u2500\u2500 samtools\n\u2502 \u251c\u2500\u2500 variants\n\u2502 \u2502 \u251c\u2500\u2500 clair3\n\u2502 \u2502 \u251c\u2500\u2500 clairS\n\u2502 \u2502 \u251c\u2500\u2500 severus\n\u2502 \u251c\u2500\u2500 vep\n\u2502 \u2502 \u251c\u2500\u2500 germline\n\u2502 \u2502 \u251c\u2500\u2500 somatic\n\u2502 \u2502 \u251c\u2500\u2500 SVs\n\u251c\u2500\u2500 pipeline_info\n```\n\nmore detail is given in our [output documentation](/docs/output.md)\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\nIf you use `IntGenomicsLab/lrsomatic` for your analysis, please cite it using the following:\n\n> LRSomatic: a highly scalable and robust pipeline for somatic variant calling in long-read sequencing data\n>\n> Robert A. Forsyth*, Luuk Harbers*, Amber Verhasselt, Ana-Luc\u00eda Rocha Iraiz\u00f3s, Sidi Yang, Joris Vande Velde, Christopher Davies, Nischalan Pillay, Laurens Lambrechts, Jonas Demeulemeester\n>\n> bioRxiv 2026.02.26.707772; doi: https://doi.org/10.64898/2026.02.26.707772\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" diff --git a/subworkflows/local/deepsomatic.nf b/subworkflows/local/deepsomatic.nf index 920795ad..c91ca6af 100644 --- a/subworkflows/local/deepsomatic.nf +++ b/subworkflows/local/deepsomatic.nf @@ -18,7 +18,7 @@ workflow DEEPSOMATIC { // Input to postprocessing step needs both the gvcfs from MAKEEXAMPLES and the variant // calls from CALLVARIANTS. Joining on meta, which is assumed to be unique. - + ch_postproc_input = DEEPSOMATIC_CALLVARIANTS.out.call_variants_tfrecords.join( DEEPSOMATIC_MAKEEXAMPLES.out.gvcf, diff --git a/subworkflows/local/paired/paired_smallvar_germline.nf b/subworkflows/local/paired/paired_smallvar_germline.nf index 4ad2d727..2e9f286c 100644 --- a/subworkflows/local/paired/paired_smallvar_germline.nf +++ b/subworkflows/local/paired/paired_smallvar_germline.nf @@ -104,7 +104,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { clair3_ch .mix(deepvariant_ch) .set{combined_germline_ch} - + GERMLINE_CONSENSUS( combined_germline_ch, fasta, diff --git a/subworkflows/local/paired/paired_smallvar_somatic.nf b/subworkflows/local/paired/paired_smallvar_somatic.nf index e7cad038..421864bd 100644 --- a/subworkflows/local/paired/paired_smallvar_somatic.nf +++ b/subworkflows/local/paired/paired_smallvar_somatic.nf @@ -18,7 +18,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { ch_versions = channel.empty() somatic_vcf = channel.empty() somatic_tbi = channel.empty() - + // CLAIRS if(params.somatic_var_keep != 'deepvariant') { tumor_normal_bams @@ -32,13 +32,13 @@ workflow PAIRED_SMALLVAR_SOMATIC { fasta, fai ) - + // CONCAT CLAIRS INDEL AND SNV OUTPUT CLAIRS.out.vcfs .join(CLAIRS.out.tbi) .set{clairs_out} - + BCFTOOLS_CONCAT ( clairs_out ) diff --git a/subworkflows/local/phasing_haplotyping.nf b/subworkflows/local/phasing_haplotyping.nf index b543e3cc..d7987b29 100644 --- a/subworkflows/local/phasing_haplotyping.nf +++ b/subworkflows/local/phasing_haplotyping.nf @@ -1,12 +1,12 @@ // Import modules -include { LONGPHASE_PHASE as LONGPHASE_PHASE_GERMLINE } from '../../modules/nf-core/longphase/phase/main.nf' -include { LONGPHASE_PHASE as LONGPHASE_PHASE_SOMATIC } from '../../modules/nf-core/longphase/phase/main.nf' -include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' -include { LONGPHASE_MODCALL as LONGPHASE_MODCALL_GERMLINE } from '../../modules/local/longphase/modcall/main.nf' -include { LONGPHASE_MODCALL as LONGPHASE_MODCALL_SOMATIC } from '../../modules/local/longphase/modcall/main.nf' -include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' -include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' -include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort/main' +include { LONGPHASE_PHASE as LONGPHASE_PHASE_GERMLINE } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_PHASE as LONGPHASE_PHASE_SOMATIC } from '../../modules/nf-core/longphase/phase/main.nf' +include { LONGPHASE_HAPLOTAG } from '../../modules/nf-core/longphase/haplotag/main.nf' +include { LONGPHASE_MODCALL as LONGPHASE_MODCALL_GERMLINE } from '../../modules/local/longphase/modcall/main.nf' +include { LONGPHASE_MODCALL as LONGPHASE_MODCALL_SOMATIC } from '../../modules/local/longphase/modcall/main.nf' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/samtools/index/main.nf' +include { BCFTOOLS_CONCAT } from '../../modules/nf-core/bcftools/concat/main' +include { BCFTOOLS_SORT } from '../../modules/nf-core/bcftools/sort/main' workflow PHASING_HAPLOTYPING { @@ -18,15 +18,15 @@ workflow PHASING_HAPLOTYPING { fai main: - + // SPLIT INTO PAIRED AND TUMOR ONLY - tumor_normal_bams + tumor_normal_bams .branch { meta, _bams, _bai -> paired: meta.paired_data tumor_only: !meta.paired_data } .set { branched_bams } - + branched_bams.paired .set{ paired_ch } @@ -51,7 +51,7 @@ workflow PHASING_HAPLOTYPING { tumor: meta.type == "tumor" } .set {paired_ch_branched} - + paired_ch_branched.normal .map { meta, bam, bai -> def new_meta = meta.subMap('id', @@ -140,7 +140,7 @@ workflow PHASING_HAPLOTYPING { return [ meta, bam, bai, vcf, svs, mods ] } .set{ longphase_phase_somatic_input_ch } - } + } else { normal_bams_w_tumoronly_ch .join(germline_vcf) @@ -150,7 +150,7 @@ workflow PHASING_HAPLOTYPING { return [ meta, bam, bai, vcf, svs, mods ] } .set{ longphase_phase_germline_input_ch } - + tumor_bams_ch .join(germline_somatic_vcfs) .join(LONGPHASE_MODCALL_SOMATIC.out.mod_vcf) @@ -171,7 +171,7 @@ workflow PHASING_HAPLOTYPING { LONGPHASE_PHASE_GERMLINE.out.snv_vcf .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf_index) .set{ phased_germline_vcf } - + LONGPHASE_PHASE_SOMATIC ( longphase_phase_somatic_input_ch, fasta, @@ -185,7 +185,7 @@ workflow PHASING_HAPLOTYPING { // HAPLOTAGING // remove type for merging - + if(!params.skip_modcall) { LONGPHASE_MODCALL_GERMLINE.out.mod_vcf @@ -209,30 +209,30 @@ workflow PHASING_HAPLOTYPING { .map { meta, bam, bai, vcf, mods -> def new_meta = meta + [type : "tumor"] def svs = [] - return [new_meta, bam, bai, vcf, svs, mods] + return [new_meta, bam, bai, vcf, svs, mods] } .set{ tumor_only_ch } - + paired_tumor_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .join(modcall_vcf_ch) .map { meta, bam, bai, vcf, mods -> def new_meta = meta + [type : "tumor"] def svs = [] - return [new_meta, bam, bai, vcf, svs, mods] + return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_tumor_ch } - + paired_normal_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .join(modcall_vcf_ch) .map { meta, bam, bai, vcf, mods -> def new_meta = meta + [type : "normal"] def svs = [] - return [new_meta, bam, bai, vcf, svs, mods] + return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_normal_ch } - + } else { @@ -242,27 +242,27 @@ workflow PHASING_HAPLOTYPING { def new_meta = meta + [type : "tumor"] def svs = [] def mods = [] - return [new_meta, bam, bai, vcf, svs, mods] + return [new_meta, bam, bai, vcf, svs, mods] } .set{ tumor_only_ch } - + paired_tumor_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .map { meta, bam, bai, vcf -> def new_meta = meta + [type : "tumor"] def svs = [] def mods = [] - return [new_meta, bam, bai, vcf, svs, mods] + return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_tumor_ch } - + paired_normal_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .map { meta, bam, bai, vcf -> def new_meta = meta + [type : "normal"] def svs = [] def mods = [] - return [new_meta, bam, bai, vcf, svs, mods] + return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_normal_ch } @@ -293,4 +293,4 @@ workflow PHASING_HAPLOTYPING { emit: tumor_normal_hapbams_ch phased_germline_vcf -} \ No newline at end of file +} diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 823c38c9..4665d4bb 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -19,7 +19,7 @@ workflow SMALL_VARIANT_CONSENSUS { //normalize VCFs BCFTOOLS_NORM(mixed_vcfs, fasta) - BCFTOOLS_NORM.out.vcf + BCFTOOLS_NORM.out.vcf .join(BCFTOOLS_NORM.out.tbi) .set {normalized_vcfs} @@ -52,7 +52,7 @@ workflow SMALL_VARIANT_CONSENSUS { clair_ch = annotated_vcfs_branched.clair deepvariant_ch = annotated_vcfs_branched.deepvariant - + clair_ch. map {meta, vcfs, tbi -> def new_meta = meta.subMap('id', @@ -118,11 +118,11 @@ workflow SMALL_VARIANT_CONSENSUS { BCFTOOLS_ISEC.out.clair_consensus_tbi .set{tbi} } - + } else if (var_keep_method == 'all'){ - + mixed_vcfs .map{ meta, vcfs, tbis -> def file = [] @@ -131,7 +131,7 @@ workflow SMALL_VARIANT_CONSENSUS { return [meta, vcfs, tbis, file, target, regions] } .set{isec_input} - + BCFTOOLS_ISEC(isec_input) if (params.trust_caller == 'deepvariant') { @@ -172,4 +172,4 @@ workflow SMALL_VARIANT_CONSENSUS { vcf tbi -} \ No newline at end of file +} diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf index 7db49724..6fe9de8a 100644 --- a/subworkflows/local/tumor_only/tumoronly_smallvar.nf +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -60,7 +60,7 @@ workflow TUMORONLY_SMALLVAR { return [ new_meta, vcf, tbi] } .set{clairsto_germline_ch} - + VCFSPLIT.out.somatic_vcf .join(VCFSPLIT.out.somatic_tbi) .map { meta, vcf, tbi -> @@ -85,7 +85,7 @@ workflow TUMORONLY_SMALLVAR { [[:],[]], [[:],[]] ) - + DEEPVARIANT.out.vcf .join(DEEPVARIANT.out.vcf_index) @@ -202,6 +202,6 @@ workflow TUMORONLY_SMALLVAR { emit: somatic_vcf germline_vcf - - -} \ No newline at end of file + + +} diff --git a/subworkflows/nf-core/deepvariant/deepvariant.diff b/subworkflows/nf-core/deepvariant/deepvariant.diff new file mode 100644 index 00000000..691bc284 --- /dev/null +++ b/subworkflows/nf-core/deepvariant/deepvariant.diff @@ -0,0 +1,23 @@ +Changes in component 'nf-core/deepvariant' +'subworkflows/nf-core/deepvariant/README.md' is unchanged +'subworkflows/nf-core/deepvariant/meta.yml' is unchanged +Changes in 'deepvariant/main.nf': +--- subworkflows/nf-core/deepvariant/main.nf ++++ subworkflows/nf-core/deepvariant/main.nf +@@ -6,7 +6,7 @@ + take: + ch_input // channel: [ val(meta), path(input), path(index), path(intervals)] + ch_fasta // channel: [ val(meta2), path(fasta) ] +- ch_fai // channel: [ val(meta3), path(fail) ] ++ ch_fai // channel: [ val(meta3), path(fai) ] + ch_gzi // channel: [ val(meta4), path(gzi) ] + ch_par_bed // channel: [ val(meta5), path(par_bed) ] + + +'subworkflows/nf-core/deepvariant/tests/main.nf.test' is unchanged +'subworkflows/nf-core/deepvariant/tests/equality.nf.test' is unchanged +'subworkflows/nf-core/deepvariant/tests/disable-small-model.conf' is unchanged +'subworkflows/nf-core/deepvariant/tests/deepvariant-workflow-and-process-equality-tester.nf' is unchanged +'subworkflows/nf-core/deepvariant/tests/main.nf.test.snap' is unchanged +'subworkflows/nf-core/deepvariant/tests/nextflow.config' is unchanged +************************************************************ diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 778a5df1..375af10f 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -76,6 +76,9 @@ "SAMTOOLS_IDXSTATS": { "samtools": "1.22.1" }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, "SAMTOOLS_STATS": { "samtools": "1.22.1" }, @@ -109,10 +112,6 @@ } }, [ - "longphase", - "longphase/sample1.vcf", - "longphase/sample2.vcf", - "longphase/sample3.vcf", "multiqc", "multiqc/multiqc_data", "multiqc/multiqc_data/llms-full.txt", @@ -188,6 +187,11 @@ "pipeline_info", "pipeline_info/lrsomatic_software_mqc_versions.yml", "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", "sample1/qc", "sample1/qc/normal", "sample1/qc/normal/cramino_aln", @@ -261,8 +265,6 @@ "sample1/variants/clairs/snvs.vcf.gz", "sample1/variants/clairs/snvs.vcf.gz.tbi", "sample1/variants/deepsomatic", - "sample1/variants/deepsomatic/sample1.g.vcf.gz", - "sample1/variants/deepsomatic/sample1.g.vcf.gz.tbi", "sample1/variants/deepsomatic/sample1.vcf.gz", "sample1/variants/deepsomatic/sample1.vcf.gz.tbi", "sample1/variants/deepvariant", @@ -271,18 +273,26 @@ "sample1/variants/deepvariant/sample1.vcf.gz", "sample1/variants/deepvariant/sample1.vcf.gz.tbi", "sample1/variants/phased", + "sample1/variants/phased/germline_smallvariants.vcf.gz", + "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", "sample1/variants/phased/somatic_smallvariants.vcf.gz", "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz", "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample1/variants/severus", "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", "sample1/variants/severus/all_SVs/severus_all.vcf.gz", "sample1/variants/severus/breakpoints_double.csv", "sample1/variants/severus/read_ids.csv", "sample1/variants/severus/read_qual.txt", "sample1/variants/severus/severus.log", "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample1/vep", "sample1/vep/SVs", @@ -298,6 +308,11 @@ "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", "sample2/qc", "sample2/qc/normal", "sample2/qc/normal/cramino_aln", @@ -371,8 +386,6 @@ "sample2/variants/clairs/snvs.vcf.gz", "sample2/variants/clairs/snvs.vcf.gz.tbi", "sample2/variants/deepsomatic", - "sample2/variants/deepsomatic/sample2.g.vcf.gz", - "sample2/variants/deepsomatic/sample2.g.vcf.gz.tbi", "sample2/variants/deepsomatic/sample2.vcf.gz", "sample2/variants/deepsomatic/sample2.vcf.gz.tbi", "sample2/variants/deepvariant", @@ -381,18 +394,26 @@ "sample2/variants/deepvariant/sample2.vcf.gz", "sample2/variants/deepvariant/sample2.vcf.gz.tbi", "sample2/variants/phased", + "sample2/variants/phased/germline_smallvariants.vcf.gz", + "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", "sample2/variants/phased/somatic_smallvariants.vcf.gz", "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz", "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample2/variants/severus", "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", "sample2/variants/severus/all_SVs/severus_all.vcf.gz", "sample2/variants/severus/breakpoints_double.csv", "sample2/variants/severus/read_ids.csv", "sample2/variants/severus/read_qual.txt", "sample2/variants/severus/severus.log", "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample2/vep", "sample2/vep/SVs", @@ -408,6 +429,9 @@ "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", "sample3/qc", "sample3/qc/tumor", "sample3/qc/tumor/cramino_aln", @@ -451,8 +475,6 @@ "sample3/variants/clairsto/somatic.vcf.gz", "sample3/variants/clairsto/somatic.vcf.gz.tbi", "sample3/variants/deepsomatic", - "sample3/variants/deepsomatic/sample3.g.vcf.gz", - "sample3/variants/deepsomatic/sample3.g.vcf.gz.tbi", "sample3/variants/deepsomatic/sample3.vcf.gz", "sample3/variants/deepsomatic/sample3.vcf.gz.tbi", "sample3/variants/deepvariant", @@ -461,18 +483,26 @@ "sample3/variants/deepvariant/sample3.vcf.gz", "sample3/variants/deepvariant/sample3.vcf.gz.tbi", "sample3/variants/phased", + "sample3/variants/phased/germline_smallvariants.vcf.gz", + "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", "sample3/variants/phased/somatic_smallvariants.vcf.gz", "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz", "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", "sample3/variants/severus", "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", "sample3/variants/severus/all_SVs/severus_all.vcf.gz", "sample3/variants/severus/breakpoints_double.csv", "sample3/variants/severus/read_ids.csv", "sample3/variants/severus/read_qual.txt", "sample3/variants/severus/severus.log", "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", "sample3/vep", "sample3/vep/SVs", @@ -489,60 +519,73 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1.vcf:md5,26cef7c7c05a6d2e076aeb0e0bef7fe2", - "sample2.vcf:md5,e50e314896682852a973f1f9236f908c", - "sample3.vcf:md5,009e8d6ef6736c8f7760d3cbbbf91f73", + "sample1_normal.bam:md5,92a00e311e085a34d443cb64694ce839", + "sample1_normal.bam.bai:md5,c7dff8adc4c8d33a81fb8ea7dff4a98e", + "sample1_tumor.bam:md5,c6c79808f928393b23ae53976a7304c3", + "sample1_tumor.bam.bai:md5,317d711c0c26d2cfb933ad53b69da1d7", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,70fabbdc07dec0479b3fc7dcec344054", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,5012c82d3d3ca60ffdd2fb970f772566", - "sample1.g.vcf.gz:md5,e9c0e1c7f90d334faccab6b854611643", - "sample1.g.vcf.gz.tbi:md5,6110e6f6ab72dbc0bee604afe690893f", "sample1.vcf.gz:md5,92c0fa9016c3d8b192eb382fd6a81199", "sample1.vcf.gz.tbi:md5,04e82577dc57f80b9db25897389364b2", "sample1.g.vcf.gz:md5,5ed06f35ccecf7aadbec54873dc07e64", "sample1.g.vcf.gz.tbi:md5,ca628ef368d34a7a6c77098a4c4bdf36", "sample1.vcf.gz:md5,ad971a535d2b8014fabdabe72995a5db", "sample1.vcf.gz.tbi:md5,65de5caace8d4312afa707c3bfd6fa45", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "breakpoints_double.csv:md5,d63f058075bfe791248954ca2ee6c4fb", "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,ed6aab4d2ef70537390a0ce85276ad2c", + "sample2_normal.bam.bai:md5,fb92c167c63e7f62d0c4c3fea8bd1b60", + "sample2_tumor.bam:md5,10c29ced5ed253731ca50097d9c848e3", + "sample2_tumor.bam.bai:md5,e0aa6d8d594070e753145503520fffab", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,87cb6e9adf8a133244e8b331be43bb14", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,1e044857eeefb284fda88ee58ff7a04a", - "sample2.g.vcf.gz:md5,1cb2d7bf929e4e87a8591c11bf5034c7", - "sample2.g.vcf.gz.tbi:md5,67674d00b976135fe29f318067a01f7a", "sample2.vcf.gz:md5,f9d6266ee49c2544dc28eef0cdd9dcae", "sample2.vcf.gz.tbi:md5,433ecd219947787d00dd0fada6307661", "sample2.g.vcf.gz:md5,7998d15ce582ec94e86568e3fae654f9", "sample2.g.vcf.gz.tbi:md5,9498e3266900eee2448ff05b0bce87c0", "sample2.vcf.gz:md5,33330d8444a1774864883b33e1e2235c", "sample2.vcf.gz.tbi:md5,384b8b5ea7c1559b464031f8e0863532", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "breakpoints_double.csv:md5,a68d7fc9c7a7cb2f31e73189c5412f7b", "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,5020a416186da412d9e89f7efac64178", + "sample3_tumor.bam.bai:md5,fc26fd7d9b388e6551898aacf5ed0c7b", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,d7a8552a8a41a217954a0c825d468a60", - "sample3.g.vcf.gz:md5,2392430290a5d6a9a43b359faebc025b", - "sample3.g.vcf.gz.tbi:md5,4349b51070a4274707b94ef9b4d8c0bd", "sample3.vcf.gz:md5,ee4f7a5bbd471c1370accf888b8262c0", "sample3.vcf.gz.tbi:md5,944349ec46ecc95bab7db2f6848d0c36", "sample3.g.vcf.gz:md5,64adc407ef2434254e76763b72c67b08", "sample3.g.vcf.gz.tbi:md5,ac0397f7a840cf618d56f097defba878", "sample3.vcf.gz:md5,9c52a803d796157a08b565c653d4685c", "sample3.vcf.gz.tbi:md5,f0b3599e4281a6f3bbb8bc408740e58e", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "breakpoints_double.csv:md5,46e03bf2d67aa736b599f00fe7f01e06", - "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed" + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-23T16:14:08.943804849" + "timestamp": "2026-03-24T11:55:01.760175088" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index add2d641..8f377a91 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -93,7 +93,7 @@ workflow LRSOMATIC { params.bed_file = getGenomeAttribute('bed_file') params.vep_genome = getGenomeAttribute('vep_genome') params.vep_species = getGenomeAttribute('vep_species') - + if (params.pons_vcfs != null) { pon_files = params.pon_vcfs.collect { file(it) } pon_flags = params.pon_flags @@ -397,7 +397,7 @@ workflow LRSOMATIC { .join(MINIMAP2_ALIGN.out.index) .set {ch_index_minimap} - ch_index_minimap + ch_index_minimap .branch { meta, _bams, _bais -> paired: meta.paired_data tumor_only: !meta.paired_data @@ -466,7 +466,7 @@ workflow LRSOMATIC { ch_fai, downloaded_clair3_models ) - + PAIRED_SMALLVAR_GERMLINE.out.germline_vcf .mix(TUMORONLY_SMALLVAR.out.germline_vcf) .set{ch_germline_vcf} @@ -484,23 +484,23 @@ workflow LRSOMATIC { ch_fai ) - + ch_somatic_vcf .map { meta, vcf, _tbi -> def extra = [] return [meta, vcf, extra] } .set { somatic_vep } - + ch_germline_vcf .map { meta, vcf, _tbi -> def extra = [] return [meta, vcf, extra] } .set { germline_vep } - + /// figure out severus channel structure then test - + // [meta, vcf, []] -- somatic variants merged from T/N and tumor-only paths if (!params.skip_vep) { @@ -567,7 +567,7 @@ workflow LRSOMATIC { .mix(somatic_smallvar_input) .join(PHASING_HAPLOTYPING.out.phased_germline_vcf) .set{severus_input} - + // // MODULE: SEVERUS // From e098f3a93a6a4d5b6716688e60163368cc50c608 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 13:24:18 +0100 Subject: [PATCH 155/183] Update modules/local/vcfsplit/main.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- modules/local/vcfsplit/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 5c9bb05f..9f5759d8 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -31,8 +31,8 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools view -i 'FILTER="NonSomatic" | Verdict_Germline' $indel_vcf | bgzip -c > indels_filtered.vcf.gz - bcftools view -i 'FILTER="NonSomatic" | Verdict_Germline' $snv_vcf | bgzip -c > snv_filtered.vcf.gz + bcftools view -i 'FILTER=="NonSomatic" || FILTER=="Verdict_Germline"' $indel_vcf | bgzip -c > indels_filtered.vcf.gz + bcftools view -i 'FILTER=="NonSomatic" || FILTER=="Verdict_Germline"' $snv_vcf | bgzip -c > snv_filtered.vcf.gz tabix -p vcf indels_filtered.vcf.gz tabix -p vcf snv_filtered.vcf.gz bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_filtered.vcf.gz snv_filtered.vcf.gz From abf274fc0516b937408817c2454704683d401116 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 13:33:21 +0100 Subject: [PATCH 156/183] Update modules/nf-core/bcftools/isec/main.nf Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- modules/nf-core/bcftools/isec/main.nf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/nf-core/bcftools/isec/main.nf b/modules/nf-core/bcftools/isec/main.nf index 2bbf6263..cda1a662 100644 --- a/modules/nf-core/bcftools/isec/main.nf +++ b/modules/nf-core/bcftools/isec/main.nf @@ -52,5 +52,9 @@ process BCFTOOLS_ISEC { touch ${prefix}/0000.vcf.gz.tbi echo "" | gzip > ${prefix}/0001.vcf.gz touch ${prefix}/0001.vcf.gz.tbi + echo "" | gzip > ${prefix}/0002.vcf.gz + touch ${prefix}/0002.vcf.gz.tbi + echo "" | gzip > ${prefix}/0003.vcf.gz + touch ${prefix}/0003.vcf.gz.tbi """ } From c932ea45f54f1bdddea891c1df8784b1ed5cf680 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 14:31:20 +0100 Subject: [PATCH 157/183] small fixes --- modules.json | 156 +++-- .../bcftools/query/bcftools-query.diff | 11 +- modules/nf-core/bcftools/query/main.nf | 4 +- nextflow.config | 3 - subworkflows/local/phasing_haplotyping.nf | 28 +- .../local/tumor_only/tumoronly_smallvar.nf | 4 +- tests/default.nf.test.snap | 605 +----------------- workflows/lrsomatic.nf | 6 +- 8 files changed, 153 insertions(+), 664 deletions(-) diff --git a/modules.json b/modules.json index b774fa63..8db781ed 100644 --- a/modules.json +++ b/modules.json @@ -8,180 +8,248 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/annotate": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/concat": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": ["modules", "vcf_gather_bcftools"] + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ] }, "bcftools/isec": { "branch": "master", "git_sha": "3b2c3559699a7bca6a7c2b220695a072e030e17d", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/bcftools/isec/bcftools-isec.diff" }, "bcftools/merge": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/bcftools/merge/bcftools-merge.diff" }, "bcftools/norm": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bcftools/query": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/bcftools/query/bcftools-query.diff" }, "bcftools/sort": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": ["modules", "vcf_gather_bcftools"], + "installed_by": [ + "modules", + "vcf_gather_bcftools" + ], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "deepvariant/callvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["deepvariant"], + "installed_by": [ + "deepvariant" + ], "patch": "modules/nf-core/deepvariant/callvariants/deepvariant-callvariants.diff" }, "deepvariant/makeexamples": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["deepvariant"], + "installed_by": [ + "deepvariant" + ], "patch": "modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff" }, "deepvariant/postprocessvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["deepvariant"], + "installed_by": [ + "deepvariant" + ], "patch": "modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "90cdd21fd96ccbdb3bc90797ca69570d18391055", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ensemblvep/vep": { "branch": "master", "git_sha": "890fdcff71928fc1470d3e669d4c430c8c770297", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "5c9f8d5b7671237c906abadc9ff732b301ca15ca", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "14980f759266eec42dac401fcafeb83d6c957b41", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "modkit/pileup": { "branch": "master", "git_sha": "3d81317a30d1016b533982d6b84df07713ae520a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mosdepth": { "branch": "master", "git_sha": "6832b69ef7f98c54876d6436360b6b945370c615", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "multiqc": { "branch": "master", "git_sha": "2c73cc8fa92cf48de3da0b643fdf357a8a290b36", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "nanoplot": { "branch": "master", "git_sha": "682f789f93070bd047868300dd018faf3d434e7c", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pigz/uncompress": { "branch": "master", "git_sha": "f84336b7fa91a65aa61d215b8c109fbb8e4b4ac6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/cat": { "branch": "master", "git_sha": "f9edc59be2fe25bb6fc73ca4dfc0d28246f2a2d6", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "b2e78932ef01165fd85829513eaca29eff8e640a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/flagstat": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/idxstats": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": ["bam_stats_samtools"] + "installed_by": [ + "bam_stats_samtools" + ] }, "samtools/index": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/stats": { "branch": "master", "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", - "installed_by": ["bam_stats_samtools"], + "installed_by": [ + "bam_stats_samtools" + ], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "447f7bc0fa41dfc2400c8cad4c0291880dc060cf", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "unzip": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "whatshap/stats": { "branch": "master", "git_sha": "bfab71f4d68c1aaff09335a3433e7b2836918b2a", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -190,31 +258,41 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "7ac6cbe7c17c2dad685da7f70496c8f48ea48687", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "deepvariant": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": ["subworkflows"], + "installed_by": [ + "subworkflows" + ], "patch": "subworkflows/nf-core/deepvariant/deepvariant.diff" }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": ["subworkflows"] + "installed_by": [ + "subworkflows" + ] } } } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/query/bcftools-query.diff b/modules/nf-core/bcftools/query/bcftools-query.diff index 12ebaeaa..6ad99032 100644 --- a/modules/nf-core/bcftools/query/bcftools-query.diff +++ b/modules/nf-core/bcftools/query/bcftools-query.diff @@ -13,7 +13,7 @@ Changes in 'bcftools/query/main.nf': tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: -@@ -35,6 +36,8 @@ +@@ -35,12 +36,16 @@ ${args} \\ ${vcf} \\ > ${prefix}.${suffix} @@ -22,6 +22,15 @@ Changes in 'bcftools/query/main.nf': """ stub: + def prefix = task.ext.prefix ?: "${meta.id}" + suffix = task.ext.suffix ?: "txt" + """ +- touch ${prefix}.${suffix} \\ ++ touch ${prefix}.${suffix} ++ bgzip -c ${prefix}.${suffix} > ${prefix}.${suffix}.gz ++ tabix -s 1 -b 2 -e 2 ${prefix}.${suffix}.gz + """ + } 'modules/nf-core/bcftools/query/environment.yml' is unchanged 'modules/nf-core/bcftools/query/tests/main.nf.test' is unchanged diff --git a/modules/nf-core/bcftools/query/main.nf b/modules/nf-core/bcftools/query/main.nf index 996214f1..168a2ad9 100644 --- a/modules/nf-core/bcftools/query/main.nf +++ b/modules/nf-core/bcftools/query/main.nf @@ -44,6 +44,8 @@ process BCFTOOLS_QUERY { def prefix = task.ext.prefix ?: "${meta.id}" suffix = task.ext.suffix ?: "txt" """ - touch ${prefix}.${suffix} \\ + touch ${prefix}.${suffix} + bgzip -c ${prefix}.${suffix} > ${prefix}.${suffix}.gz + tabix -s 1 -b 2 -e 2 ${prefix}.${suffix}.gz """ } diff --git a/nextflow.config b/nextflow.config index 2fcdce03..f8ad334a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,12 +45,9 @@ params { skip_normalfiber = false skip_m6a = false skip_vep = false -<<<<<<< HEAD skip_modcall = false use_gpu = false -======= skip_whatshapstats = false ->>>>>>> 898570c5a6e2f0cc011d892b4a9654a63c2b57c0 // minimap2 options minimap2_ont_model = null diff --git a/subworkflows/local/phasing_haplotyping.nf b/subworkflows/local/phasing_haplotyping.nf index d7987b29..935be201 100644 --- a/subworkflows/local/phasing_haplotyping.nf +++ b/subworkflows/local/phasing_haplotyping.nf @@ -106,18 +106,7 @@ workflow PHASING_HAPLOTYPING { ) } - // PHASING - if (!params.skip_modcall) { - normal_bams_w_tumoronly_ch - .join(germline_vcf) - .join(LONGPHASE_MODCALL_GERMLINE.out.mod_vcf) - .map { meta, bam, bai, vcf, _tbi, mods-> - def svs = [] - return [ meta, bam, bai, vcf, svs, mods ] - } - .set{ longphase_phase_germline_input_ch } - - germline_vcf + germline_vcf .join(somatic_vcf) .map { meta, germline_vcf, germline_tbi, somatic_vcf, somatic_tbi -> def vcfs = [somatic_vcf, germline_vcf] @@ -132,6 +121,17 @@ workflow PHASING_HAPLOTYPING { BCFTOOLS_SORT.out.vcf .set{germline_somatic_vcfs} + // PHASING + if (!params.skip_modcall) { + normal_bams_w_tumoronly_ch + .join(germline_vcf) + .join(LONGPHASE_MODCALL_GERMLINE.out.mod_vcf) + .map { meta, bam, bai, vcf, _tbi, mods-> + def svs = [] + return [ meta, bam, bai, vcf, svs, mods ] + } + .set{ longphase_phase_germline_input_ch } + tumor_bams_ch .join(germline_somatic_vcfs) .join(LONGPHASE_MODCALL_SOMATIC.out.mod_vcf) @@ -153,7 +153,6 @@ workflow PHASING_HAPLOTYPING { tumor_bams_ch .join(germline_somatic_vcfs) - .join(LONGPHASE_MODCALL_SOMATIC.out.mod_vcf) .map { meta, bam, bai, vcf -> def svs = [] def mods = [] @@ -180,7 +179,7 @@ workflow PHASING_HAPLOTYPING { LONGPHASE_PHASE_SOMATIC.out.snv_vcf .join(LONGPHASE_PHASE_SOMATIC.out.snv_vcf_index) - .set{ phased_germline_vcf } + .set{ phased_somatic_vcf } // HAPLOTAGING // remove type for merging @@ -293,4 +292,5 @@ workflow PHASING_HAPLOTYPING { emit: tumor_normal_hapbams_ch phased_germline_vcf + phased_somatic_vcf } diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf index 6fe9de8a..2dab2726 100644 --- a/subworkflows/local/tumor_only/tumoronly_smallvar.nf +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -97,7 +97,7 @@ workflow TUMORONLY_SMALLVAR { } // COMBINE GERMLINE VARIANTS - if (params.germline_var_keep != 'clair' | params.germline_var_keep != 'deepvariant' ) { + if (params.germline_var_keep != 'clair' && params.germline_var_keep != 'deepvariant' ) { clairsto_germline_ch .mix(deepvariant_ch) .set{combined_germline_ch} @@ -146,7 +146,7 @@ workflow TUMORONLY_SMALLVAR { .set{deepsomatic_ch} } // COMBINE SOMATIC VARIATION - if (params.somatic_var_keep != 'clair' | params.somatic_var_keep != 'deepvariant' ) { + if (params.somatic_var_keep != 'clair' && params.somatic_var_keep != 'deepvariant' ) { clairsto_somatic_ch .mix(deepsomatic_ch) .set{combined_somatic_ch} diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 4d678311..7f3ef224 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,615 +1,18 @@ { "-profile test": { "content": [ - { - "BCFTOOLS_ANNOTATE": { - "bcftools": 1.22 - }, - "BCFTOOLS_CONCAT": { - "bcftools": 1.22 - }, - "BCFTOOLS_ISEC": { - "bcftools": 1.22 - }, - "BCFTOOLS_NORM": { - "bcftools": 1.22 - }, - "BCFTOOLS_QUERY": { - "bcftools": 1.22 - }, - "BCFTOOLS_SORT": { - "bcftools": 1.22 - }, - "CLAIR3": { - "clair3": "1.2.0" - }, - "CLAIRS": { - "clairs": "0.4.4" - }, - "CLAIRSTO": { - "clairsto": "0.4.2" - }, - "CRAMINO_POST": { - "cramino": "1.3.0" - }, - "CRAMINO_PRE": { - "cramino": "1.3.0" - }, - "DEEPSOMATIC_CALLVARIANTS": { - "deepsomatic": "1.7.0" - }, - "DEEPSOMATIC_MAKEEXAMPLES": { - "deepsomatic": "1.7.0" - }, - "DEEPSOMATIC_POSTPROCESSVARIANTS": { - "deepsomatic": "1.7.0" - }, - "DEEPVARIANT_CALLVARIANTS": { - "deepvariant": "1.9.0" - }, - "DEEPVARIANT_MAKEEXAMPLES": { - "deepvariant": "1.9.0" - }, - "DEEPVARIANT_POSTPROCESSVARIANTS": { - "deepvariant": "1.9.0" - }, - "GERMLINE_VEP": { - "ensemblvep": 115.2, - "perl-math-cdf": 0.1, - "tabix": 1.21 - }, - "METAEXTRACT": { - "samtools": 1.21 - }, - "MINIMAP2_ALIGN": { - "minimap2": "2.29-r1283" - }, - "MOSDEPTH": { - "mosdepth": "0.3.11" - }, - "SAMTOOLS_FAIDX": { - "samtools": "1.22.1" - }, - "SAMTOOLS_FLAGSTAT": { - "samtools": "1.22.1" - }, - "SAMTOOLS_IDXSTATS": { - "samtools": "1.22.1" - }, - "SAMTOOLS_INDEX": { - "samtools": "1.22.1" - }, - "SAMTOOLS_STATS": { - "samtools": "1.22.1" - }, - "SEVERUS": { - "severus": 1.6 - }, - "SOMATIC_VEP": { - "ensemblvep": 115.2, - "perl-math-cdf": 0.1, - "tabix": 1.21 - }, - "SV_VEP": { - "ensemblvep": 115.2, - "perl-math-cdf": 0.1, - "tabix": 1.21 - }, - "UNTAR": { - "untar": 1.34 - }, - "UNZIP_FASTA": { - "pigz": 2.8 - }, - "VCFSPLIT": { - "bcftools": 1.2 - }, - "WGET": { - "wget": "1.21.4" - }, - "WHATSHAP_STATS": { - "whatshap": 2.8 - }, - "Workflow": { - "IntGenomicsLab/lrsomatic": "v1.1.0dev" - } - }, + null, [ - "multiqc", - "multiqc/multiqc_data", - "multiqc/multiqc_data/llms-full.txt", - "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", - "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", - "multiqc/multiqc_data/mosdepth_cov_dist.txt", - "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", - "multiqc/multiqc_data/mosdepth_perchrom.txt", - "multiqc/multiqc_data/multiqc.log", - "multiqc/multiqc_data/multiqc.parquet", - "multiqc/multiqc_data/multiqc_citations.txt", - "multiqc/multiqc_data/multiqc_data.json", - "multiqc/multiqc_data/multiqc_general_stats.txt", - "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", - "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", - "multiqc/multiqc_data/multiqc_samtools_stats.txt", - "multiqc/multiqc_data/multiqc_software_versions.txt", - "multiqc/multiqc_data/multiqc_sources.txt", - "multiqc/multiqc_data/multiqc_whatshap_phased_bp_plot.txt", - "multiqc/multiqc_data/multiqc_whatshap_stats.txt", - "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", - "multiqc/multiqc_data/samtools-flagstat-table.txt", - "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", - "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", - "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", - "multiqc/multiqc_data/samtools-stats-dp.txt", - "multiqc/multiqc_data/samtools_alignment_plot.txt", - "multiqc/multiqc_data/whatshap-stats-table.txt", - "multiqc/multiqc_plots", - "multiqc/multiqc_plots/pdf", - "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", - "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", - "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", - "multiqc/multiqc_plots/pdf/multiqc_whatshap_phased_bp_plot.pdf", - "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", - "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", - "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", - "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", - "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", - "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", - "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", - "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", - "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", - "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", - "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", - "multiqc/multiqc_plots/pdf/whatshap-stats-table.pdf", - "multiqc/multiqc_plots/png", - "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", - "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", - "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", - "multiqc/multiqc_plots/png/multiqc_whatshap_phased_bp_plot.png", - "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", - "multiqc/multiqc_plots/png/samtools-flagstat-table.png", - "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", - "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png", - "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png", - "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png", - "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png", - "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png", - "multiqc/multiqc_plots/png/samtools-stats-dp.png", - "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", - "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", - "multiqc/multiqc_plots/png/whatshap-stats-table.png", - "multiqc/multiqc_plots/svg", - "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", - "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", - "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", - "multiqc/multiqc_plots/svg/multiqc_whatshap_phased_bp_plot.svg", - "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", - "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", - "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", - "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", - "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", - "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", - "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", - "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", - "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", - "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", - "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", - "multiqc/multiqc_plots/svg/whatshap-stats-table.svg", - "multiqc/multiqc_report.html", - "pipeline_info", - "pipeline_info/lrsomatic_software_mqc_versions.yml", - "sample1", - "sample1/bamfiles", - "sample1/bamfiles/sample1_normal.bam", - "sample1/bamfiles/sample1_normal.bam.bai", - "sample1/bamfiles/sample1_tumor.bam", - "sample1/bamfiles/sample1_tumor.bam.bai", - "sample1/qc", - "sample1/qc/normal", - "sample1/qc/normal/cramino_aln", - "sample1/qc/normal/cramino_aln/sample1_normal_cramino.txt", - "sample1/qc/normal/cramino_ubam_1", - "sample1/qc/normal/cramino_ubam_1/sample1_normal_cramino.txt", - "sample1/qc/normal/mosdepth", - "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", - "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", - "sample1/qc/normal/nanoplot_aln", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoPlot-report.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoStats.txt", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", - "sample1/qc/normal/nanoplot_ubam_1", - "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_NanoPlot-report.html", - "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_NanoStats.txt", - "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_WeightedHistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Yield_By_Length.html", - "sample1/qc/normal/samtools", - "sample1/qc/normal/samtools/sample1.flagstat", - "sample1/qc/normal/samtools/sample1.idxstats", - "sample1/qc/normal/samtools/sample1.stats", - "sample1/qc/tumor", - "sample1/qc/tumor/cramino_aln", - "sample1/qc/tumor/cramino_aln/sample1_tumor_cramino.txt", - "sample1/qc/tumor/cramino_ubam_1", - "sample1/qc/tumor/cramino_ubam_1/sample1_tumor_cramino.txt", - "sample1/qc/tumor/mosdepth", - "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", - "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", - "sample1/qc/tumor/nanoplot_aln", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoPlot-report.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoStats.txt", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", - "sample1/qc/tumor/nanoplot_ubam_1", - "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_NanoPlot-report.html", - "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_NanoStats.txt", - "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_WeightedHistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Yield_By_Length.html", - "sample1/qc/tumor/samtools", - "sample1/qc/tumor/samtools/sample1.flagstat", - "sample1/qc/tumor/samtools/sample1.idxstats", - "sample1/qc/tumor/samtools/sample1.stats", - "sample1/qc/whatshap_stats", - "sample1/qc/whatshap_stats/sample1_whatshap_stats.gtf", - "sample1/qc/whatshap_stats/sample1_whatshap_stats.log", - "sample1/qc/whatshap_stats/sample1_whatshap_stats.tsv", - "sample1/variants", - "sample1/variants/clair3", - "sample1/variants/clair3/merge_output.vcf.gz", - "sample1/variants/clair3/merge_output.vcf.gz.tbi", - "sample1/variants/clairs", - "sample1/variants/clairs/indel.vcf.gz", - "sample1/variants/clairs/indel.vcf.gz.tbi", - "sample1/variants/clairs/snvs.vcf.gz", - "sample1/variants/clairs/snvs.vcf.gz.tbi", - "sample1/variants/deepsomatic", - "sample1/variants/deepsomatic/sample1.vcf.gz", - "sample1/variants/deepsomatic/sample1.vcf.gz.tbi", - "sample1/variants/deepvariant", - "sample1/variants/deepvariant/sample1.g.vcf.gz", - "sample1/variants/deepvariant/sample1.g.vcf.gz.tbi", - "sample1/variants/deepvariant/sample1.vcf.gz", - "sample1/variants/deepvariant/sample1.vcf.gz.tbi", - "sample1/variants/phased", - "sample1/variants/phased/germline_smallvariants.vcf.gz", - "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", - "sample1/variants/phased/germline_smallvariants_mod.vcf.gz", - "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", - "sample1/variants/phased/somatic_smallvariants.vcf.gz", - "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", - "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz", - "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", - "sample1/variants/severus", - "sample1/variants/severus/all_SVs", - "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/all_SVs/severus_all.vcf.gz", - "sample1/variants/severus/breakpoints_double.csv", - "sample1/variants/severus/read_ids.csv", - "sample1/variants/severus/read_qual.txt", - "sample1/variants/severus/severus.log", - "sample1/variants/severus/somatic_SVs", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample1/vep", - "sample1/vep/SVs", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", - "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", - "sample1/vep/germline", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", - "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", - "sample1/vep/somatic", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", - "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", - "sample2", - "sample2/bamfiles", - "sample2/bamfiles/sample2_normal.bam", - "sample2/bamfiles/sample2_normal.bam.bai", - "sample2/bamfiles/sample2_tumor.bam", - "sample2/bamfiles/sample2_tumor.bam.bai", - "sample2/qc", - "sample2/qc/normal", - "sample2/qc/normal/cramino_aln", - "sample2/qc/normal/cramino_aln/sample2_normal_cramino.txt", - "sample2/qc/normal/cramino_ubam_1", - "sample2/qc/normal/cramino_ubam_1/sample2_normal_cramino.txt", - "sample2/qc/normal/mosdepth", - "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", - "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", - "sample2/qc/normal/nanoplot_aln", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoPlot-report.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoStats.txt", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", - "sample2/qc/normal/nanoplot_ubam_1", - "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_NanoPlot-report.html", - "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_NanoStats.txt", - "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_WeightedHistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Yield_By_Length.html", - "sample2/qc/normal/samtools", - "sample2/qc/normal/samtools/sample2.flagstat", - "sample2/qc/normal/samtools/sample2.idxstats", - "sample2/qc/normal/samtools/sample2.stats", - "sample2/qc/tumor", - "sample2/qc/tumor/cramino_aln", - "sample2/qc/tumor/cramino_aln/sample2_tumor_cramino.txt", - "sample2/qc/tumor/cramino_ubam_1", - "sample2/qc/tumor/cramino_ubam_1/sample2_tumor_cramino.txt", - "sample2/qc/tumor/mosdepth", - "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", - "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", - "sample2/qc/tumor/nanoplot_aln", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoPlot-report.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoStats.txt", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", - "sample2/qc/tumor/nanoplot_ubam_1", - "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_NanoPlot-report.html", - "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_NanoStats.txt", - "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_WeightedHistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Yield_By_Length.html", - "sample2/qc/tumor/samtools", - "sample2/qc/tumor/samtools/sample2.flagstat", - "sample2/qc/tumor/samtools/sample2.idxstats", - "sample2/qc/tumor/samtools/sample2.stats", - "sample2/qc/whatshap_stats", - "sample2/qc/whatshap_stats/sample2_whatshap_stats.gtf", - "sample2/qc/whatshap_stats/sample2_whatshap_stats.log", - "sample2/qc/whatshap_stats/sample2_whatshap_stats.tsv", - "sample2/variants", - "sample2/variants/clair3", - "sample2/variants/clair3/merge_output.vcf.gz", - "sample2/variants/clair3/merge_output.vcf.gz.tbi", - "sample2/variants/clairs", - "sample2/variants/clairs/indel.vcf.gz", - "sample2/variants/clairs/indel.vcf.gz.tbi", - "sample2/variants/clairs/snvs.vcf.gz", - "sample2/variants/clairs/snvs.vcf.gz.tbi", - "sample2/variants/deepsomatic", - "sample2/variants/deepsomatic/sample2.vcf.gz", - "sample2/variants/deepsomatic/sample2.vcf.gz.tbi", - "sample2/variants/deepvariant", - "sample2/variants/deepvariant/sample2.g.vcf.gz", - "sample2/variants/deepvariant/sample2.g.vcf.gz.tbi", - "sample2/variants/deepvariant/sample2.vcf.gz", - "sample2/variants/deepvariant/sample2.vcf.gz.tbi", - "sample2/variants/phased", - "sample2/variants/phased/germline_smallvariants.vcf.gz", - "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", - "sample2/variants/phased/germline_smallvariants_mod.vcf.gz", - "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", - "sample2/variants/phased/somatic_smallvariants.vcf.gz", - "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", - "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz", - "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", - "sample2/variants/severus", - "sample2/variants/severus/all_SVs", - "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/all_SVs/severus_all.vcf.gz", - "sample2/variants/severus/breakpoints_double.csv", - "sample2/variants/severus/read_ids.csv", - "sample2/variants/severus/read_qual.txt", - "sample2/variants/severus/severus.log", - "sample2/variants/severus/somatic_SVs", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample2/vep", - "sample2/vep/SVs", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", - "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", - "sample2/vep/germline", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", - "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", - "sample2/vep/somatic", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", - "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", - "sample3", - "sample3/bamfiles", - "sample3/bamfiles/sample3_tumor.bam", - "sample3/bamfiles/sample3_tumor.bam.bai", - "sample3/qc", - "sample3/qc/tumor", - "sample3/qc/tumor/cramino_aln", - "sample3/qc/tumor/cramino_aln/sample3_tumor_cramino.txt", - "sample3/qc/tumor/cramino_ubam_1", - "sample3/qc/tumor/cramino_ubam_1/sample3_tumor_cramino.txt", - "sample3/qc/tumor/mosdepth", - "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", - "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", - "sample3/qc/tumor/nanoplot_aln", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoPlot-report.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoStats.txt", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", - "sample3/qc/tumor/nanoplot_ubam_1", - "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_NanoPlot-report.html", - "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_NanoStats.txt", - "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_WeightedHistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", - "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Yield_By_Length.html", - "sample3/qc/tumor/samtools", - "sample3/qc/tumor/samtools/sample3.flagstat", - "sample3/qc/tumor/samtools/sample3.idxstats", - "sample3/qc/tumor/samtools/sample3.stats", - "sample3/qc/whatshap_stats", - "sample3/qc/whatshap_stats/sample3_whatshap_stats.gtf", - "sample3/qc/whatshap_stats/sample3_whatshap_stats.log", - "sample3/qc/whatshap_stats/sample3_whatshap_stats.tsv", - "sample3/variants", - "sample3/variants/clairsto", - "sample3/variants/clairsto/germline.vcf.gz", - "sample3/variants/clairsto/germline.vcf.gz.tbi", - "sample3/variants/clairsto/indel.vcf.gz", - "sample3/variants/clairsto/indel.vcf.gz.tbi", - "sample3/variants/clairsto/snv.vcf.gz", - "sample3/variants/clairsto/snv.vcf.gz.tbi", - "sample3/variants/clairsto/somatic.vcf.gz", - "sample3/variants/clairsto/somatic.vcf.gz.tbi", - "sample3/variants/deepsomatic", - "sample3/variants/deepsomatic/sample3.vcf.gz", - "sample3/variants/deepsomatic/sample3.vcf.gz.tbi", - "sample3/variants/deepvariant", - "sample3/variants/deepvariant/sample3.g.vcf.gz", - "sample3/variants/deepvariant/sample3.g.vcf.gz.tbi", - "sample3/variants/deepvariant/sample3.vcf.gz", - "sample3/variants/deepvariant/sample3.vcf.gz.tbi", - "sample3/variants/phased", - "sample3/variants/phased/germline_smallvariants.vcf.gz", - "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", - "sample3/variants/phased/germline_smallvariants_mod.vcf.gz", - "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", - "sample3/variants/phased/somatic_smallvariants.vcf.gz", - "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", - "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz", - "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", - "sample3/variants/severus", - "sample3/variants/severus/all_SVs", - "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/all_SVs/severus_all.vcf.gz", - "sample3/variants/severus/breakpoints_double.csv", - "sample3/variants/severus/read_ids.csv", - "sample3/variants/severus/read_qual.txt", - "sample3/variants/severus/severus.log", - "sample3/variants/severus/somatic_SVs", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", - "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", - "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", - "sample3/vep", - "sample3/vep/SVs", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", - "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", - "sample3/vep/germline", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", - "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", - "sample3/vep/somatic", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", - "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" + "pipeline_info" ], [ - "sample1_normal.bam:md5,92a00e311e085a34d443cb64694ce839", - "sample1_normal.bam.bai:md5,c7dff8adc4c8d33a81fb8ea7dff4a98e", - "sample1_tumor.bam:md5,c6c79808f928393b23ae53976a7304c3", - "sample1_tumor.bam.bai:md5,317d711c0c26d2cfb933ad53b69da1d7", - "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", - "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", - "sample1.stats:md5,70fabbdc07dec0479b3fc7dcec344054", - "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", - "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", - "sample1.stats:md5,5012c82d3d3ca60ffdd2fb970f772566", - "sample1.vcf.gz:md5,92c0fa9016c3d8b192eb382fd6a81199", - "sample1.vcf.gz.tbi:md5,04e82577dc57f80b9db25897389364b2", - "sample1.g.vcf.gz:md5,5ed06f35ccecf7aadbec54873dc07e64", - "sample1.g.vcf.gz.tbi:md5,ca628ef368d34a7a6c77098a4c4bdf36", - "sample1.vcf.gz:md5,ad971a535d2b8014fabdabe72995a5db", - "sample1.vcf.gz.tbi:md5,65de5caace8d4312afa707c3bfd6fa45", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,d63f058075bfe791248954ca2ee6c4fb", - "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample2_normal.bam:md5,ed6aab4d2ef70537390a0ce85276ad2c", - "sample2_normal.bam.bai:md5,fb92c167c63e7f62d0c4c3fea8bd1b60", - "sample2_tumor.bam:md5,10c29ced5ed253731ca50097d9c848e3", - "sample2_tumor.bam.bai:md5,e0aa6d8d594070e753145503520fffab", - "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", - "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", - "sample2.stats:md5,87cb6e9adf8a133244e8b331be43bb14", - "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", - "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", - "sample2.stats:md5,1e044857eeefb284fda88ee58ff7a04a", - "sample2.vcf.gz:md5,f9d6266ee49c2544dc28eef0cdd9dcae", - "sample2.vcf.gz.tbi:md5,433ecd219947787d00dd0fada6307661", - "sample2.g.vcf.gz:md5,7998d15ce582ec94e86568e3fae654f9", - "sample2.g.vcf.gz.tbi:md5,9498e3266900eee2448ff05b0bce87c0", - "sample2.vcf.gz:md5,33330d8444a1774864883b33e1e2235c", - "sample2.vcf.gz.tbi:md5,384b8b5ea7c1559b464031f8e0863532", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,a68d7fc9c7a7cb2f31e73189c5412f7b", - "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,5020a416186da412d9e89f7efac64178", - "sample3_tumor.bam.bai:md5,fc26fd7d9b388e6551898aacf5ed0c7b", - "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", - "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", - "sample3.stats:md5,d7a8552a8a41a217954a0c825d468a60", - "sample3.vcf.gz:md5,ee4f7a5bbd471c1370accf888b8262c0", - "sample3.vcf.gz.tbi:md5,944349ec46ecc95bab7db2f6848d0c36", - "sample3.g.vcf.gz:md5,64adc407ef2434254e76763b72c67b08", - "sample3.g.vcf.gz.tbi:md5,ac0397f7a840cf618d56f097defba878", - "sample3.vcf.gz:md5,9c52a803d796157a08b565c653d4685c", - "sample3.vcf.gz.tbi:md5,f0b3599e4281a6f3bbb8bc408740e58e", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,46e03bf2d67aa736b599f00fe7f01e06", - "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", - "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", - "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" + ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-24T11:55:01.760175088" + "timestamp": "2026-03-24T14:22:30.952285683" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 35d03626..3e600273 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -96,7 +96,7 @@ workflow LRSOMATIC { params.vep_genome = getGenomeAttribute('vep_genome') params.vep_species = getGenomeAttribute('vep_species') - if (params.pons_vcfs != null) { + if (params.pon_vcfs != null) { pon_files = params.pon_vcfs.collect { file(it) } pon_flags = params.pon_flags } @@ -487,14 +487,14 @@ workflow LRSOMATIC { ) - ch_somatic_vcf + PHASING_HAPLOTYPING.out.phased_somatic_vcf .map { meta, vcf, _tbi -> def extra = [] return [meta, vcf, extra] } .set { somatic_vep } - ch_germline_vcf + PHASING_HAPLOTYPING.out.phased_germline_vcf .map { meta, vcf, _tbi -> def extra = [] return [meta, vcf, extra] From bf44b0ad9223529ff5f37427d3a9519ac2ff0126 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 14:56:07 +0100 Subject: [PATCH 158/183] update snap --- tests/default.nf.test.snap | 614 ++++++++++++++++++++++++++++++++++++- 1 file changed, 610 insertions(+), 4 deletions(-) diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 7f3ef224..6b04accb 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,18 +1,624 @@ { "-profile test": { "content": [ - null, + { + "BCFTOOLS_ANNOTATE": { + "bcftools": 1.22 + }, + "BCFTOOLS_CONCAT": { + "bcftools": 1.22 + }, + "BCFTOOLS_ISEC": { + "bcftools": 1.22 + }, + "BCFTOOLS_NORM": { + "bcftools": 1.22 + }, + "BCFTOOLS_QUERY": { + "bcftools": 1.22 + }, + "BCFTOOLS_SORT": { + "bcftools": 1.22 + }, + "CLAIR3": { + "clair3": "1.2.0" + }, + "CLAIRS": { + "clairs": "0.4.4" + }, + "CLAIRSTO": { + "clairsto": "0.4.2" + }, + "CRAMINO_POST": { + "cramino": "1.3.0" + }, + "CRAMINO_PRE": { + "cramino": "1.3.0" + }, + "DEEPSOMATIC_CALLVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_MAKEEXAMPLES": { + "deepsomatic": "1.7.0" + }, + "DEEPSOMATIC_POSTPROCESSVARIANTS": { + "deepsomatic": "1.7.0" + }, + "DEEPVARIANT_CALLVARIANTS": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_MAKEEXAMPLES": { + "deepvariant": "1.9.0" + }, + "DEEPVARIANT_POSTPROCESSVARIANTS": { + "deepvariant": "1.9.0" + }, + "GERMLINE_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "METAEXTRACT": { + "samtools": 1.21 + }, + "MINIMAP2_ALIGN": { + "minimap2": "2.29-r1283" + }, + "MOSDEPTH": { + "mosdepth": "0.3.11" + }, + "SAMTOOLS_FAIDX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_FLAGSTAT": { + "samtools": "1.22.1" + }, + "SAMTOOLS_IDXSTATS": { + "samtools": "1.22.1" + }, + "SAMTOOLS_INDEX": { + "samtools": "1.22.1" + }, + "SAMTOOLS_STATS": { + "samtools": "1.22.1" + }, + "SEVERUS": { + "severus": 1.6 + }, + "SOMATIC_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "SV_VEP": { + "ensemblvep": 115.2, + "perl-math-cdf": 0.1, + "tabix": 1.21 + }, + "UNTAR": { + "untar": 1.34 + }, + "UNZIP_FASTA": { + "pigz": 2.8 + }, + "VCFSPLIT": { + "bcftools": 1.2 + }, + "WGET": { + "wget": "1.21.4" + }, + "WHATSHAP_STATS": { + "whatshap": 2.8 + }, + "Workflow": { + "IntGenomicsLab/lrsomatic": "v1.1.0dev" + } + }, [ - "pipeline_info" + "multiqc", + "multiqc/multiqc_data", + "multiqc/multiqc_data/llms-full.txt", + "multiqc/multiqc_data/mosdepth-coverage-per-contig-single.txt", + "multiqc/multiqc_data/mosdepth-cumcoverage-dist-id.txt", + "multiqc/multiqc_data/mosdepth_cov_dist.txt", + "multiqc/multiqc_data/mosdepth_cumcov_dist.txt", + "multiqc/multiqc_data/mosdepth_perchrom.txt", + "multiqc/multiqc_data/multiqc.log", + "multiqc/multiqc_data/multiqc.parquet", + "multiqc/multiqc_data/multiqc_citations.txt", + "multiqc/multiqc_data/multiqc_data.json", + "multiqc/multiqc_data/multiqc_general_stats.txt", + "multiqc/multiqc_data/multiqc_samtools_flagstat.txt", + "multiqc/multiqc_data/multiqc_samtools_idxstats.txt", + "multiqc/multiqc_data/multiqc_samtools_stats.txt", + "multiqc/multiqc_data/multiqc_software_versions.txt", + "multiqc/multiqc_data/multiqc_sources.txt", + "multiqc/multiqc_data/multiqc_whatshap_phased_bp_plot.txt", + "multiqc/multiqc_data/multiqc_whatshap_stats.txt", + "multiqc/multiqc_data/samtools-flagstat-pct-table.txt", + "multiqc/multiqc_data/samtools-flagstat-table.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Normalised_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts.txt", + "multiqc/multiqc_data/samtools-idxstats-mapped-reads-plot_Raw_Counts.txt", + "multiqc/multiqc_data/samtools-stats-dp.txt", + "multiqc/multiqc_data/samtools_alignment_plot.txt", + "multiqc/multiqc_data/whatshap-stats-table.txt", + "multiqc/multiqc_plots", + "multiqc/multiqc_plots/pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-cnt.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-coverage-per-contig-single-pct.pdf", + "multiqc/multiqc_plots/pdf/mosdepth-cumcoverage-dist-id.pdf", + "multiqc/multiqc_plots/pdf/multiqc_whatshap_phased_bp_plot.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-pct-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-flagstat-table.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.pdf", + "multiqc/multiqc_plots/pdf/samtools-stats-dp.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-cnt.pdf", + "multiqc/multiqc_plots/pdf/samtools_alignment_plot-pct.pdf", + "multiqc/multiqc_plots/pdf/whatshap-stats-table.pdf", + "multiqc/multiqc_plots/png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-cnt.png", + "multiqc/multiqc_plots/png/mosdepth-coverage-per-contig-single-pct.png", + "multiqc/multiqc_plots/png/mosdepth-cumcoverage-dist-id.png", + "multiqc/multiqc_plots/png/multiqc_whatshap_phased_bp_plot.png", + "multiqc/multiqc_plots/png/samtools-flagstat-pct-table.png", + "multiqc/multiqc_plots/png/samtools-flagstat-table.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.png", + "multiqc/multiqc_plots/png/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.png", + "multiqc/multiqc_plots/png/samtools-stats-dp.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-cnt.png", + "multiqc/multiqc_plots/png/samtools_alignment_plot-pct.png", + "multiqc/multiqc_plots/png/whatshap-stats-table.png", + "multiqc/multiqc_plots/svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-cnt.svg", + "multiqc/multiqc_plots/svg/mosdepth-coverage-per-contig-single-pct.svg", + "multiqc/multiqc_plots/svg/mosdepth-cumcoverage-dist-id.svg", + "multiqc/multiqc_plots/svg/multiqc_whatshap_phased_bp_plot.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-pct-table.svg", + "multiqc/multiqc_plots/svg/samtools-flagstat-table.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Normalised_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Observed_over_Expected_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-cnt.svg", + "multiqc/multiqc_plots/svg/samtools-idxstats-mapped-reads-plot_Raw_Counts-log.svg", + "multiqc/multiqc_plots/svg/samtools-stats-dp.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-cnt.svg", + "multiqc/multiqc_plots/svg/samtools_alignment_plot-pct.svg", + "multiqc/multiqc_plots/svg/whatshap-stats-table.svg", + "multiqc/multiqc_report.html", + "pipeline_info", + "pipeline_info/lrsomatic_software_mqc_versions.yml", + "sample1", + "sample1/bamfiles", + "sample1/bamfiles/sample1_normal.bam", + "sample1/bamfiles/sample1_normal.bam.bai", + "sample1/bamfiles/sample1_tumor.bam", + "sample1/bamfiles/sample1_tumor.bam.bai", + "sample1/qc", + "sample1/qc/normal", + "sample1/qc/normal/cramino_aln", + "sample1/qc/normal/cramino_aln/sample1_normal_cramino.txt", + "sample1/qc/normal/cramino_ubam_1", + "sample1/qc/normal/cramino_ubam_1/sample1_normal_cramino.txt", + "sample1/qc/normal/mosdepth", + "sample1/qc/normal/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/normal/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/normal/nanoplot_aln", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_NanoStats.txt", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_aln/sample1_normal_aln_Yield_By_Length.html", + "sample1/qc/normal/nanoplot_ubam_1", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_NanoPlot-report.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_NanoStats.txt", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_WeightedHistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/normal/nanoplot_ubam_1/sample1_normal_ubam_Yield_By_Length.html", + "sample1/qc/normal/samtools", + "sample1/qc/normal/samtools/sample1.flagstat", + "sample1/qc/normal/samtools/sample1.idxstats", + "sample1/qc/normal/samtools/sample1.stats", + "sample1/qc/tumor", + "sample1/qc/tumor/cramino_aln", + "sample1/qc/tumor/cramino_aln/sample1_tumor_cramino.txt", + "sample1/qc/tumor/cramino_ubam_1", + "sample1/qc/tumor/cramino_ubam_1/sample1_tumor_cramino.txt", + "sample1/qc/tumor/mosdepth", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.global.dist.txt", + "sample1/qc/tumor/mosdepth/sample1.mosdepth.summary.txt", + "sample1/qc/tumor/nanoplot_aln", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_NanoStats.txt", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_aln/sample1_tumor_aln_Yield_By_Length.html", + "sample1/qc/tumor/nanoplot_ubam_1", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_NanoPlot-report.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_NanoStats.txt", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_WeightedHistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample1/qc/tumor/nanoplot_ubam_1/sample1_tumor_ubam_Yield_By_Length.html", + "sample1/qc/tumor/samtools", + "sample1/qc/tumor/samtools/sample1.flagstat", + "sample1/qc/tumor/samtools/sample1.idxstats", + "sample1/qc/tumor/samtools/sample1.stats", + "sample1/qc/whatshap_stats", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.gtf", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.log", + "sample1/qc/whatshap_stats/sample1_whatshap_stats.tsv", + "sample1/variants", + "sample1/variants/clair3", + "sample1/variants/clair3/merge_output.vcf.gz", + "sample1/variants/clair3/merge_output.vcf.gz.tbi", + "sample1/variants/clairs", + "sample1/variants/clairs/indel.vcf.gz", + "sample1/variants/clairs/indel.vcf.gz.tbi", + "sample1/variants/clairs/snvs.vcf.gz", + "sample1/variants/clairs/snvs.vcf.gz.tbi", + "sample1/variants/deepsomatic", + "sample1/variants/deepsomatic/sample1.vcf.gz", + "sample1/variants/deepsomatic/sample1.vcf.gz.tbi", + "sample1/variants/deepvariant", + "sample1/variants/deepvariant/sample1.g.vcf.gz", + "sample1/variants/deepvariant/sample1.g.vcf.gz.tbi", + "sample1/variants/deepvariant/sample1.vcf.gz", + "sample1/variants/deepvariant/sample1.vcf.gz.tbi", + "sample1/variants/phased", + "sample1/variants/phased/germline_smallvariants.vcf.gz", + "sample1/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample1/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample1/variants/phased/somatic_smallvariants.vcf.gz", + "sample1/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz", + "sample1/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", + "sample1/variants/severus", + "sample1/variants/severus/all_SVs", + "sample1/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/all_SVs/severus_all.vcf.gz", + "sample1/variants/severus/breakpoints_double.csv", + "sample1/variants/severus/read_ids.csv", + "sample1/variants/severus/read_qual.txt", + "sample1/variants/severus/severus.log", + "sample1/variants/severus/somatic_SVs", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample1/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample1/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample1/vep", + "sample1/vep/SVs", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz.tbi", + "sample1/vep/SVs/sample1_SV_VEP.vcf.gz_summary.html", + "sample1/vep/germline", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz.tbi", + "sample1/vep/germline/sample1_GERMLINE_VEP.vcf.gz_summary.html", + "sample1/vep/somatic", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz.tbi", + "sample1/vep/somatic/sample1_SOMATIC_VEP.vcf.gz_summary.html", + "sample2", + "sample2/bamfiles", + "sample2/bamfiles/sample2_normal.bam", + "sample2/bamfiles/sample2_normal.bam.bai", + "sample2/bamfiles/sample2_tumor.bam", + "sample2/bamfiles/sample2_tumor.bam.bai", + "sample2/qc", + "sample2/qc/normal", + "sample2/qc/normal/cramino_aln", + "sample2/qc/normal/cramino_aln/sample2_normal_cramino.txt", + "sample2/qc/normal/cramino_ubam_1", + "sample2/qc/normal/cramino_ubam_1/sample2_normal_cramino.txt", + "sample2/qc/normal/mosdepth", + "sample2/qc/normal/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/normal/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/normal/nanoplot_aln", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_NanoStats.txt", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_aln/sample2_normal_aln_Yield_By_Length.html", + "sample2/qc/normal/nanoplot_ubam_1", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_NanoPlot-report.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_NanoStats.txt", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_WeightedHistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/normal/nanoplot_ubam_1/sample2_normal_ubam_Yield_By_Length.html", + "sample2/qc/normal/samtools", + "sample2/qc/normal/samtools/sample2.flagstat", + "sample2/qc/normal/samtools/sample2.idxstats", + "sample2/qc/normal/samtools/sample2.stats", + "sample2/qc/tumor", + "sample2/qc/tumor/cramino_aln", + "sample2/qc/tumor/cramino_aln/sample2_tumor_cramino.txt", + "sample2/qc/tumor/cramino_ubam_1", + "sample2/qc/tumor/cramino_ubam_1/sample2_tumor_cramino.txt", + "sample2/qc/tumor/mosdepth", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.global.dist.txt", + "sample2/qc/tumor/mosdepth/sample2.mosdepth.summary.txt", + "sample2/qc/tumor/nanoplot_aln", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_NanoStats.txt", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_aln/sample2_tumor_aln_Yield_By_Length.html", + "sample2/qc/tumor/nanoplot_ubam_1", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_NanoPlot-report.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_NanoStats.txt", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_WeightedHistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample2/qc/tumor/nanoplot_ubam_1/sample2_tumor_ubam_Yield_By_Length.html", + "sample2/qc/tumor/samtools", + "sample2/qc/tumor/samtools/sample2.flagstat", + "sample2/qc/tumor/samtools/sample2.idxstats", + "sample2/qc/tumor/samtools/sample2.stats", + "sample2/qc/whatshap_stats", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.gtf", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.log", + "sample2/qc/whatshap_stats/sample2_whatshap_stats.tsv", + "sample2/variants", + "sample2/variants/clair3", + "sample2/variants/clair3/merge_output.vcf.gz", + "sample2/variants/clair3/merge_output.vcf.gz.tbi", + "sample2/variants/clairs", + "sample2/variants/clairs/indel.vcf.gz", + "sample2/variants/clairs/indel.vcf.gz.tbi", + "sample2/variants/clairs/snvs.vcf.gz", + "sample2/variants/clairs/snvs.vcf.gz.tbi", + "sample2/variants/deepsomatic", + "sample2/variants/deepsomatic/sample2.vcf.gz", + "sample2/variants/deepsomatic/sample2.vcf.gz.tbi", + "sample2/variants/deepvariant", + "sample2/variants/deepvariant/sample2.g.vcf.gz", + "sample2/variants/deepvariant/sample2.g.vcf.gz.tbi", + "sample2/variants/deepvariant/sample2.vcf.gz", + "sample2/variants/deepvariant/sample2.vcf.gz.tbi", + "sample2/variants/phased", + "sample2/variants/phased/germline_smallvariants.vcf.gz", + "sample2/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample2/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample2/variants/phased/somatic_smallvariants.vcf.gz", + "sample2/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz", + "sample2/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", + "sample2/variants/severus", + "sample2/variants/severus/all_SVs", + "sample2/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/all_SVs/severus_all.vcf.gz", + "sample2/variants/severus/breakpoints_double.csv", + "sample2/variants/severus/read_ids.csv", + "sample2/variants/severus/read_qual.txt", + "sample2/variants/severus/severus.log", + "sample2/variants/severus/somatic_SVs", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample2/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample2/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample2/vep", + "sample2/vep/SVs", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz.tbi", + "sample2/vep/SVs/sample2_SV_VEP.vcf.gz_summary.html", + "sample2/vep/germline", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz.tbi", + "sample2/vep/germline/sample2_GERMLINE_VEP.vcf.gz_summary.html", + "sample2/vep/somatic", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz.tbi", + "sample2/vep/somatic/sample2_SOMATIC_VEP.vcf.gz_summary.html", + "sample3", + "sample3/bamfiles", + "sample3/bamfiles/sample3_tumor.bam", + "sample3/bamfiles/sample3_tumor.bam.bai", + "sample3/qc", + "sample3/qc/tumor", + "sample3/qc/tumor/cramino_aln", + "sample3/qc/tumor/cramino_aln/sample3_tumor_cramino.txt", + "sample3/qc/tumor/cramino_ubam_1", + "sample3/qc/tumor/cramino_ubam_1/sample3_tumor_cramino.txt", + "sample3/qc/tumor/mosdepth", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.global.dist.txt", + "sample3/qc/tumor/mosdepth/sample3.mosdepth.summary.txt", + "sample3/qc/tumor/nanoplot_aln", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_NanoStats.txt", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityHistogramDynamic_Histogram_percent_identity.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_dot.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_PercentIdentityvsAlignedReadLength_kde.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_aln/sample3_tumor_aln_Yield_By_Length.html", + "sample3/qc/tumor/nanoplot_ubam_1", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_NanoPlot-report.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_NanoStats.txt", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Non_weightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Non_weightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_WeightedHistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_WeightedLogTransformed_HistogramReadlength.html", + "sample3/qc/tumor/nanoplot_ubam_1/sample3_tumor_ubam_Yield_By_Length.html", + "sample3/qc/tumor/samtools", + "sample3/qc/tumor/samtools/sample3.flagstat", + "sample3/qc/tumor/samtools/sample3.idxstats", + "sample3/qc/tumor/samtools/sample3.stats", + "sample3/qc/whatshap_stats", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.gtf", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.log", + "sample3/qc/whatshap_stats/sample3_whatshap_stats.tsv", + "sample3/variants", + "sample3/variants/clairsto", + "sample3/variants/clairsto/germline.vcf.gz", + "sample3/variants/clairsto/germline.vcf.gz.tbi", + "sample3/variants/clairsto/indel.vcf.gz", + "sample3/variants/clairsto/indel.vcf.gz.tbi", + "sample3/variants/clairsto/snv.vcf.gz", + "sample3/variants/clairsto/snv.vcf.gz.tbi", + "sample3/variants/clairsto/somatic.vcf.gz", + "sample3/variants/clairsto/somatic.vcf.gz.tbi", + "sample3/variants/deepsomatic", + "sample3/variants/deepsomatic/sample3.vcf.gz", + "sample3/variants/deepsomatic/sample3.vcf.gz.tbi", + "sample3/variants/deepvariant", + "sample3/variants/deepvariant/sample3.g.vcf.gz", + "sample3/variants/deepvariant/sample3.g.vcf.gz.tbi", + "sample3/variants/deepvariant/sample3.vcf.gz", + "sample3/variants/deepvariant/sample3.vcf.gz.tbi", + "sample3/variants/phased", + "sample3/variants/phased/germline_smallvariants.vcf.gz", + "sample3/variants/phased/germline_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz", + "sample3/variants/phased/germline_smallvariants_mod.vcf.gz.tbi", + "sample3/variants/phased/somatic_smallvariants.vcf.gz", + "sample3/variants/phased/somatic_smallvariants.vcf.gz.tbi", + "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz", + "sample3/variants/phased/somatic_smallvariants_mod.vcf.gz.tbi", + "sample3/variants/severus", + "sample3/variants/severus/all_SVs", + "sample3/variants/severus/all_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/all_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/all_SVs/severus_all.vcf.gz", + "sample3/variants/severus/breakpoints_double.csv", + "sample3/variants/severus/read_ids.csv", + "sample3/variants/severus/read_qual.txt", + "sample3/variants/severus/severus.log", + "sample3/variants/severus/somatic_SVs", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters.tsv", + "sample3/variants/severus/somatic_SVs/breakpoint_clusters_list.tsv", + "sample3/variants/severus/somatic_SVs/severus_somatic.vcf.gz", + "sample3/vep", + "sample3/vep/SVs", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz.tbi", + "sample3/vep/SVs/sample3_SV_VEP.vcf.gz_summary.html", + "sample3/vep/germline", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz.tbi", + "sample3/vep/germline/sample3_GERMLINE_VEP.vcf.gz_summary.html", + "sample3/vep/somatic", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz.tbi", + "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - + "sample1_normal.bam:md5,92a00e311e085a34d443cb64694ce839", + "sample1_normal.bam.bai:md5,c7dff8adc4c8d33a81fb8ea7dff4a98e", + "sample1_tumor.bam:md5,c6c79808f928393b23ae53976a7304c3", + "sample1_tumor.bam.bai:md5,317d711c0c26d2cfb933ad53b69da1d7", + "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", + "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", + "sample1.stats:md5,70fabbdc07dec0479b3fc7dcec344054", + "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample1.stats:md5,5012c82d3d3ca60ffdd2fb970f772566", + "sample1_whatshap_stats.gtf:md5,32e249c78790982098e4b0a606171d69", + "sample1_whatshap_stats.log:md5,407b5fcdfbeec1830b2ed6f65f1c2c18", + "sample1_whatshap_stats.tsv:md5,41290e994b5e6dab5ed696925cbb0716", + "sample1.vcf.gz:md5,92c0fa9016c3d8b192eb382fd6a81199", + "sample1.vcf.gz.tbi:md5,04e82577dc57f80b9db25897389364b2", + "sample1.g.vcf.gz:md5,5ed06f35ccecf7aadbec54873dc07e64", + "sample1.g.vcf.gz.tbi:md5,ca628ef368d34a7a6c77098a4c4bdf36", + "sample1.vcf.gz:md5,ad971a535d2b8014fabdabe72995a5db", + "sample1.vcf.gz.tbi:md5,65de5caace8d4312afa707c3bfd6fa45", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,d63f058075bfe791248954ca2ee6c4fb", + "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample2_normal.bam:md5,ed6aab4d2ef70537390a0ce85276ad2c", + "sample2_normal.bam.bai:md5,fb92c167c63e7f62d0c4c3fea8bd1b60", + "sample2_tumor.bam:md5,10c29ced5ed253731ca50097d9c848e3", + "sample2_tumor.bam.bai:md5,e0aa6d8d594070e753145503520fffab", + "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", + "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", + "sample2.stats:md5,87cb6e9adf8a133244e8b331be43bb14", + "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", + "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", + "sample2.stats:md5,1e044857eeefb284fda88ee58ff7a04a", + "sample2_whatshap_stats.gtf:md5,af33281699a1d0da83fbe7eaff198d03", + "sample2_whatshap_stats.log:md5,8f5f400786f32871c16e523d9e236fc4", + "sample2_whatshap_stats.tsv:md5,e8b67840491b7d092ac3d5d91db0ff46", + "sample2.vcf.gz:md5,f9d6266ee49c2544dc28eef0cdd9dcae", + "sample2.vcf.gz.tbi:md5,433ecd219947787d00dd0fada6307661", + "sample2.g.vcf.gz:md5,7998d15ce582ec94e86568e3fae654f9", + "sample2.g.vcf.gz.tbi:md5,9498e3266900eee2448ff05b0bce87c0", + "sample2.vcf.gz:md5,33330d8444a1774864883b33e1e2235c", + "sample2.vcf.gz.tbi:md5,384b8b5ea7c1559b464031f8e0863532", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,a68d7fc9c7a7cb2f31e73189c5412f7b", + "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "sample3_tumor.bam:md5,5020a416186da412d9e89f7efac64178", + "sample3_tumor.bam.bai:md5,fc26fd7d9b388e6551898aacf5ed0c7b", + "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", + "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", + "sample3.stats:md5,d7a8552a8a41a217954a0c825d468a60", + "sample3_whatshap_stats.gtf:md5,415b20e0cc30409d24501d64b185dc49", + "sample3_whatshap_stats.log:md5,99a842c8f8f3259ec66b68e8fe0345e6", + "sample3_whatshap_stats.tsv:md5,a65d179e31756ae4127f0bf74da7e701", + "sample3.vcf.gz:md5,ee4f7a5bbd471c1370accf888b8262c0", + "sample3.vcf.gz.tbi:md5,944349ec46ecc95bab7db2f6848d0c36", + "sample3.g.vcf.gz:md5,64adc407ef2434254e76763b72c67b08", + "sample3.g.vcf.gz.tbi:md5,ac0397f7a840cf618d56f097defba878", + "sample3.vcf.gz:md5,9c52a803d796157a08b565c653d4685c", + "sample3.vcf.gz.tbi:md5,f0b3599e4281a6f3bbb8bc408740e58e", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", + "breakpoints_double.csv:md5,46e03bf2d67aa736b599f00fe7f01e06", + "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", + "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] ], "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-24T14:22:30.952285683" + "timestamp": "2026-03-24T14:54:34.678333789" } } \ No newline at end of file From e5d8ae6172d9d5e763ee99591a65fe237a0f5f9b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 14:58:16 +0100 Subject: [PATCH 159/183] prettier --- modules.json | 156 +++++++++++++-------------------------------------- 1 file changed, 39 insertions(+), 117 deletions(-) diff --git a/modules.json b/modules.json index 8db781ed..b774fa63 100644 --- a/modules.json +++ b/modules.json @@ -8,248 +8,180 @@ "ascat": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ascat/ascat.diff" }, "bcftools/annotate": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/concat": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ] + "installed_by": ["modules", "vcf_gather_bcftools"] }, "bcftools/isec": { "branch": "master", "git_sha": "3b2c3559699a7bca6a7c2b220695a072e030e17d", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/bcftools/isec/bcftools-isec.diff" }, "bcftools/merge": { "branch": "master", "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/bcftools/merge/bcftools-merge.diff" }, "bcftools/norm": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bcftools/query": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/bcftools/query/bcftools-query.diff" }, "bcftools/sort": { "branch": "master", "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", - "installed_by": [ - "modules", - "vcf_gather_bcftools" - ], + "installed_by": ["modules", "vcf_gather_bcftools"], "patch": "modules/nf-core/bcftools/sort/bcftools-sort.diff" }, "deepvariant/callvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": [ - "deepvariant" - ], + "installed_by": ["deepvariant"], "patch": "modules/nf-core/deepvariant/callvariants/deepvariant-callvariants.diff" }, "deepvariant/makeexamples": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": [ - "deepvariant" - ], + "installed_by": ["deepvariant"], "patch": "modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff" }, "deepvariant/postprocessvariants": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": [ - "deepvariant" - ], + "installed_by": ["deepvariant"], "patch": "modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff" }, "ensemblvep/download": { "branch": "master", "git_sha": "90cdd21fd96ccbdb3bc90797ca69570d18391055", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ensemblvep/vep": { "branch": "master", "git_sha": "890fdcff71928fc1470d3e669d4c430c8c770297", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/ensemblvep/vep/ensemblvep-vep.diff" }, "longphase/haplotag": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, "minimap2/align": { "branch": "master", "git_sha": "5c9f8d5b7671237c906abadc9ff732b301ca15ca", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/minimap2/align/minimap2-align.diff" }, "minimap2/index": { "branch": "master", "git_sha": "14980f759266eec42dac401fcafeb83d6c957b41", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "modkit/pileup": { "branch": "master", "git_sha": "3d81317a30d1016b533982d6b84df07713ae520a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mosdepth": { "branch": "master", "git_sha": "6832b69ef7f98c54876d6436360b6b945370c615", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "multiqc": { "branch": "master", "git_sha": "2c73cc8fa92cf48de3da0b643fdf357a8a290b36", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "nanoplot": { "branch": "master", "git_sha": "682f789f93070bd047868300dd018faf3d434e7c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pigz/uncompress": { "branch": "master", "git_sha": "f84336b7fa91a65aa61d215b8c109fbb8e4b4ac6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/cat": { "branch": "master", "git_sha": "f9edc59be2fe25bb6fc73ca4dfc0d28246f2a2d6", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "b2e78932ef01165fd85829513eaca29eff8e640a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": [ - "bam_stats_samtools" - ] + "installed_by": ["bam_stats_samtools"] }, "samtools/index": { "branch": "master", "git_sha": "1d2fbdcbca677bbe8da0f9d0d2bb7c02f2cab1c9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", - "installed_by": [ - "bam_stats_samtools" - ], + "installed_by": ["bam_stats_samtools"], "patch": "modules/nf-core/samtools/stats/samtools-stats.diff" }, "severus": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/severus/severus.diff" }, "untar": { "branch": "master", "git_sha": "447f7bc0fa41dfc2400c8cad4c0291880dc060cf", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "unzip": { "branch": "master", "git_sha": "4dd9d8439a429c7ee566e0e2347f76ddeef27e66", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "wget": { "branch": "master", "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "whatshap/stats": { "branch": "master", "git_sha": "bfab71f4d68c1aaff09335a3433e7b2836918b2a", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -258,41 +190,31 @@ "bam_stats_samtools": { "branch": "master", "git_sha": "7ac6cbe7c17c2dad685da7f70496c8f48ea48687", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "deepvariant": { "branch": "master", "git_sha": "f2b138ee1d91f67d31c187317d7e83e429bf0309", - "installed_by": [ - "subworkflows" - ], + "installed_by": ["subworkflows"], "patch": "subworkflows/nf-core/deepvariant/deepvariant.diff" }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfcore_pipeline": { "branch": "master", "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", - "installed_by": [ - "subworkflows" - ] + "installed_by": ["subworkflows"] } } } } } -} \ No newline at end of file +} From 69a8edd6fa75134af7f661b0b2b1bfbd74cdee22 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 15:02:52 +0100 Subject: [PATCH 160/183] repatch isec --- modules/nf-core/bcftools/isec/bcftools-isec.diff | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/nf-core/bcftools/isec/bcftools-isec.diff b/modules/nf-core/bcftools/isec/bcftools-isec.diff index 36911c50..bea9e9d9 100644 --- a/modules/nf-core/bcftools/isec/bcftools-isec.diff +++ b/modules/nf-core/bcftools/isec/bcftools-isec.diff @@ -28,6 +28,16 @@ Changes in 'bcftools/isec/main.nf': """ stub: +@@ -43,5 +52,9 @@ + touch ${prefix}/0000.vcf.gz.tbi + echo "" | gzip > ${prefix}/0001.vcf.gz + touch ${prefix}/0001.vcf.gz.tbi ++ echo "" | gzip > ${prefix}/0002.vcf.gz ++ touch ${prefix}/0002.vcf.gz.tbi ++ echo "" | gzip > ${prefix}/0003.vcf.gz ++ touch ${prefix}/0003.vcf.gz.tbi + """ + } 'modules/nf-core/bcftools/isec/environment.yml' is unchanged 'modules/nf-core/bcftools/isec/tests/main.nf.test' is unchanged From 3e6607891f51af96b7be579dab73b7da0ef22d5f Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 15:07:49 +0100 Subject: [PATCH 161/183] repatch bcftools query --- modules/nf-core/bcftools/query/bcftools-query.diff | 3 ++- modules/nf-core/bcftools/query/main.nf | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/nf-core/bcftools/query/bcftools-query.diff b/modules/nf-core/bcftools/query/bcftools-query.diff index 6ad99032..790c3808 100644 --- a/modules/nf-core/bcftools/query/bcftools-query.diff +++ b/modules/nf-core/bcftools/query/bcftools-query.diff @@ -13,7 +13,7 @@ Changes in 'bcftools/query/main.nf': tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: -@@ -35,12 +36,16 @@ +@@ -35,12 +36,17 @@ ${args} \\ ${vcf} \\ > ${prefix}.${suffix} @@ -28,6 +28,7 @@ Changes in 'bcftools/query/main.nf': - touch ${prefix}.${suffix} \\ + touch ${prefix}.${suffix} + bgzip -c ${prefix}.${suffix} > ${prefix}.${suffix}.gz ++ touch ${prefix}.${suffix}.gz.tbi + tabix -s 1 -b 2 -e 2 ${prefix}.${suffix}.gz """ } diff --git a/modules/nf-core/bcftools/query/main.nf b/modules/nf-core/bcftools/query/main.nf index 168a2ad9..4d2da568 100644 --- a/modules/nf-core/bcftools/query/main.nf +++ b/modules/nf-core/bcftools/query/main.nf @@ -46,6 +46,7 @@ process BCFTOOLS_QUERY { """ touch ${prefix}.${suffix} bgzip -c ${prefix}.${suffix} > ${prefix}.${suffix}.gz + touch ${prefix}.${suffix}.gz.tbi tabix -s 1 -b 2 -e 2 ${prefix}.${suffix}.gz """ } From bcb68a1bf341e77c8a228cb77cb80dc1ac188d22 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 15:48:36 +0100 Subject: [PATCH 162/183] fixed co-pilot fix --- modules/local/vcfsplit/main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/vcfsplit/main.nf b/modules/local/vcfsplit/main.nf index 9f5759d8..f6156d34 100644 --- a/modules/local/vcfsplit/main.nf +++ b/modules/local/vcfsplit/main.nf @@ -31,8 +31,8 @@ process VCFSPLIT { bcftools concat -a -Oz -o somatic.vcf.gz indels_pass.vcf.gz snv_pass.vcf.gz tabix -p vcf somatic.vcf.gz - bcftools view -i 'FILTER=="NonSomatic" || FILTER=="Verdict_Germline"' $indel_vcf | bgzip -c > indels_filtered.vcf.gz - bcftools view -i 'FILTER=="NonSomatic" || FILTER=="Verdict_Germline"' $snv_vcf | bgzip -c > snv_filtered.vcf.gz + bcftools view -i 'FILTER~"NonSomatic" || INFO/Verdict_Germline=1' $indel_vcf | bgzip -c > indels_filtered.vcf.gz + bcftools view -i 'FILTER~"NonSomatic" || INFO/Verdict_Germline=1' $snv_vcf | bgzip -c > snv_filtered.vcf.gz tabix -p vcf indels_filtered.vcf.gz tabix -p vcf snv_filtered.vcf.gz bcftools concat -a -Oz -o germline_tmp.vcf.gz indels_filtered.vcf.gz snv_filtered.vcf.gz From eff925715b9cceed339211413a2d6a20ef7de7c9 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 16:18:36 +0100 Subject: [PATCH 163/183] fix value channel --- subworkflows/local/prepare_reference_files.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 324815e2..42e2e959 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -36,7 +36,7 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = UNZIP_FASTA.out.file ch_versions = ch_versions.mix(UNZIP_FASTA.out.versions) } else { - ch_prepared_fasta = [ [:], fasta ] + ch_prepared_fasta = channel.value([ [:], fasta ]) } // ch_prepared_fasta: [[:], fasta_path] -- empty meta; uncompressed if input was .gz From 00be26e7cc82c3d8f94a83f9808b71499ca661b7 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 16:27:19 +0100 Subject: [PATCH 164/183] fixed severus channel --- workflows/lrsomatic.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 3e600273..0a9f10de 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -703,7 +703,7 @@ workflow LRSOMATIC { // if (!params.skip_ascat) { - severus_reformat + severus_input .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf -> return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } @@ -731,7 +731,7 @@ workflow LRSOMATIC { if (!params.skip_wakhan) { // Prepare input channel for WAKHAN - severus_reformat + severus_input .join(SEVERUS.out.all_vcf) .set { wakhan_input } // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, phased_tbi, severus_all_vcf] From b7af5702d6b551b8c6c406b7ae3583fd1ac17f4a Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 16:54:16 +0100 Subject: [PATCH 165/183] add modkit --- nextflow.config | 1 + workflows/lrsomatic.nf | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/nextflow.config b/nextflow.config index f8ad334a..2058d0a6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -46,6 +46,7 @@ params { skip_m6a = false skip_vep = false skip_modcall = false + skip_modkit = false use_gpu = false skip_whatshapstats = false diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 3e600273..ca7eb98e 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -33,6 +33,7 @@ include { ENSEMBLVEP_VEP as SOMATIC_VEP } from '../modules/nf-core/ensemblve include { ENSEMBLVEP_VEP as GERMLINE_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { ENSEMBLVEP_VEP as SV_VEP } from '../modules/nf-core/ensemblvep/vep/main.nf' include { WHATSHAP_STATS } from '../modules/nf-core/whatshap/stats/main' +include { MODKIT_PILEUP } from '../modules/nf-core/modkit/pileup/main' // // IMPORT SUBWORKFLOWS @@ -399,6 +400,12 @@ workflow LRSOMATIC { .join(MINIMAP2_ALIGN.out.index) .set {ch_index_minimap} + ch_fasta + .join(ch_fai) + .set{ch_fasta_fai} + if (!params.skip_modkit) { + MODKIT_PILEUP(ch_index_minimap, ch_fasta_fai, [[:],[]]) + } ch_index_minimap .branch { meta, _bams, _bais -> paired: meta.paired_data From 3832767e7435e7c4591eed7471f0edab5c4189ab Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 24 Mar 2026 21:44:03 +0100 Subject: [PATCH 166/183] channel edit --- subworkflows/local/prepare_reference_files.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 324815e2..42e2e959 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -36,7 +36,7 @@ workflow PREPARE_REFERENCE_FILES { ch_prepared_fasta = UNZIP_FASTA.out.file ch_versions = ch_versions.mix(UNZIP_FASTA.out.versions) } else { - ch_prepared_fasta = [ [:], fasta ] + ch_prepared_fasta = channel.value([ [:], fasta ]) } // ch_prepared_fasta: [[:], fasta_path] -- empty meta; uncompressed if input was .gz From 28db3f5215c0caa1e4feeccc433a8ae00cfc0878 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 25 Mar 2026 09:47:03 +0100 Subject: [PATCH 167/183] fix value channel structure --- modules.json | 3 ++- modules/nf-core/modkit/pileup/main.nf | 5 ++-- .../nf-core/modkit/pileup/modkit-pileup.diff | 23 +++++++++++++++++++ workflows/lrsomatic.nf | 7 +++--- 4 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 modules/nf-core/modkit/pileup/modkit-pileup.diff diff --git a/modules.json b/modules.json index b774fa63..e962dc36 100644 --- a/modules.json +++ b/modules.json @@ -104,7 +104,8 @@ "modkit/pileup": { "branch": "master", "git_sha": "3d81317a30d1016b533982d6b84df07713ae520a", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/modkit/pileup/modkit-pileup.diff" }, "mosdepth": { "branch": "master", diff --git a/modules/nf-core/modkit/pileup/main.nf b/modules/nf-core/modkit/pileup/main.nf index e610efb7..7487783d 100644 --- a/modules/nf-core/modkit/pileup/main.nf +++ b/modules/nf-core/modkit/pileup/main.nf @@ -9,8 +9,9 @@ process MODKIT_PILEUP { input: tuple val(meta), path(bam), path(bai) - tuple val(meta2), path(fasta), path(fai) - tuple val(meta3), path(bed) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + tuple val(meta4), path(bed) output: tuple val(meta), path("*.bed.gz") , emit: bedgz , optional: true diff --git a/modules/nf-core/modkit/pileup/modkit-pileup.diff b/modules/nf-core/modkit/pileup/modkit-pileup.diff new file mode 100644 index 00000000..d880bb11 --- /dev/null +++ b/modules/nf-core/modkit/pileup/modkit-pileup.diff @@ -0,0 +1,23 @@ +Changes in component 'nf-core/modkit/pileup' +'modules/nf-core/modkit/pileup/meta.yml' is unchanged +Changes in 'modkit/pileup/main.nf': +--- modules/nf-core/modkit/pileup/main.nf ++++ modules/nf-core/modkit/pileup/main.nf +@@ -9,8 +9,9 @@ + + input: + tuple val(meta), path(bam), path(bai) +- tuple val(meta2), path(fasta), path(fai) +- tuple val(meta3), path(bed) ++ tuple val(meta2), path(fasta) ++ tuple val(meta3), path(fai) ++ tuple val(meta4), path(bed) + + output: + tuple val(meta), path("*.bed.gz") , emit: bedgz , optional: true + +'modules/nf-core/modkit/pileup/environment.yml' is unchanged +'modules/nf-core/modkit/pileup/tests/main.nf.test' is unchanged +'modules/nf-core/modkit/pileup/tests/main.nf.test.snap' is unchanged +'modules/nf-core/modkit/pileup/tests/nextflow.config' is unchanged +************************************************************ diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index cb3e6808..7918c057 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -400,11 +400,10 @@ workflow LRSOMATIC { .join(MINIMAP2_ALIGN.out.index) .set {ch_index_minimap} - ch_fasta - .join(ch_fai) - .set{ch_fasta_fai} + + if (!params.skip_modkit) { - MODKIT_PILEUP(ch_index_minimap, ch_fasta_fai, [[:],[]]) + MODKIT_PILEUP(ch_index_minimap, ch_fasta, ch_fai, [[:],[]]) } ch_index_minimap .branch { meta, _bams, _bais -> From ee028d37bd2b515713ec47c8dae0841c1cc83f58 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Wed, 25 Mar 2026 10:15:50 +0100 Subject: [PATCH 168/183] fix snap and change modcall label --- conf/modules.config | 5 ++++- modules/local/longphase/modcall/main.nf | 2 +- tests/.nftignore | 2 ++ tests/default.nf.test | 13 +++++++++++++ tests/default.nf.test.snap | 26 +------------------------ 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index cb37c839..cce129da 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -170,8 +170,11 @@ process { publishDir = [ path: { "${params.outdir}/${meta.id}/variants/deepvariant" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> + (filename.equals('versions.yml') || filename.endsWith('.g.vcf.gz') || filename.endsWith('.g.vcf.gz.tbi')) ? null : filename + } ] + } withName: '.*DEEPVARIANT_CALLVARIANTS' { diff --git a/modules/local/longphase/modcall/main.nf b/modules/local/longphase/modcall/main.nf index dd04482e..2390c34d 100644 --- a/modules/local/longphase/modcall/main.nf +++ b/modules/local/longphase/modcall/main.nf @@ -1,6 +1,6 @@ process LONGPHASE_MODCALL { tag "$meta.id" - label 'process_medium' + label 'process_very_high' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/tests/.nftignore b/tests/.nftignore index 7a9121a9..a1de7635 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -25,3 +25,5 @@ pipeline_info/*.{html,json,txt,yml} */qc/{tumor,normal}/nanoplot_ubam_*/*.txt */qc/{tumor,normal}/nanoplot_aln/*.txt */qc/{tumor,normal}/mosdepth/*.txt +*/variants/deepsomatic/*.{vcf.gz,vcf.gz.tbi} +*/variants/deepvariant/*.{vcf.gz,vcf.gz.tbi} diff --git a/tests/default.nf.test b/tests/default.nf.test index 160dc01e..a7a4281c 100644 --- a/tests/default.nf.test +++ b/tests/default.nf.test @@ -42,6 +42,19 @@ nextflow_pipeline { assert file("$launchDir/output/sample3/variants/clairsto/snv.vcf.gz").exists() assert file("$launchDir/output/sample3/variants/clairsto/somatic.vcf.gz").exists() assert file("$launchDir/output/sample3/variants/clairsto/germline.vcf.gz").exists() + assert file("$launchDir/output/sample1/variants/deepvariant/sample1.vcf.gz").exists() + assert file("$launchDir/output/sample1/variants/deepvariant/sample1.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample2/variants/deepvariant/sample2.vcf.gz").exists() + assert file("$launchDir/output/sample2/variants/deepvariant/sample2.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample3/variants/deepvariant/sample3.vcf.gz").exists() + assert file("$launchDir/output/sample3/variants/deepvariant/sample3.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample1/variants/deepsomatic/sample1.vcf.gz").exists() + assert file("$launchDir/output/sample1/variants/deepsomatic/sample1.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample2/variants/deepsomatic/sample2.vcf.gz").exists() + assert file("$launchDir/output/sample2/variants/deepsomatic/sample2.vcf.gz.tbi").exists() + assert file("$launchDir/output/sample3/variants/deepsomatic/sample3.vcf.gz").exists() + assert file("$launchDir/output/sample3/variants/deepsomatic/sample3.vcf.gz.tbi").exists() + }, { assert snapshot( // pipeline versions.yml file for multiqc from which Nextflow version is removed because we test pipelines on multiple Nextflow versions diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 6b04accb..75ce6abf 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -284,8 +284,6 @@ "sample1/variants/deepsomatic/sample1.vcf.gz", "sample1/variants/deepsomatic/sample1.vcf.gz.tbi", "sample1/variants/deepvariant", - "sample1/variants/deepvariant/sample1.g.vcf.gz", - "sample1/variants/deepvariant/sample1.g.vcf.gz.tbi", "sample1/variants/deepvariant/sample1.vcf.gz", "sample1/variants/deepvariant/sample1.vcf.gz.tbi", "sample1/variants/phased", @@ -409,8 +407,6 @@ "sample2/variants/deepsomatic/sample2.vcf.gz", "sample2/variants/deepsomatic/sample2.vcf.gz.tbi", "sample2/variants/deepvariant", - "sample2/variants/deepvariant/sample2.g.vcf.gz", - "sample2/variants/deepvariant/sample2.g.vcf.gz.tbi", "sample2/variants/deepvariant/sample2.vcf.gz", "sample2/variants/deepvariant/sample2.vcf.gz.tbi", "sample2/variants/phased", @@ -502,8 +498,6 @@ "sample3/variants/deepsomatic/sample3.vcf.gz", "sample3/variants/deepsomatic/sample3.vcf.gz.tbi", "sample3/variants/deepvariant", - "sample3/variants/deepvariant/sample3.g.vcf.gz", - "sample3/variants/deepvariant/sample3.g.vcf.gz.tbi", "sample3/variants/deepvariant/sample3.vcf.gz", "sample3/variants/deepvariant/sample3.vcf.gz.tbi", "sample3/variants/phased", @@ -556,12 +550,6 @@ "sample1_whatshap_stats.gtf:md5,32e249c78790982098e4b0a606171d69", "sample1_whatshap_stats.log:md5,407b5fcdfbeec1830b2ed6f65f1c2c18", "sample1_whatshap_stats.tsv:md5,41290e994b5e6dab5ed696925cbb0716", - "sample1.vcf.gz:md5,92c0fa9016c3d8b192eb382fd6a81199", - "sample1.vcf.gz.tbi:md5,04e82577dc57f80b9db25897389364b2", - "sample1.g.vcf.gz:md5,5ed06f35ccecf7aadbec54873dc07e64", - "sample1.g.vcf.gz.tbi:md5,ca628ef368d34a7a6c77098a4c4bdf36", - "sample1.vcf.gz:md5,ad971a535d2b8014fabdabe72995a5db", - "sample1.vcf.gz.tbi:md5,65de5caace8d4312afa707c3bfd6fa45", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "breakpoints_double.csv:md5,d63f058075bfe791248954ca2ee6c4fb", @@ -581,12 +569,6 @@ "sample2_whatshap_stats.gtf:md5,af33281699a1d0da83fbe7eaff198d03", "sample2_whatshap_stats.log:md5,8f5f400786f32871c16e523d9e236fc4", "sample2_whatshap_stats.tsv:md5,e8b67840491b7d092ac3d5d91db0ff46", - "sample2.vcf.gz:md5,f9d6266ee49c2544dc28eef0cdd9dcae", - "sample2.vcf.gz.tbi:md5,433ecd219947787d00dd0fada6307661", - "sample2.g.vcf.gz:md5,7998d15ce582ec94e86568e3fae654f9", - "sample2.g.vcf.gz.tbi:md5,9498e3266900eee2448ff05b0bce87c0", - "sample2.vcf.gz:md5,33330d8444a1774864883b33e1e2235c", - "sample2.vcf.gz.tbi:md5,384b8b5ea7c1559b464031f8e0863532", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "breakpoints_double.csv:md5,a68d7fc9c7a7cb2f31e73189c5412f7b", @@ -601,12 +583,6 @@ "sample3_whatshap_stats.gtf:md5,415b20e0cc30409d24501d64b185dc49", "sample3_whatshap_stats.log:md5,99a842c8f8f3259ec66b68e8fe0345e6", "sample3_whatshap_stats.tsv:md5,a65d179e31756ae4127f0bf74da7e701", - "sample3.vcf.gz:md5,ee4f7a5bbd471c1370accf888b8262c0", - "sample3.vcf.gz.tbi:md5,944349ec46ecc95bab7db2f6848d0c36", - "sample3.g.vcf.gz:md5,64adc407ef2434254e76763b72c67b08", - "sample3.g.vcf.gz.tbi:md5,ac0397f7a840cf618d56f097defba878", - "sample3.vcf.gz:md5,9c52a803d796157a08b565c653d4685c", - "sample3.vcf.gz.tbi:md5,f0b3599e4281a6f3bbb8bc408740e58e", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", "breakpoints_double.csv:md5,46e03bf2d67aa736b599f00fe7f01e06", @@ -619,6 +595,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-24T14:54:34.678333789" + "timestamp": "2026-03-25T10:14:49.980270841" } } \ No newline at end of file From 48a71f692f43a6793442752dc085df05a0982311 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Mar 2026 14:45:03 +0100 Subject: [PATCH 169/183] fix channel structure, update longphase --- modules.json | 4 +- .../local/longphase/modcall/environment.yml | 9 + modules/local/longphase/modcall/main.nf | 4 +- .../longphase/haplotag/environment.yml | 4 +- modules/nf-core/longphase/haplotag/main.nf | 16 +- modules/nf-core/longphase/haplotag/meta.yml | 36 ++-- .../longphase/haplotag/tests/main.nf.test | 10 +- .../haplotag/tests/main.nf.test.snap | 121 ++++++------ .../nf-core/longphase/phase/environment.yml | 4 +- modules/nf-core/longphase/phase/main.nf | 26 +-- modules/nf-core/longphase/phase/meta.yml | 48 +++-- .../longphase/phase/tests/main.nf.test | 10 +- .../longphase/phase/tests/main.nf.test.snap | 180 +++++------------- workflows/lrsomatic.nf | 7 +- 14 files changed, 204 insertions(+), 275 deletions(-) create mode 100644 modules/local/longphase/modcall/environment.yml diff --git a/modules.json b/modules.json index b774fa63..2ee14816 100644 --- a/modules.json +++ b/modules.json @@ -81,12 +81,12 @@ }, "longphase/haplotag": { "branch": "master", - "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", + "git_sha": "b8d30a43f33aee3148b0e9e9f00587984a4ac195", "installed_by": ["modules"] }, "longphase/phase": { "branch": "master", - "git_sha": "47983538e45e539f783ed8ab0d1c96d39df2af8f", + "git_sha": "b8d30a43f33aee3148b0e9e9f00587984a4ac195", "installed_by": ["modules"], "patch": "modules/nf-core/longphase/phase/longphase-phase.diff" }, diff --git a/modules/local/longphase/modcall/environment.yml b/modules/local/longphase/modcall/environment.yml new file mode 100644 index 00000000..f436bdae --- /dev/null +++ b/modules/local/longphase/modcall/environment.yml @@ -0,0 +1,9 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::htslib=1.23.1 + - bioconda::longphase=2.0.1 diff --git a/modules/local/longphase/modcall/main.nf b/modules/local/longphase/modcall/main.nf index 2390c34d..a49ffa6d 100644 --- a/modules/local/longphase/modcall/main.nf +++ b/modules/local/longphase/modcall/main.nf @@ -4,8 +4,8 @@ process LONGPHASE_MODCALL { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': - 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/83/83fce1d397cf71705cc096fc0e0e52f7013bdd471ef68ee53ae765688e5c439c/data': + 'community.wave.seqera.io/library/longphase_samtools:8c61296cae7a5fc0' }" input: tuple val(meta), path(bam), path(bai) diff --git a/modules/nf-core/longphase/haplotag/environment.yml b/modules/nf-core/longphase/haplotag/environment.yml index 3a882a5d..f436bdae 100644 --- a/modules/nf-core/longphase/haplotag/environment.yml +++ b/modules/nf-core/longphase/haplotag/environment.yml @@ -5,5 +5,5 @@ channels: - bioconda dependencies: - - bioconda::htslib=1.22.1 - - bioconda::longphase=2.0 + - bioconda::htslib=1.23.1 + - bioconda::longphase=2.0.1 diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf index a64eb7c8..7eb84669 100644 --- a/modules/nf-core/longphase/haplotag/main.nf +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -4,8 +4,8 @@ process LONGPHASE_HAPLOTAG { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': - 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/83/83fce1d397cf71705cc096fc0e0e52f7013bdd471ef68ee53ae765688e5c439c/data': + 'community.wave.seqera.io/library/longphase_samtools:8c61296cae7a5fc0' }" input: tuple val(meta), path(bam), path(bai), path(snps), path(svs), path(mods) @@ -16,7 +16,7 @@ process LONGPHASE_HAPLOTAG { output: tuple val(meta), path("*.{bam,cram}"), emit: bam tuple val(meta), path("*.log") , emit: log , optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions when: task.ext.when == null || task.ext.when @@ -42,11 +42,6 @@ process LONGPHASE_HAPLOTAG { if [ -f "${prefix}.out" ]; then mv ${prefix}.out ${prefix}.log fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - END_VERSIONS """ stub: @@ -57,10 +52,5 @@ process LONGPHASE_HAPLOTAG { """ touch ${prefix}.${suffix} ${log} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - END_VERSIONS """ } diff --git a/modules/nf-core/longphase/haplotag/meta.yml b/modules/nf-core/longphase/haplotag/meta.yml index 63368b31..5c3ad844 100644 --- a/modules/nf-core/longphase/haplotag/meta.yml +++ b/modules/nf-core/longphase/haplotag/meta.yml @@ -1,7 +1,7 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "longphase_haplotag" -description: LongPhase is an ultra-fast program for simultaneously co-phasing SNPs, - small indels, large SVs, and (5mC) modifications for Nanopore and PacBio platforms. +description: LongPhase is an ultra-fast program for simultaneously co-phasing + SNPs, small indels, large SVs, and (5mC) modifications for Nanopore and PacBio + platforms. keywords: - haplotag - long-read @@ -15,9 +15,9 @@ tools: documentation: "https://github.com/twolinin/longphase" tool_dev_url: "https://github.com/twolinin/longphase" doi: "10.1093/bioinformatics/btac058" - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: "" - input: - - meta: type: map @@ -92,13 +92,27 @@ output: description: Log file pattern: "*.log" ontologies: [] + versions_longphase: + - - ${task.process}: + type: string + description: The name of the process + - longphase: + type: string + description: The name of the tool + - "longphase --version | head -n 1 | sed 's/Version: //'": + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - longphase: + type: string + description: The name of the tool + - "longphase --version | head -n 1 | sed 's/Version: //'": + type: eval + description: The expression to obtain the version of the tool authors: - "@fellen31" maintainers: diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test b/modules/nf-core/longphase/haplotag/tests/main.nf.test index fb5d9311..687f61e0 100644 --- a/modules/nf-core/longphase/haplotag/tests/main.nf.test +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test @@ -38,7 +38,7 @@ nextflow_process { assertAll( { assert process.success }, { assert snapshot( - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions")}, bam(process.out.bam.get(0).get(1), stringency: 'silent').getHeader(), bam(process.out.bam.get(0).get(1), stringency: 'silent').getReadsMD5(), ).match() } @@ -79,7 +79,7 @@ nextflow_process { assertAll( { assert process.success }, { assert snapshot( - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions")}, process.out.log, bam(process.out.bam.get(0).get(1), 'https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/genome/genome.fasta', stringency: 'silent').getHeader()[2..5], bam(process.out.bam.get(0).get(1), 'https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/genome/genome.fasta', stringency: 'silent').getReadsMD5(), @@ -118,7 +118,7 @@ nextflow_process { assertAll( { assert process.success }, { assert snapshot( - process.out.versions, + process.out.findAll { key, val -> key.startsWith("versions")}, bam(process.out.bam.get(0).get(1), stringency: 'silent').getHeader(), bam(process.out.bam.get(0).get(1), stringency: 'silent').getReadsMD5(), ).match() } @@ -157,7 +157,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } @@ -194,7 +194,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } diff --git a/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap index 412fb8d0..23287721 100644 --- a/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap +++ b/modules/nf-core/longphase/haplotag/tests/main.nf.test.snap @@ -2,25 +2,6 @@ "[ bam, bai, snps, [], [] ], fasta, fai - log & cram -stub": { "content": [ { - "0": [ - [ - { - "id": "test" - }, - "test.cram:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - [ - { - "id": "test" - }, - "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - "versions.yml:md5,2dfda84762159ad14ca71803b3139183" - ], "bam": [ [ { @@ -37,55 +18,51 @@ "test.log:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,2dfda84762159ad14ca71803b3139183" + "versions_longphase": [ + [ + "LONGPHASE_HAPLOTAG", + "longphase", + "2.0.1 " + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-22T11:47:07.246878607" + "timestamp": "2026-03-20T10:13:11.968590854" }, "[ bam, bai, snps, [], [] ], fasta, fai": { "content": [ - [ - "versions.yml:md5,2dfda84762159ad14ca71803b3139183" - ], + { + "versions_longphase": [ + [ + "LONGPHASE_HAPLOTAG", + "longphase", + "2.0.1 " + ] + ] + }, [ "@HD\tVN:1.6\tSO:coordinate", "@SQ\tSN:chr22\tLN:40001", "@RG\tID:test\tSM:test", "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", - "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0.1\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " ], "721264eb2824a3146b331f2532d10180" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-22T11:46:50.605854269" + "timestamp": "2026-03-20T10:12:40.584213389" }, "[ bam, bai, snps, [], [] ], fasta, fai -stub": { "content": [ { - "0": [ - [ - { - "id": "test" - }, - "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - - ], - "2": [ - "versions.yml:md5,2dfda84762159ad14ca71803b3139183" - ], "bam": [ [ { @@ -97,43 +74,59 @@ "log": [ ], - "versions": [ - "versions.yml:md5,2dfda84762159ad14ca71803b3139183" + "versions_longphase": [ + [ + "LONGPHASE_HAPLOTAG", + "longphase", + "2.0.1 " + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-22T11:47:03.645623933" + "timestamp": "2026-03-20T10:13:04.628910585" }, "[ bam, bai, snps, svs, [] ], fasta, fai": { "content": [ - [ - "versions.yml:md5,2dfda84762159ad14ca71803b3139183" - ], + { + "versions_longphase": [ + [ + "LONGPHASE_HAPLOTAG", + "longphase", + "2.0.1 " + ] + ] + }, [ "@HD\tVN:1.6\tSO:coordinate", "@SQ\tSN:chr22\tLN:40001", "@RG\tID:test\tSM:test", "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", - "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam --sv-file NA24385_sv.vcf.gz " + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0.1\tCL:longphase haplotag --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam --sv-file NA24385_sv.vcf.gz " ], "721264eb2824a3146b331f2532d10180" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-22T11:47:00.022853298" + "timestamp": "2026-03-20T10:12:57.997252428" }, "[ bam, bai, snps, [], [] ], fasta, fai - log & cram": { "content": [ - [ - "versions.yml:md5,2dfda84762159ad14ca71803b3139183" - ], + { + "versions_longphase": [ + [ + "LONGPHASE_HAPLOTAG", + "longphase", + "2.0.1 " + ] + ] + }, [ [ { @@ -146,14 +139,14 @@ "@RG\tID:test\tSM:test", "@PG\tID:minimap2\tPN:minimap2\tVN:2.28-r1209\tCL:minimap2 -y -x map-ont --secondary=no -R @RG\\tID:test\\tSM:test -t 30 -a genome.mmi test.bam_other.fastq.gz", "@PG\tID:samtools\tPN:samtools\tPP:minimap2\tVN:1.19.2\tCL:samtools sort -@ 29 -o test.bam_other.fastq.gz.bam --write-index", - "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0\tCL:longphase haplotag --log --cram --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " + "@PG\tID:longphase\tPN:longphase\tPP:samtools\tVN:2.0.1\tCL:longphase haplotag --log --cram --threads 2 -o test --reference genome.fasta --snp-file test.genome.vcf.gz --bam test.sorted.bam " ], "721264eb2824a3146b331f2532d10180" ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-22T11:46:55.93374635" + "timestamp": "2026-03-20T10:12:49.73950987" } } \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/environment.yml b/modules/nf-core/longphase/phase/environment.yml index 3a882a5d..f436bdae 100644 --- a/modules/nf-core/longphase/phase/environment.yml +++ b/modules/nf-core/longphase/phase/environment.yml @@ -5,5 +5,5 @@ channels: - bioconda dependencies: - - bioconda::htslib=1.22.1 - - bioconda::longphase=2.0 + - bioconda::htslib=1.23.1 + - bioconda::longphase=2.0.1 diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 5a20381f..ccd1b715 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -4,8 +4,8 @@ process LONGPHASE_PHASE { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b0184a9a36d8612fbae38bbaad7b52f03b815ad17673740e107cf1f267a1f15d/data': - 'community.wave.seqera.io/library/htslib_longphase:3071e61356fc25a4' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/83/83fce1d397cf71705cc096fc0e0e52f7013bdd471ef68ee53ae765688e5c439c/data': + 'community.wave.seqera.io/library/longphase_samtools:8c61296cae7a5fc0' }" input: tuple val(meta), path(bam), path(bai), path(snvs), path(svs), path(mods) @@ -14,13 +14,10 @@ process LONGPHASE_PHASE { output: - tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf - tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: snv_vcf_index - tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true - tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true - tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true - tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf + tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true + tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions when: task.ext.when == null || task.ext.when @@ -49,20 +46,9 @@ process LONGPHASE_PHASE { $args2 \\ ${prefix}*.vcf - tabix -p vcf ${prefix}.vcf.gz - - if [ -f ${prefix}_SV.vcf.gz ]; then - tabix -p vcf ${prefix}_SV.vcf.gz - fi - - if [ -f ${prefix}_mod.vcf.gz ]; then - tabix -p vcf ${prefix}_mod.vcf.gz - fi - cat <<-END_VERSIONS > versions.yml "${task.process}": longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') END_VERSIONS """ diff --git a/modules/nf-core/longphase/phase/meta.yml b/modules/nf-core/longphase/phase/meta.yml index 94efc684..266b878b 100644 --- a/modules/nf-core/longphase/phase/meta.yml +++ b/modules/nf-core/longphase/phase/meta.yml @@ -1,7 +1,7 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: "longphase_phase" -description: LongPhase is an ultra-fast program for simultaneously co-phasing SNPs, - small indels, large SVs, and (5mC) modifications for Nanopore and PacBio platforms. +description: LongPhase is an ultra-fast program for simultaneously co-phasing + SNPs, small indels, large SVs, and (5mC) modifications for Nanopore and PacBio + platforms. keywords: - phase - long-read @@ -15,9 +15,9 @@ tools: documentation: "https://github.com/twolinin/longphase" tool_dev_url: "https://github.com/twolinin/longphase" doi: "10.1093/bioinformatics/btac058" - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: "" - input: - - meta: type: map @@ -76,43 +76,57 @@ output: description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - "${prefix}.vcf.gz": + - ${prefix}.vcf.gz: type: file description: Compressed VCF file with phased SNVs and indels pattern: "*.vcf.gz" ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format + - edam: http://edamontology.org/format_3989 sv_vcf: - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - "${prefix}_SV.vcf.gz": + - ${prefix}_SV.vcf.gz: type: file description: Compressed VCF file with phased SVs pattern: "*_SV.vcf.gz" ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format + - edam: http://edamontology.org/format_3989 mod_vcf: - - meta: type: map description: | Groovy Map containing sample information e.g. `[ id:'sample1', single_end:false ]` - - "${prefix}_mod.vcf.gz": + - ${prefix}_mod.vcf.gz: type: file description: Compressed VCF file with phased modifications pattern: "*.vcf.gz" ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format + - edam: http://edamontology.org/format_3989 + versions_longphase: + - - ${task.process}: + type: string + description: The name of the process + - longphase: + type: string + description: The name of the tool + - "longphase --version | head -n 1 | sed 's/Version: //'": + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - longphase: + type: string + description: The name of the tool + - "longphase --version | head -n 1 | sed 's/Version: //'": + type: eval + description: The expression to obtain the version of the tool authors: - "@fellen31" maintainers: diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test b/modules/nf-core/longphase/phase/tests/main.nf.test index b45bbf01..30c666ba 100644 --- a/modules/nf-core/longphase/phase/tests/main.nf.test +++ b/modules/nf-core/longphase/phase/tests/main.nf.test @@ -38,7 +38,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } @@ -72,7 +72,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } @@ -112,7 +112,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } @@ -148,7 +148,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } @@ -183,7 +183,7 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } diff --git a/modules/nf-core/longphase/phase/tests/main.nf.test.snap b/modules/nf-core/longphase/phase/tests/main.nf.test.snap index b0cf7144..c6a155f9 100644 --- a/modules/nf-core/longphase/phase/tests/main.nf.test.snap +++ b/modules/nf-core/longphase/phase/tests/main.nf.test.snap @@ -2,28 +2,6 @@ "[ bam, bai, snps, svs, [] ], fasta, fai - stub": { "content": [ { - "0": [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "1": [ - [ - { - "id": "test" - }, - "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" - ], "mod_vcf": [ ], @@ -43,37 +21,24 @@ "test_SV.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + "versions_longphase": [ + [ + "LONGPHASE_PHASE", + "longphase", + "2.0.1 " + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.5" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-11-06T16:06:24.025191062" + "timestamp": "2026-03-20T10:13:50.746589174" }, "[ bam, bai, snps, [], [] ], fasta, fai": { "content": [ { - "0": [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" - ], "mod_vcf": [ ], @@ -82,48 +47,30 @@ { "id": "test" }, - "test.vcf.gz:md5,77d7ca7d16c841d3f552681abef984dc" + "test.vcf.gz:md5,73d5f51aea92e09b3d427837066f114c" ] ], "sv_vcf": [ ], - "versions": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + "versions_longphase": [ + [ + "LONGPHASE_PHASE", + "longphase", + "2.0.1 " + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.5" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-11-06T16:05:57.029934447" + "timestamp": "2026-03-20T10:13:19.273322013" }, "[ bam, bai, snps, svs, [] ], fasta, fai": { "content": [ { - "0": [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" - ] - ], - "1": [ - [ - { - "id": "test" - }, - "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" - ] - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" - ], "mod_vcf": [ ], @@ -132,7 +79,7 @@ { "id": "test" }, - "test.vcf.gz:md5,f26bc442f6a1645bcfaabf989ab9483c" + "test.vcf.gz:md5,af297491417a5727de21f893b553db37" ] ], "sv_vcf": [ @@ -140,45 +87,27 @@ { "id": "test" }, - "test_SV.vcf.gz:md5,e1b83c15a21bab57f2b228cc7c7d8be8" + "test_SV.vcf.gz:md5,4636e0ac86a86565e5d04b5d1b6a00e7" ] ], - "versions": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + "versions_longphase": [ + [ + "LONGPHASE_PHASE", + "longphase", + "2.0.1 " + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.5" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-11-06T16:06:03.319855838" + "timestamp": "2026-03-20T10:13:27.450110496" }, "[ bam x2, bai x2, snps, svs, [] ], fasta, fai": { "content": [ { - "0": [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" - ] - ], - "1": [ - [ - { - "id": "test" - }, - "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" - ] - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" - ], "mod_vcf": [ ], @@ -187,7 +116,7 @@ { "id": "test" }, - "test.vcf.gz:md5,5333ba9fa14233d3fdbd8b9e1786b998" + "test.vcf.gz:md5,f688da3f046717765e879c061510e037" ] ], "sv_vcf": [ @@ -195,40 +124,27 @@ { "id": "test" }, - "test_SV.vcf.gz:md5,434fd35ae3de2a9187e43932686bfd19" + "test_SV.vcf.gz:md5,5336fc5eb9d3421cef66fd18320a4cb8" ] ], - "versions": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + "versions_longphase": [ + [ + "LONGPHASE_PHASE", + "longphase", + "2.0.1 " + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.5" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-11-06T16:06:10.867281359" + "timestamp": "2026-03-20T10:13:36.797768748" }, "[ bam, bai, snps, [], [] ], fasta, fai - stub": { "content": [ { - "0": [ - [ - { - "id": "test" - }, - "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" - ], "mod_vcf": [ ], @@ -243,15 +159,19 @@ "sv_vcf": [ ], - "versions": [ - "versions.yml:md5,1bc54f97e2b06e354a655d1066245fb4" + "versions_longphase": [ + [ + "LONGPHASE_PHASE", + "longphase", + "2.0.1 " + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.5" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-11-06T16:06:17.992733472" + "timestamp": "2026-03-20T10:13:44.86300696" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 0a9f10de..eaf32b71 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -704,7 +704,7 @@ workflow LRSOMATIC { if (!params.skip_ascat) { severus_input - .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf -> + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf, _tbi -> return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } @@ -733,8 +733,11 @@ workflow LRSOMATIC { // Prepare input channel for WAKHAN severus_input .join(SEVERUS.out.all_vcf) + .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, _phased_tbi, all_vcf -> + return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, all_vcf] + } .set { wakhan_input } - // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, phased_tbi, severus_all_vcf] + // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, severus_all_vcf] WAKHAN ( wakhan_input, From 06921f653acb77e1d1f1f07d8488b29ecdfc2543 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Mar 2026 15:26:25 +0100 Subject: [PATCH 170/183] change longphas --- modules/nf-core/longphase/phase/main.nf | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index ccd1b715..73e57d7e 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -14,11 +14,13 @@ process LONGPHASE_PHASE { output: - tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf - tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true - tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true - tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions - + tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf + tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: snv_vcf_index + tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true + tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -58,13 +60,16 @@ process LONGPHASE_PHASE { def sv_command = svs ? "echo '' | bgzip -c > ${prefix}_SV.vcf.gz" : "" def mod_command = mods ? "echo '' | bgzip -c > ${prefix}_mod.vcf.gz" : "" """ - echo $args - echo "" | bgzip -c > ${prefix}.vcf.gz + tabix -p vcf ${prefix}.vcf.gz - $sv_command - $mod_command + if [ -f ${prefix}_SV.vcf.gz ]; then + tabix -p vcf ${prefix}_SV.vcf.gz + fi - cat <<-END_VERSIONS > versions.yml + if [ -f ${prefix}_mod.vcf.gz ]; then + tabix -p vcf ${prefix}_mod.vcf.gz + fi + "${task.process}": longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') END_VERSIONS From fcf2547bacb0cf3c0f0d409680e0a70f540fc67b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Mar 2026 16:17:59 +0100 Subject: [PATCH 171/183] fix longphase output --- modules.json | 3 +- .../haplotag/longphase-haplotag.diff | 43 +++++++++++++++++++ modules/nf-core/longphase/haplotag/main.nf | 14 +++++- .../longphase/phase/longphase-phase.diff | 24 ++++++++--- modules/nf-core/longphase/phase/main.nf | 24 ++++++++--- tests/default.nf.test.snap | 22 +++++----- 6 files changed, 105 insertions(+), 25 deletions(-) create mode 100644 modules/nf-core/longphase/haplotag/longphase-haplotag.diff diff --git a/modules.json b/modules.json index 2ee14816..4b49d95a 100644 --- a/modules.json +++ b/modules.json @@ -82,7 +82,8 @@ "longphase/haplotag": { "branch": "master", "git_sha": "b8d30a43f33aee3148b0e9e9f00587984a4ac195", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/longphase/haplotag/longphase-haplotag.diff" }, "longphase/phase": { "branch": "master", diff --git a/modules/nf-core/longphase/haplotag/longphase-haplotag.diff b/modules/nf-core/longphase/haplotag/longphase-haplotag.diff new file mode 100644 index 00000000..cb47adc9 --- /dev/null +++ b/modules/nf-core/longphase/haplotag/longphase-haplotag.diff @@ -0,0 +1,43 @@ +Changes in component 'nf-core/longphase/haplotag' +'modules/nf-core/longphase/haplotag/meta.yml' is unchanged +Changes in 'longphase/haplotag/main.nf': +--- modules/nf-core/longphase/haplotag/main.nf ++++ modules/nf-core/longphase/haplotag/main.nf +@@ -16,7 +16,7 @@ + output: + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val(meta), path("*.log") , emit: log , optional: true +- tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions ++ path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when +@@ -42,6 +42,11 @@ + if [ -f "${prefix}.out" ]; then + mv ${prefix}.out ${prefix}.log + fi ++ ++ cat <<-END_VERSIONS > versions.yml ++ "${task.process}": ++ longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') ++ END_VERSIONS + """ + + stub: +@@ -52,5 +57,10 @@ + """ + touch ${prefix}.${suffix} + ${log} ++ ++ cat <<-END_VERSIONS > versions.yml ++ "${task.process}": ++ longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') ++ END_VERSIONS + """ +-} ++} +'modules/nf-core/longphase/haplotag/environment.yml' is unchanged +'modules/nf-core/longphase/haplotag/tests/main.nf.test' is unchanged +'modules/nf-core/longphase/haplotag/tests/main.nf.test.snap' is unchanged +'modules/nf-core/longphase/haplotag/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf index 7eb84669..9b4d6c88 100644 --- a/modules/nf-core/longphase/haplotag/main.nf +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -16,7 +16,7 @@ process LONGPHASE_HAPLOTAG { output: tuple val(meta), path("*.{bam,cram}"), emit: bam tuple val(meta), path("*.log") , emit: log , optional: true - tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -42,6 +42,11 @@ process LONGPHASE_HAPLOTAG { if [ -f "${prefix}.out" ]; then mv ${prefix}.out ${prefix}.log fi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS """ stub: @@ -52,5 +57,10 @@ process LONGPHASE_HAPLOTAG { """ touch ${prefix}.${suffix} ${log} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS """ -} +} \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/longphase-phase.diff b/modules/nf-core/longphase/phase/longphase-phase.diff index d8151f8c..a24c930e 100644 --- a/modules/nf-core/longphase/phase/longphase-phase.diff +++ b/modules/nf-core/longphase/phase/longphase-phase.diff @@ -10,7 +10,7 @@ Changes in 'longphase/phase/main.nf': - tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf - tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true - tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true -- path "versions.yml" , emit: versions +- tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions + tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf + tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: snv_vcf_index + tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true @@ -21,13 +21,20 @@ Changes in 'longphase/phase/main.nf': when: task.ext.when == null || task.ext.when -@@ -45,10 +48,13 @@ - --threads $task.cpus \\ +@@ -46,9 +49,20 @@ $args2 \\ ${prefix}*.vcf -+ -+ tabix -p vcf ${prefix}*.vcf.gz ++ tabix -p vcf ${prefix}.vcf.gz ++ ++ if [ -f ${prefix}_SV.vcf.gz ]; then ++ tabix -p vcf ${prefix}_SV.vcf.gz ++ fi ++ ++ if [ -f ${prefix}_mod.vcf.gz ]; then ++ tabix -p vcf ${prefix}_mod.vcf.gz ++ fi ++ cat <<-END_VERSIONS > versions.yml "${task.process}": longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') @@ -35,7 +42,12 @@ Changes in 'longphase/phase/main.nf': END_VERSIONS """ - +@@ -69,4 +83,4 @@ + longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + END_VERSIONS + """ +-} ++} 'modules/nf-core/longphase/phase/environment.yml' is unchanged 'modules/nf-core/longphase/phase/tests/main.nf.test' is unchanged 'modules/nf-core/longphase/phase/tests/main.nf.test.snap' is unchanged diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index ccd1b715..28ff6ef9 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -14,10 +14,13 @@ process LONGPHASE_PHASE { output: - tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf - tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true - tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true - tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions + tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf + tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: snv_vcf_index + tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true + tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -46,9 +49,20 @@ process LONGPHASE_PHASE { $args2 \\ ${prefix}*.vcf + tabix -p vcf ${prefix}.vcf.gz + + if [ -f ${prefix}_SV.vcf.gz ]; then + tabix -p vcf ${prefix}_SV.vcf.gz + fi + + if [ -f ${prefix}_mod.vcf.gz ]; then + tabix -p vcf ${prefix}_mod.vcf.gz + fi + cat <<-END_VERSIONS > versions.yml "${task.process}": longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') END_VERSIONS """ @@ -69,4 +83,4 @@ process LONGPHASE_PHASE { longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') END_VERSIONS """ -} +} \ No newline at end of file diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 75ce6abf..1eba0cf8 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -537,10 +537,10 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,92a00e311e085a34d443cb64694ce839", - "sample1_normal.bam.bai:md5,c7dff8adc4c8d33a81fb8ea7dff4a98e", - "sample1_tumor.bam:md5,c6c79808f928393b23ae53976a7304c3", - "sample1_tumor.bam.bai:md5,317d711c0c26d2cfb933ad53b69da1d7", + "sample1_normal.bam:md5,186e4e8400cce1f02190fa91ad449271", + "sample1_normal.bam.bai:md5,cabfbe44aa1f0fb6cf5b4d54e6c4d811", + "sample1_tumor.bam:md5,2887783d87d9e4dedbbca367d5e4efdb", + "sample1_tumor.bam.bai:md5,9eb6cf08de5a60644fa54c8810e3dc58", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,70fabbdc07dec0479b3fc7dcec344054", @@ -556,10 +556,10 @@ "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample2_normal.bam:md5,ed6aab4d2ef70537390a0ce85276ad2c", - "sample2_normal.bam.bai:md5,fb92c167c63e7f62d0c4c3fea8bd1b60", - "sample2_tumor.bam:md5,10c29ced5ed253731ca50097d9c848e3", - "sample2_tumor.bam.bai:md5,e0aa6d8d594070e753145503520fffab", + "sample2_normal.bam:md5,aff37a8ad733e11fd20978392810e8d8", + "sample2_normal.bam.bai:md5,64744e26f51927c77fd48c282f6ec07d", + "sample2_tumor.bam:md5,9e14b05c07bde2a4653072cba2161a67", + "sample2_tumor.bam.bai:md5,04f64a62a741c7b725877e5d37ceff2f", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,87cb6e9adf8a133244e8b331be43bb14", @@ -575,8 +575,8 @@ "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,5020a416186da412d9e89f7efac64178", - "sample3_tumor.bam.bai:md5,fc26fd7d9b388e6551898aacf5ed0c7b", + "sample3_tumor.bam:md5,13432ff8635f1d142f5f260676930754", + "sample3_tumor.bam.bai:md5,b5ace84a3a8619a93227af01e211b1b9", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,d7a8552a8a41a217954a0c825d468a60", @@ -595,6 +595,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-25T10:14:49.980270841" + "timestamp": "2026-03-26T16:13:56.877873308" } } \ No newline at end of file From dd7eae2e0f895db746d513e2e1d9dda77271561b Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Mar 2026 17:11:03 +0100 Subject: [PATCH 172/183] fix params for new wakhan update --- modules/local/wakhan/main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 85562abe..997c660b 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -50,11 +50,13 @@ process WAKHAN { """ wakhan \\ + cna \\ --target-bam ${tumor_input} \\ --breakpoints ${breakpoints} \\ --reference ${reference} \\ --genome-name ${prefix} \\ --out-dir-plots . \\ + --use-sv-haplotypes \\ ${phased_vcf} \\ ${centromere} \\ ${args} \\ From 3a8a2510687f5031f5364610b7e3ff02b2c08efc Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Mar 2026 17:33:32 +0100 Subject: [PATCH 173/183] switch cna to all --- modules/local/wakhan/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index 997c660b..c1ae4f1a 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -50,13 +50,12 @@ process WAKHAN { """ wakhan \\ - cna \\ + all \\ --target-bam ${tumor_input} \\ --breakpoints ${breakpoints} \\ --reference ${reference} \\ --genome-name ${prefix} \\ --out-dir-plots . \\ - --use-sv-haplotypes \\ ${phased_vcf} \\ ${centromere} \\ ${args} \\ From 9e2d5559e8a297f5cfdc2880e3f497d1d2e7827e Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Mar 2026 19:15:25 +0100 Subject: [PATCH 174/183] remove old output --- modules/local/wakhan/main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index c1ae4f1a..c09cc465 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -26,9 +26,8 @@ process WAKHAN { tuple val(meta), path("*/vcf_output/*_wakhan_cna_*.vcf") , emit: vcf_files tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf - tuple val(meta), path("*_optimized_peak.html") , emit: optimized_peak_html tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv - tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html + tuple val(meta), path("coverage_plots/*.png") , emit: coverage_plots_html tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf tuple val(meta), path("phasing_output/*.html") , emit: phasing_html tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf From 6f5a1b188986fd014816a58bd4714ac5674eb366 Mon Sep 17 00:00:00 2001 From: ljwharbers Date: Thu, 26 Mar 2026 20:52:38 +0100 Subject: [PATCH 175/183] small changes --- conf/modules.config | 1 + modules/local/clairs/main.nf | 2 +- modules/local/clairsto/main.nf | 2 +- modules/local/deepsomatic/callvariants/main.nf | 2 +- modules/local/deepsomatic/makeexamples/main.nf | 6 +++--- nextflow.config | 1 + nextflow_schema.json | 2 +- workflows/lrsomatic.nf | 1 + 8 files changed, 10 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index cce129da..5a3cd9a9 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -21,6 +21,7 @@ process { // // QC Processes + // withName: '.*:MULTIQC' { ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } diff --git a/modules/local/clairs/main.nf b/modules/local/clairs/main.nf index 4342e401..a7a310b5 100644 --- a/modules/local/clairs/main.nf +++ b/modules/local/clairs/main.nf @@ -20,7 +20,7 @@ process CLAIRS { task.ext.when == null || task.ext.when script: - prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" def args = task.ext.args ?: '' """ diff --git a/modules/local/clairsto/main.nf b/modules/local/clairsto/main.nf index 04e73819..7147061e 100644 --- a/modules/local/clairsto/main.nf +++ b/modules/local/clairsto/main.nf @@ -24,7 +24,7 @@ process CLAIRSTO { script: def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" def conda_prefix = workflow.containerEngine == 'singularity' ? '--conda_prefix /opt/micromamba/envs/clairs-to' : '' def pon_string = pon_vcfs.join(',') def flags_string = pon_flags.join(',') diff --git a/modules/local/deepsomatic/callvariants/main.nf b/modules/local/deepsomatic/callvariants/main.nf index 4906b954..10cdb40b 100644 --- a/modules/local/deepsomatic/callvariants/main.nf +++ b/modules/local/deepsomatic/callvariants/main.nf @@ -10,7 +10,7 @@ process DEEPSOMATIC_CALLVARIANTS { tuple val(meta), path(make_examples_tfrecords) output: - tuple val(meta), path("${prefix}.call-*-of-*.tfrecord.gz"), emit: call_variants_tfrecords + tuple val(meta), path("${prefix}.call-*-of-*.tfrecord.gz") , emit: call_variants_tfrecords tuple val("${task.process}"), val('deepsomatic'), val('1.7.0'), topic: versions, emit: versions_deepsomatic when: diff --git a/modules/local/deepsomatic/makeexamples/main.nf b/modules/local/deepsomatic/makeexamples/main.nf index 206e497c..f33300ab 100644 --- a/modules/local/deepsomatic/makeexamples/main.nf +++ b/modules/local/deepsomatic/makeexamples/main.nf @@ -12,9 +12,9 @@ process DEEPSOMATIC_MAKEEXAMPLES { tuple val(meta4), path(gzi) output: - tuple val(meta), path("${prefix}.examples.tfrecord-*-of-*.gz{,.example_info.json}"), emit: examples - tuple val(meta), path("${prefix}.gvcf.tfrecord-*-of-*.gz"), emit: gvcf - tuple val(meta), path("${prefix}_call_variant_outputs.tfrecord-*-of-*.gz", arity: "0..*"), emit: small_model_calls + tuple val(meta), path("${prefix}.examples.tfrecord-*-of-*.gz{,.example_info.json}") , emit: examples + tuple val(meta), path("${prefix}.gvcf.tfrecord-*-of-*.gz") , emit: gvcf + tuple val(meta), path("${prefix}_call_variant_outputs.tfrecord-*-of-*.gz", arity: "0..*") , emit: small_model_calls tuple val("${task.process}"), val('deepsomatic'), val('1.7.0'), topic: versions, emit: versions_deepsomatic when: diff --git a/nextflow.config b/nextflow.config index f8ad334a..3b2b40d4 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,6 +13,7 @@ params { // Input options input = null + // Small variant calling options germline_var_keep = 'consensus' somatic_var_keep = 'all' trust_caller = 'deepvariant' diff --git a/nextflow_schema.json b/nextflow_schema.json index 204a7742..89f599c3 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -55,7 +55,7 @@ }, "germline_var_keep": { "type": "string", - "description": "specifies which germline variants are used for phasing and annotation. Must be [consensus, all,deepvariant,clair]", + "description": "specifies which germline variants are used for phasing and annotation. Must be [consensus, all, deepvariant, clair]", "default": "consensus", "enum": ["consensus", "all", "deepvariant", "clair"] }, diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index eaf32b71..40f3c9bc 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -159,6 +159,7 @@ workflow LRSOMATIC { [ meta, bam.flatten()] } .set{ch_samplesheet} + // [meta_full, [bam...]] -- meta now includes: id, paired_data, type, platform, sex, fiber, clair3_model, clairS_model, clairSTO_model, kinetics // // SUBWORKFLOW: PREPARE_REFERENCE_FILES From c8347dbb841abe8267c14b61177fb53b3aa30a52 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Thu, 26 Mar 2026 21:27:01 +0100 Subject: [PATCH 176/183] output fix --- modules/local/wakhan/main.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/wakhan/main.nf b/modules/local/wakhan/main.nf index c09cc465..14929ec9 100644 --- a/modules/local/wakhan/main.nf +++ b/modules/local/wakhan/main.nf @@ -27,7 +27,8 @@ process WAKHAN { tuple val(meta), path("*_heatmap_ploidy_purity.html") , emit: heatmap_html tuple val(meta), path("*_heatmap_ploidy_purity.html.pdf") , emit: heatmap_pdf tuple val(meta), path("coverage_data/*.csv") , emit: coverage_csv - tuple val(meta), path("coverage_plots/*.png") , emit: coverage_plots_html + tuple val(meta), path("coverage_data/*.png") , emit: coverage_png + tuple val(meta), path("coverage_plots/*.html") , emit: coverage_plots_html tuple val(meta), path("coverage_plots/*.pdf") , emit: coverage_plots_pdf tuple val(meta), path("phasing_output/*.html") , emit: phasing_html tuple val(meta), path("phasing_output/*.pdf") , emit: phasing_pdf From 7e0978dde68abaa507363176c0ad2b157a554eea Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 27 Mar 2026 12:17:50 +0100 Subject: [PATCH 177/183] versioning --- modules/local/longphase/modcall/main.nf | 12 +-------- modules/nf-core/longphase/haplotag/main.nf | 12 +-------- modules/nf-core/longphase/phase/main.nf | 14 ++--------- modules/nf-core/nanoplot/main.nf | 13 +--------- .../local/paired/paired_smallvar_germline.nf | 1 - .../local/paired/paired_smallvar_somatic.nf | 1 - .../local/tumor_only/tumoronly_smallvar.nf | 1 - tests/default.nf.test.snap | 25 ++++++++++++++++++- 8 files changed, 29 insertions(+), 50 deletions(-) diff --git a/modules/local/longphase/modcall/main.nf b/modules/local/longphase/modcall/main.nf index a49ffa6d..f7d1e2bb 100644 --- a/modules/local/longphase/modcall/main.nf +++ b/modules/local/longphase/modcall/main.nf @@ -16,7 +16,7 @@ process LONGPHASE_MODCALL { output: tuple val(meta), path("*.vcf") , emit: mod_vcf tuple val(meta), path("*.log") , emit: log , optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('longphase'), eval("longphase --version | head -n 1 | sed 's/Version: //'"), topic: versions, emit: versions_longphase when: task.ext.when == null || task.ext.when @@ -38,11 +38,6 @@ process LONGPHASE_MODCALL { if [ -f "${prefix}.out" ]; then mv ${prefix}.out ${prefix}.log fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - END_VERSIONS """ stub: @@ -52,10 +47,5 @@ process LONGPHASE_MODCALL { """ touch ${prefix}.vcf ${log} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - END_VERSIONS """ } diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf index 9b4d6c88..9f4ca7ee 100644 --- a/modules/nf-core/longphase/haplotag/main.nf +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -16,7 +16,7 @@ process LONGPHASE_HAPLOTAG { output: tuple val(meta), path("*.{bam,cram}"), emit: bam tuple val(meta), path("*.log") , emit: log , optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('longphase'), eval("longphase --version | head -n 1 | sed 's/Version: //'"), topic: versions, emit: versions_longphase when: task.ext.when == null || task.ext.when @@ -42,11 +42,6 @@ process LONGPHASE_HAPLOTAG { if [ -f "${prefix}.out" ]; then mv ${prefix}.out ${prefix}.log fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - END_VERSIONS """ stub: @@ -57,10 +52,5 @@ process LONGPHASE_HAPLOTAG { """ touch ${prefix}.${suffix} ${log} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - END_VERSIONS """ } \ No newline at end of file diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 28ff6ef9..0e103248 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -20,7 +20,8 @@ process LONGPHASE_PHASE { tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('longphase'), eval("longphase --version | head -n 1 | sed 's/Version: //'"), topic: versions, emit: versions_longphase + tuple val("${task.process}"), val('tabix'), eval("tabix -h 2>&1 | grep -oP 'Version:\\s*\\K[^\\s]+'"), topic: versions, emit: versions_tabix when: task.ext.when == null || task.ext.when @@ -58,12 +59,6 @@ process LONGPHASE_PHASE { if [ -f ${prefix}_mod.vcf.gz ]; then tabix -p vcf ${prefix}_mod.vcf.gz fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS """ stub: @@ -77,10 +72,5 @@ process LONGPHASE_PHASE { $sv_command $mod_command - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') - END_VERSIONS """ } \ No newline at end of file diff --git a/modules/nf-core/nanoplot/main.nf b/modules/nf-core/nanoplot/main.nf index ba7b9a69..e89c3941 100644 --- a/modules/nf-core/nanoplot/main.nf +++ b/modules/nf-core/nanoplot/main.nf @@ -14,7 +14,7 @@ process NANOPLOT { tuple val(meta), path("*.html") , emit: html tuple val(meta), path("*.png") , optional: true, emit: png tuple val(meta), path("*.txt") , emit: txt - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('nanoplot'), eval("NanoPlot --version 2>&1 | sed 's/^.*NanoPlot //; s/ .*\$//'"), topic: versions, emit: versions_nanoplot when: task.ext.when == null || task.ext.when @@ -37,11 +37,6 @@ process NANOPLOT { mv \$nanoplot_file ${prefix}_\$nanoplot_file fi done - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - nanoplot: \$(echo \$(NanoPlot --version 2>&1) | sed 's/^.*NanoPlot //; s/ .*\$//') - END_VERSIONS """ stub: @@ -56,11 +51,5 @@ process NANOPLOT { touch ${prefix}_WeightedHistogramReadlength.html touch ${prefix}_WeightedLogTransformed_HistogramReadlength.html touch ${prefix}_Yield_By_Length.html - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - nanoplot: \$(echo \$(NanoPlot --version 2>&1) | sed 's/^.*NanoPlot //; s/ .*\$//') - END_VERSIONS """ } diff --git a/subworkflows/local/paired/paired_smallvar_germline.nf b/subworkflows/local/paired/paired_smallvar_germline.nf index 2e9f286c..ea203ff1 100644 --- a/subworkflows/local/paired/paired_smallvar_germline.nf +++ b/subworkflows/local/paired/paired_smallvar_germline.nf @@ -14,7 +14,6 @@ workflow PAIRED_SMALLVAR_GERMLINE { clair3_models main: - ch_versions = channel.empty() germline_vcf = channel.empty() germline_tbi = channel.empty() // COMBINE NORMAL BAMS WITH DOWNLOADED CLAIR3 MODELS diff --git a/subworkflows/local/paired/paired_smallvar_somatic.nf b/subworkflows/local/paired/paired_smallvar_somatic.nf index 421864bd..8df88d36 100644 --- a/subworkflows/local/paired/paired_smallvar_somatic.nf +++ b/subworkflows/local/paired/paired_smallvar_somatic.nf @@ -15,7 +15,6 @@ workflow PAIRED_SMALLVAR_SOMATIC { fai main: - ch_versions = channel.empty() somatic_vcf = channel.empty() somatic_tbi = channel.empty() diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf index 2dab2726..e737cbb3 100644 --- a/subworkflows/local/tumor_only/tumoronly_smallvar.nf +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -21,7 +21,6 @@ workflow TUMORONLY_SMALLVAR { // empty channel emission - ch_versions = channel.empty() somatic_vcf = channel.empty() germline_vcf = channel.empty() somatic_tbi = channel.empty() diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 1eba0cf8..dc1dba69 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -58,6 +58,23 @@ "perl-math-cdf": 0.1, "tabix": 1.21 }, + "LONGPHASE_HAPLOTAG": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_MODCALL_SOMATIC": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_GERMLINE": { + "longphase": "2.0.1", + "tabix": "1.23.1" + }, + "LONGPHASE_PHASE_SOMATIC": { + "longphase": "2.0.1", + "tabix": "1.23.1" + }, "METAEXTRACT": { "samtools": 1.21 }, @@ -67,6 +84,12 @@ "MOSDEPTH": { "mosdepth": "0.3.11" }, + "NANOPLOT_POST": { + "nanoplot": "1.46.1" + }, + "NANOPLOT_PRE": { + "nanoplot": "1.46.1" + }, "SAMTOOLS_FAIDX": { "samtools": "1.22.1" }, @@ -595,6 +618,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-26T16:13:56.877873308" + "timestamp": "2026-03-27T10:48:07.760935013" } } \ No newline at end of file From eb86f4a540d163fda90e9c1882174f221422b4ad Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 27 Mar 2026 14:28:28 +0100 Subject: [PATCH 178/183] revert longphase output versions --- .../nf-core/longphase/haplotag/longphase-haplotag.diff | 9 --------- modules/nf-core/longphase/haplotag/main.nf | 2 +- modules/nf-core/longphase/phase/longphase-phase.diff | 9 +++++---- modules/nf-core/longphase/phase/main.nf | 4 ++-- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/modules/nf-core/longphase/haplotag/longphase-haplotag.diff b/modules/nf-core/longphase/haplotag/longphase-haplotag.diff index cb47adc9..0d93067d 100644 --- a/modules/nf-core/longphase/haplotag/longphase-haplotag.diff +++ b/modules/nf-core/longphase/haplotag/longphase-haplotag.diff @@ -3,15 +3,6 @@ Changes in component 'nf-core/longphase/haplotag' Changes in 'longphase/haplotag/main.nf': --- modules/nf-core/longphase/haplotag/main.nf +++ modules/nf-core/longphase/haplotag/main.nf -@@ -16,7 +16,7 @@ - output: - tuple val(meta), path("*.{bam,cram}"), emit: bam - tuple val(meta), path("*.log") , emit: log , optional: true -- tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions -+ path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when @@ -42,6 +42,11 @@ if [ -f "${prefix}.out" ]; then mv ${prefix}.out ${prefix}.log diff --git a/modules/nf-core/longphase/haplotag/main.nf b/modules/nf-core/longphase/haplotag/main.nf index 9b4d6c88..d529554a 100644 --- a/modules/nf-core/longphase/haplotag/main.nf +++ b/modules/nf-core/longphase/haplotag/main.nf @@ -16,7 +16,7 @@ process LONGPHASE_HAPLOTAG { output: tuple val(meta), path("*.{bam,cram}"), emit: bam tuple val(meta), path("*.log") , emit: log , optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions when: task.ext.when == null || task.ext.when diff --git a/modules/nf-core/longphase/phase/longphase-phase.diff b/modules/nf-core/longphase/phase/longphase-phase.diff index a24c930e..b994f78f 100644 --- a/modules/nf-core/longphase/phase/longphase-phase.diff +++ b/modules/nf-core/longphase/phase/longphase-phase.diff @@ -3,24 +3,25 @@ Changes in component 'nf-core/longphase/phase' Changes in 'longphase/phase/main.nf': --- modules/nf-core/longphase/phase/main.nf +++ modules/nf-core/longphase/phase/main.nf -@@ -14,10 +14,13 @@ +@@ -14,11 +14,14 @@ output: - tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf - tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true - tuple val(meta), path("${prefix}_mod.vcf.gz"), emit: mod_vcf, optional: true -- tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions + tuple val(meta), path("${prefix}.vcf.gz") , emit: snv_vcf + tuple val(meta), path("${prefix}.vcf.gz.tbi") , emit: snv_vcf_index + tuple val(meta), path("${prefix}_SV.vcf.gz") , emit: sv_vcf , optional: true + tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true + tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true -+ path "versions.yml" , emit: versions - + tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions +- ++ when: task.ext.when == null || task.ext.when + @@ -46,9 +49,20 @@ $args2 \\ ${prefix}*.vcf diff --git a/modules/nf-core/longphase/phase/main.nf b/modules/nf-core/longphase/phase/main.nf index 28ff6ef9..3bc0b715 100644 --- a/modules/nf-core/longphase/phase/main.nf +++ b/modules/nf-core/longphase/phase/main.nf @@ -20,8 +20,8 @@ process LONGPHASE_PHASE { tuple val(meta), path("${prefix}_SV.vcf.gz.tbi") , emit: sv_vcf_index , optional: true tuple val(meta), path("${prefix}_mod.vcf.gz") , emit: mod_vcf, optional: true tuple val(meta), path("${prefix}_mod.vcf.gz.tbi"), emit: mod_vcf_index, optional: true - path "versions.yml" , emit: versions - + tuple val("${task.process}"), val("longphase"), eval("longphase --version | head -n 1 | sed 's/Version: //'"), emit: versions_longphase, topic: versions + when: task.ext.when == null || task.ext.when From f094a0be982d882629db8727695997e15fac8b50 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Fri, 27 Mar 2026 16:39:26 +0100 Subject: [PATCH 179/183] adressing comments --- conf/igenomes.config | 1 + conf/modules.config | 21 +++++++ conf/test.config | 2 +- .../haplotag/longphase-haplotag.diff | 34 ------------ nextflow.config | 9 ++- nextflow_schema.json | 50 +++++++++++++---- .../local/paired/paired_smallvar_germline.nf | 13 +++-- .../local/paired/paired_smallvar_somatic.nf | 13 +++-- subworkflows/local/small_variant_consensus.nf | 55 +++++++------------ .../local/tumor_only/tumoronly_smallvar.nf | 26 +++++---- workflows/lrsomatic.nf | 18 +++++- 11 files changed, 133 insertions(+), 109 deletions(-) delete mode 100644 modules/nf-core/longphase/haplotag/longphase-haplotag.diff diff --git a/conf/igenomes.config b/conf/igenomes.config index 06bd28a4..d9c42c81 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -43,6 +43,7 @@ params { dbsnp = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_dbsnp.vcf.gz" onekgenomes = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_1kgenomes.vcf.gz" colors = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/final_colors.vcf.gz" + asap = "${params.igenomes_base}/Homo_sapiens/ClairSTO/CHM13/Annotation/ClairSTO-pon/WGS_CHM13_ASAP.vcf.gz" } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" diff --git a/conf/modules.config b/conf/modules.config index 5a3cd9a9..4fa65136 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -405,6 +405,27 @@ process { enabled: false ] } + withName: '.*:GERMLINE_CONSENSUS:BCFTOOLS_SORT' { + ext.prefix = { "${meta.id}_germline_sorted" } + ext.args = {'-Oz -W=tbi'} + publishDir = [ + enabled: false + ] + } + withName: '.*:SOMATIC_CONSENSUS:BCFTOOLS_SORT' { + ext.prefix = { "${meta.id}_somatic_sorted" } + ext.args = {'-Oz -W=tbi'} + publishDir = [ + enabled: false + ] + } + withName: '.*:PAIRED_SMALLVAR_SOMATIC:BCFTOOLS_SORT' { + ext.prefix = { "${meta.id}_somatic_sorted" } + ext.args = {'-Oz -W=tbi'} + publishDir = [ + enabled: false + ] + } withName: '.*:CLAIRSTO' { ext.args = { "--sample_name ${meta.id}" } publishDir = [ diff --git a/conf/test.config b/conf/test.config index 96e61b28..e7014818 100644 --- a/conf/test.config +++ b/conf/test.config @@ -52,7 +52,7 @@ params { fasta = "https://raw.githubusercontent.com/IntGenomicsLab/test-datasets/main/references/GRCh38_chr19.fasta.gz" // Additional params - genome = "GRCh38" + genome = "CHM13" vep_genome = "WBcel235" vep_species = "caenorhabditis_elegans" skip_wakhan = true diff --git a/modules/nf-core/longphase/haplotag/longphase-haplotag.diff b/modules/nf-core/longphase/haplotag/longphase-haplotag.diff deleted file mode 100644 index 0d93067d..00000000 --- a/modules/nf-core/longphase/haplotag/longphase-haplotag.diff +++ /dev/null @@ -1,34 +0,0 @@ -Changes in component 'nf-core/longphase/haplotag' -'modules/nf-core/longphase/haplotag/meta.yml' is unchanged -Changes in 'longphase/haplotag/main.nf': ---- modules/nf-core/longphase/haplotag/main.nf -+++ modules/nf-core/longphase/haplotag/main.nf -@@ -42,6 +42,11 @@ - if [ -f "${prefix}.out" ]; then - mv ${prefix}.out ${prefix}.log - fi -+ -+ cat <<-END_VERSIONS > versions.yml -+ "${task.process}": -+ longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') -+ END_VERSIONS - """ - - stub: -@@ -52,5 +57,10 @@ - """ - touch ${prefix}.${suffix} - ${log} -+ -+ cat <<-END_VERSIONS > versions.yml -+ "${task.process}": -+ longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') -+ END_VERSIONS - """ --} -+} -'modules/nf-core/longphase/haplotag/environment.yml' is unchanged -'modules/nf-core/longphase/haplotag/tests/main.nf.test' is unchanged -'modules/nf-core/longphase/haplotag/tests/main.nf.test.snap' is unchanged -'modules/nf-core/longphase/haplotag/tests/nextflow.config' is unchanged -************************************************************ diff --git a/nextflow.config b/nextflow.config index 3b2b40d4..1efa481d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,9 +14,12 @@ params { input = null // Small variant calling options - germline_var_keep = 'consensus' - somatic_var_keep = 'all' - trust_caller = 'deepvariant' + germline_var_keep = ['deepvariant', 'clair'] + somatic_var_keep = ['deepsomatic', 'clair'] + germline_var_combine = 'all' + somatic_var_combine = 'all' + prioritize_caller_germline = 'deepvariant' + prioritize_caller_somatic = 'deepsomatic' pon_vcfs = null pon_flags = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 89f599c3..a83ea6e8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -47,23 +47,49 @@ "title": "options for small variant calling", "type": "object", "properties": { - "trust_caller": { - "type": "string", - "description": "specifies which variant caller format to use when both clair and deepvariant call the same variant", - "default": "deepvariant", - "enum": ["deepvariant", "clair"] - }, "germline_var_keep": { - "type": "string", - "description": "specifies which germline variants are used for phasing and annotation. Must be [consensus, all, deepvariant, clair]", - "default": "consensus", - "enum": ["consensus", "all", "deepvariant", "clair"] + "type": "array", + "description": "List of germline variant callers to use. Must include at least one of [deepvariant, clair].", + "default": ["deepvariant", "clair"], + "items": { + "type": "string", + "enum": ["deepvariant", "clair"] + }, + "minItems": 1 }, "somatic_var_keep": { + "type": "array", + "description": "List of somatic variant callers to use. Must include at least one of [deepsomatic, clair].", + "default": ["deepsomatic", "clair"], + "items": { + "type": "string", + "enum": ["deepsomatic", "clair"] + }, + "minItems": 1 + }, + "germline_var_combine": { + "type": "string", + "description": "When two germline callers are used, specifies how to combine them. 'consensus' keeps only variants called by both callers; 'all' keeps all variants from both callers.", + "default": "all", + "enum": ["consensus", "all"] + }, + "somatic_var_combine": { "type": "string", - "description": "specifies which somatic variants are used for phasing and annotation. Must be [consensus, all,deepvariant,clair]", + "description": "When two somatic callers are used, specifies how to combine them. 'consensus' keeps only variants called by both callers; 'all' keeps all variants from both callers.", "default": "all", - "enum": ["consensus", "all", "deepvariant", "clair"] + "enum": ["consensus", "all"] + }, + "prioritize_caller_germline": { + "type": "string", + "description": "When both germline callers are used, specifies which caller's format to use for variants called by both. Must be [deepvariant, clair].", + "default": "deepvariant", + "enum": ["deepvariant", "clair"] + }, + "prioritize_caller_somatic": { + "type": "string", + "description": "When both somatic callers are used, specifies which caller's format to use for variants called by both. Must be [deepsomatic, clair].", + "default": "deepsomatic", + "enum": ["deepsomatic", "clair"] } } }, diff --git a/subworkflows/local/paired/paired_smallvar_germline.nf b/subworkflows/local/paired/paired_smallvar_germline.nf index 2e9f286c..a85eb096 100644 --- a/subworkflows/local/paired/paired_smallvar_germline.nf +++ b/subworkflows/local/paired/paired_smallvar_germline.nf @@ -18,7 +18,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { germline_vcf = channel.empty() germline_tbi = channel.empty() // COMBINE NORMAL BAMS WITH DOWNLOADED CLAIR3 MODELS - if(params.germline_var_keep != 'deepvariant') { + if(params.germline_var_keep.contains('clair')) { clair3_models .map{ meta, file -> @@ -65,7 +65,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { .set{clair3_ch} } // DEEPVARIANT - if(params.germline_var_keep != 'clair') { + if(params.germline_var_keep.contains('deepvariant')) { normal_bams .map {meta, bam, bai -> @@ -100,7 +100,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { .set{deepvariant_ch} } // COMBINE GERMLINE VARIATION - if (params.germline_var_keep != 'clair' && params.germline_var_keep != 'deepvariant' ) { + if (params.germline_var_keep.size() > 1) { clair3_ch .mix(deepvariant_ch) .set{combined_germline_ch} @@ -109,17 +109,18 @@ workflow PAIRED_SMALLVAR_GERMLINE { combined_germline_ch, fasta, fai, - params.germline_var_keep + params.prioritize_caller_germline, + params.germline_var_combine ) GERMLINE_CONSENSUS.out.vcf .join(GERMLINE_CONSENSUS.out.tbi) .set{ germline_vcf } } - else if (params.germline_var_keep == 'clair') { + else if (params.germline_var_keep == ['clair']) { clair3_ch .set{germline_vcf} } - else if (params.germline_var_keep == 'deepvariant') { + else if (params.germline_var_keep == ['deepvariant']) { deepvariant_ch .set{germline_vcf} } diff --git a/subworkflows/local/paired/paired_smallvar_somatic.nf b/subworkflows/local/paired/paired_smallvar_somatic.nf index 421864bd..37c77d7e 100644 --- a/subworkflows/local/paired/paired_smallvar_somatic.nf +++ b/subworkflows/local/paired/paired_smallvar_somatic.nf @@ -20,7 +20,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { somatic_tbi = channel.empty() // CLAIRS - if(params.somatic_var_keep != 'deepvariant') { + if(params.somatic_var_keep.contains('clair')) { tumor_normal_bams .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai -> return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] @@ -57,7 +57,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { } // DEEPSOMATIC - if(params.somatic_var_keep != 'clair') { + if(params.somatic_var_keep.contains('deepsomatic')) { tumor_normal_bams .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai -> @@ -83,7 +83,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { } // COMBINE GERMLINE VARIATION - if (params.somatic_var_keep != 'clair' && params.somatic_var_keep != 'deepvariant' ) { + if (params.somatic_var_keep.size() > 1) { clairs_ch .mix(deepsomatic_ch) .set{combine_somatic_ch} @@ -92,18 +92,19 @@ workflow PAIRED_SMALLVAR_SOMATIC { combine_somatic_ch, fasta, fai, - params.somatic_var_keep + params.prioritize_caller_somatic, + params.somatic_var_combine ) SOMATIC_CONSENSUS.out.vcf .join(SOMATIC_CONSENSUS.out.tbi) .set{ somatic_vcf } } - else if (params.somatic_var_keep == 'clair') { + else if (params.somatic_var_keep == ['clair']) { clairs_ch .set{somatic_vcf} } - else if (params.somatic_var_keep == 'deepvariant') { + else if (params.somatic_var_keep == ['deepsomatic']) { deepsomatic_ch .set{somatic_vcf} } diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index 4665d4bb..cf3b6e86 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -13,7 +13,8 @@ workflow SMALL_VARIANT_CONSENSUS { mixed_vcfs // [meta: w caller_info,mixed_vcfs, mixed_indicies] fasta fai - var_keep_method + prioritize_caller + combine_method main: //normalize VCFs @@ -94,47 +95,34 @@ workflow SMALL_VARIANT_CONSENSUS { } .set{mixed_vcfs} - if (var_keep_method == 'consensus') { - mixed_vcfs - .map{ meta, vcfs, tbis -> - def file = [] - def target = [] - def regions = [] - return [meta, vcfs, tbis, file, target, regions] - } - .set{isec_input} + mixed_vcfs + .map{ meta, vcfs, tbis -> + def file = [] + def target = [] + def regions = [] + return [meta, vcfs, tbis, file, target, regions] + } + .set{isec_input} - BCFTOOLS_ISEC(isec_input) + BCFTOOLS_ISEC(isec_input) - if (params.trust_caller == 'deepvariant') { + if (combine_method == 'consensus') { + if (prioritize_caller in ['deepvariant', 'deepsomatic']) { BCFTOOLS_ISEC.out.deepvar_consensus_vcf - .set{vcf} + .set{vcf} BCFTOOLS_ISEC.out.deepvar_consensus_tbi - .set{tbi} + .set{tbi} } - if (params.trust_caller == 'clair') { + else if (prioritize_caller == 'clair') { BCFTOOLS_ISEC.out.clair_consensus_vcf - .set{vcf} + .set{vcf} BCFTOOLS_ISEC.out.clair_consensus_tbi - .set{tbi} + .set{tbi} } - } - else if (var_keep_method == 'all'){ - - mixed_vcfs - .map{ meta, vcfs, tbis -> - def file = [] - def target = [] - def regions = [] - return [meta, vcfs, tbis, file, target, regions] - } - .set{isec_input} - - BCFTOOLS_ISEC(isec_input) - - if (params.trust_caller == 'deepvariant') { + else if (combine_method == 'all') { + if (prioritize_caller in ['deepvariant', 'deepsomatic']) { BCFTOOLS_ISEC.out.deepvar_consensus_vcf .join(BCFTOOLS_ISEC.out.deepvar_consensus_tbi) .join(BCFTOOLS_ISEC.out.clair_private_vcf) @@ -147,8 +135,7 @@ workflow SMALL_VARIANT_CONSENSUS { BCFTOOLS_CONCAT.out.vcf .set{concat_out} } - - else if (params.trust_caller == 'clair') { + else if (prioritize_caller == 'clair') { BCFTOOLS_ISEC.out.deepvar_private_vcf .join(BCFTOOLS_ISEC.out.deepvar_private_tbi) .join(BCFTOOLS_ISEC.out.clair_consensus_vcf) diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf index 2dab2726..4603663a 100644 --- a/subworkflows/local/tumor_only/tumoronly_smallvar.nf +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -29,7 +29,7 @@ workflow TUMORONLY_SMALLVAR { // CLAIRS-TO (SOMATIC/NONGERMLINE VARIANT CALLING) - if(params.somatic_var_keep != 'deepvariant') { + if(params.somatic_var_keep.contains('clair') || params.germline_var_keep.contains('clair')) { tumor_bams .map { meta, bam, bai -> return [ meta, bam, bai, meta.clairSTO_model] @@ -70,7 +70,7 @@ workflow TUMORONLY_SMALLVAR { .set{clairsto_somatic_ch} } // DEEPVARIANT - if(params.somatic_var_keep != 'clair') { + if(params.germline_var_keep.contains('deepvariant')) { tumor_bams .map { meta, bam, bai -> def intervals = [] @@ -97,7 +97,7 @@ workflow TUMORONLY_SMALLVAR { } // COMBINE GERMLINE VARIANTS - if (params.germline_var_keep != 'clair' && params.germline_var_keep != 'deepvariant' ) { + if (params.germline_var_keep.size() > 1) { clairsto_germline_ch .mix(deepvariant_ch) .set{combined_germline_ch} @@ -106,22 +106,23 @@ workflow TUMORONLY_SMALLVAR { combined_germline_ch, fasta, fai, - params.germline_var_keep + params.prioritize_caller_germline, + params.germline_var_combine ) GERMLINE_CONSENSUS.out.vcf .join(GERMLINE_CONSENSUS.out.tbi) .set{germline_vcf} } - else if (params.germline_var_keep == 'clair') { + else if (params.germline_var_keep == ['clair']) { clairsto_germline_ch .set{germline_vcf} } - else if (params.germline_var_keep == 'deepvariant') { + else if (params.germline_var_keep == ['deepvariant']) { deepvariant_ch .set{germline_vcf} } // DEEPSOMATIC - if(params.somatic_var_keep != 'clair') { + if(params.somatic_var_keep.contains('deepsomatic')) { tumor_bams .map { meta, tumor_bam, tumor_bai -> def normal_bam = [] @@ -146,7 +147,7 @@ workflow TUMORONLY_SMALLVAR { .set{deepsomatic_ch} } // COMBINE SOMATIC VARIATION - if (params.somatic_var_keep != 'clair' && params.somatic_var_keep != 'deepvariant' ) { + if (params.somatic_var_keep.size() > 1) { clairsto_somatic_ch .mix(deepsomatic_ch) .set{combined_somatic_ch} @@ -155,18 +156,19 @@ workflow TUMORONLY_SMALLVAR { combined_somatic_ch, fasta, fai, - params.somatic_var_keep + params.prioritize_caller_somatic, + params.somatic_var_combine ) SOMATIC_CONSENSUS.out.vcf .join(SOMATIC_CONSENSUS.out.tbi) .set{somatic_vcf} } - else if (params.somatic_var_keep == 'clair') { + else if (params.somatic_var_keep == ['clair']) { clairsto_somatic_ch .set{somatic_vcf} } - else if (params.somatic_var_keep == 'deepvariant') { - deepvariant_ch + else if (params.somatic_var_keep == ['deepsomatic']) { + deepsomatic_ch .set{somatic_vcf} } diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 40f3c9bc..5a4e1a5e 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -100,7 +100,7 @@ workflow LRSOMATIC { pon_files = params.pon_vcfs.collect { file(it) } pon_flags = params.pon_flags } - else { + else if (params.genome == 'GRCh38') { pon_files = [ getGenomeAttribute('gnomad'), getGenomeAttribute('dbsnp'), @@ -114,6 +114,22 @@ workflow LRSOMATIC { "False" ] } + else if (params.genome == 'CHM13') { + pon_files = [ + getGenomeAttribute('gnomad'), + getGenomeAttribute('dbsnp'), + getGenomeAttribute('onekgenomes'), + getGenomeAttribute('colors'), + getGenomeAttribute('asap') + ] + pon_flags = [ + "True", + "True", + "False", + "False", + "False" + ] + } if (pon_files.size() != pon_flags.size()) { error "PoN VCFs and allele flags must have same length" } From 4834e8c96ffab5c6e36d0a97b8d5b331eec2a655 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 30 Mar 2026 11:00:33 +0200 Subject: [PATCH 180/183] updates to documentation/process labels --- conf/base.config | 18 +- modules/local/clair3/main.nf | 3 +- .../local/deepsomatic/callvariants/main.nf | 3 +- modules/local/fibertoolsrs/fire/main.nf | 3 +- .../local/fibertoolsrs/nucleosomes/main.nf | 3 +- modules/local/fibertoolsrs/predictm6a/main.nf | 3 +- modules/local/longphase/modcall/main.nf | 4 +- .../nf-core/deepvariant/callvariants/main.nf | 3 +- .../nf-core/deepvariant/makeexamples/main.nf | 2 +- .../deepvariant/postprocessvariants/main.nf | 2 +- nextflow.config | 1 + nextflow_schema.json | 59 +++- subworkflows/local/deepsomatic.nf | 48 ++- .../local/paired/paired_smallvar_germline.nf | 54 +++- .../local/paired/paired_smallvar_somatic.nf | 66 +++- subworkflows/local/phasing_haplotyping.nf | 136 ++++++-- subworkflows/local/prepare_annotation.nf | 25 +- subworkflows/local/prepare_reference_files.nf | 86 +++-- subworkflows/local/small_variant_consensus.nf | 94 ++++-- .../local/tumor_only/tumoronly_smallvar.nf | 89 ++++- .../utils_nfcore_lrsomatic_pipeline/main.nf | 32 +- tests/default.nf.test.snap | 61 ++-- workflows/lrsomatic.nf | 305 +++++++++++++----- 23 files changed, 840 insertions(+), 260 deletions(-) diff --git a/conf/base.config b/conf/base.config index cd23b577..08378854 100644 --- a/conf/base.config +++ b/conf/base.config @@ -26,9 +26,25 @@ process { // adding in your local modules too. // TODO nf-core: Customise requirements for specific processes. // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors - withLabel: process_gpu { + withLabel:process_gpu_high { ext.use_gpu = { params.use_gpu as boolean } accelerator = { (params.use_gpu as boolean) ? 1 : null } + cpus = { 8 * task.attempt } + memory = { 48.GB * task.attempt } + time = { 16.h * task.attempt } + } + withLabel:process_gpu_very_high { + ext.use_gpu = { params.use_gpu as boolean } + accelerator = { (params.use_gpu as boolean) ? 1 : null } + cpus = { 16 * task.attempt } + memory = { 96.GB * task.attempt } + time = { 16.h * task.attempt } + } + withLabel:process_gpu_very_high_memory { + ext.use_gpu = { params.use_gpu as boolean } + accelerator = { (params.use_gpu as boolean) ? 1 : null } + cpus = { 16 * task.attempt } + memory = { 128.GB * task.attempt } } withLabel:process_single { cpus = { 1 } diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index f53b8b58..44479086 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -1,7 +1,6 @@ process CLAIR3 { tag "$meta.id" - label 'process_very_high' - label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" + label "${params.use_gpu ? 'process_gpu_very_high' : 'process_very_high'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/deepsomatic/callvariants/main.nf b/modules/local/deepsomatic/callvariants/main.nf index 10cdb40b..afeb33e1 100644 --- a/modules/local/deepsomatic/callvariants/main.nf +++ b/modules/local/deepsomatic/callvariants/main.nf @@ -1,7 +1,6 @@ process DEEPSOMATIC_CALLVARIANTS { tag "$meta.id" - label 'process_high' - label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" + label "${params.use_gpu ? 'process_gpu_high' : 'process_high'}" //Conda is not supported at the moment container "docker.io/google/deepsomatic:1.7.0" diff --git a/modules/local/fibertoolsrs/fire/main.nf b/modules/local/fibertoolsrs/fire/main.nf index e78bf544..eed76d97 100644 --- a/modules/local/fibertoolsrs/fire/main.nf +++ b/modules/local/fibertoolsrs/fire/main.nf @@ -1,8 +1,7 @@ process FIBERTOOLSRS_FIRE { tag "$meta.id" label 'process_very_high' - label 'process_high_memory' - label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" + label "${params.use_gpu ? 'process_gpu_very_high_memory' : 'process_high_memory'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/fibertoolsrs/nucleosomes/main.nf b/modules/local/fibertoolsrs/nucleosomes/main.nf index 2357d638..db42d106 100644 --- a/modules/local/fibertoolsrs/nucleosomes/main.nf +++ b/modules/local/fibertoolsrs/nucleosomes/main.nf @@ -1,8 +1,7 @@ process FIBERTOOLSRS_NUCLEOSOMES { tag "$meta.id" label 'process_very_high' - label 'process_high_memory' - label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" + label "${params.use_gpu ? 'process_gpu_very_high_memory' : 'process_high_memory'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/fibertoolsrs/predictm6a/main.nf b/modules/local/fibertoolsrs/predictm6a/main.nf index 0ac25676..bb355bfe 100644 --- a/modules/local/fibertoolsrs/predictm6a/main.nf +++ b/modules/local/fibertoolsrs/predictm6a/main.nf @@ -1,8 +1,7 @@ process FIBERTOOLSRS_PREDICTM6A { tag "$meta.id" label 'process_very_high' - label 'process_high_memory' - label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" + label "${params.use_gpu ? 'process_gpu_very_high_memory' : 'process_high_memory'}" conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/longphase/modcall/main.nf b/modules/local/longphase/modcall/main.nf index a49ffa6d..45880aba 100644 --- a/modules/local/longphase/modcall/main.nf +++ b/modules/local/longphase/modcall/main.nf @@ -1,6 +1,6 @@ process LONGPHASE_MODCALL { tag "$meta.id" - label 'process_very_high' + label 'process_high' conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -29,7 +29,7 @@ process LONGPHASE_MODCALL { longphase \\ modcall \\ $args \\ - --threads $task.cpus \\ + --threads 1 \\ -o ${prefix} \\ --reference ${fasta} \\ -b ${bam} \\ diff --git a/modules/nf-core/deepvariant/callvariants/main.nf b/modules/nf-core/deepvariant/callvariants/main.nf index d9218062..e0b24884 100644 --- a/modules/nf-core/deepvariant/callvariants/main.nf +++ b/modules/nf-core/deepvariant/callvariants/main.nf @@ -1,8 +1,7 @@ process DEEPVARIANT_CALLVARIANTS { tag "$meta.id" - label 'process_high' - label "${params.use_gpu ? 'process_gpu' : 'process_noaccel'}" + label "${params.use_gpu ? 'process_gpu_very_high' : 'process_very_high'}" //Conda is not supported at the moment container "docker.io/google/deepvariant:1.9.0" diff --git a/modules/nf-core/deepvariant/makeexamples/main.nf b/modules/nf-core/deepvariant/makeexamples/main.nf index d553e980..05bd5a93 100644 --- a/modules/nf-core/deepvariant/makeexamples/main.nf +++ b/modules/nf-core/deepvariant/makeexamples/main.nf @@ -1,6 +1,6 @@ process DEEPVARIANT_MAKEEXAMPLES { tag "$meta.id" - label 'process_high' + label 'process_very_high' //Conda is not supported at the moment container "docker.io/google/deepvariant:1.9.0" diff --git a/modules/nf-core/deepvariant/postprocessvariants/main.nf b/modules/nf-core/deepvariant/postprocessvariants/main.nf index 2a7e8fb6..dd949901 100644 --- a/modules/nf-core/deepvariant/postprocessvariants/main.nf +++ b/modules/nf-core/deepvariant/postprocessvariants/main.nf @@ -1,6 +1,6 @@ process DEEPVARIANT_POSTPROCESSVARIANTS { tag "$meta.id" - label 'process_medium' + label 'process_high' //Conda is not supported at the moment container "docker.io/google/deepvariant:1.9.0" diff --git a/nextflow.config b/nextflow.config index 1efa481d..64cf5653 100644 --- a/nextflow.config +++ b/nextflow.config @@ -21,6 +21,7 @@ params { prioritize_caller_germline = 'deepvariant' prioritize_caller_somatic = 'deepsomatic' + // PON Options pon_vcfs = null pon_flags = null diff --git a/nextflow_schema.json b/nextflow_schema.json index a83ea6e8..eceb2aaf 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -43,6 +43,22 @@ } } }, + "pon_options": { + "title": "Panel of Normals (PON) options", + "type": "object", + "description": "Options for panel of normals filtering", + "default": "", + "properties": { + "pon_vcfs": { + "type": "string", + "description": "Path to panel of normals VCF file(s) for somatic variant filtering" + }, + "pon_flags": { + "type": "string", + "description": "Additional flags to pass to the PON filtering step" + } + } + }, "small_variant_calling_options": { "title": "options for small variant calling", "type": "object", @@ -108,6 +124,7 @@ }, "igenomes_ignore": { "type": "boolean", + "default": false, "description": "Do not load the iGenomes reference config.", "fa_icon": "fas fa-ban", "hidden": true, @@ -182,7 +199,9 @@ "default": 113 }, "download_vep_cache": { - "type": "boolean" + "type": "boolean", + "default": false, + "description": "Download the VEP cache if not already present" }, "vep_custom": { "type": "string" @@ -262,6 +281,7 @@ }, "ascat_pdf_plots": { "type": "boolean", + "default": false, "description": "Boolean for ASCAT production of pdf plots (entered as string)" } } @@ -285,49 +305,73 @@ "properties": { "skip_qc": { "type": "boolean", + "default": false, "description": "Skips all QC steps" }, "skip_cramino": { "type": "boolean", + "default": false, "description": "Skips Cramino" }, "skip_mosdepth": { "type": "boolean", + "default": false, "description": "Skips Mosdepth" }, "skip_bamstats": { "type": "boolean", + "default": false, "description": "Skips samtools flagstat, stats, and idxstats" }, "skip_wakhan": { "type": "boolean", + "default": false, "description": "Skips wakhan" }, "skip_fiber": { "type": "boolean", + "default": false, "description": "Skip Fibertools steps" }, "skip_ascat": { "type": "boolean", + "default": false, "description": "Skip ASCAT" }, "skip_m6a": { "type": "boolean", + "default": false, "description": "Skip m6a calling by Fibertools" }, "skip_vep": { - "type": "boolean" + "type": "boolean", + "default": false, + "description": "Skip VEP annotation" }, "skip_normalfiber": { - "type": "boolean" + "type": "boolean", + "default": false, + "description": "Skip Fibertools steps for the normal sample" }, "skip_nanoplot": { "type": "boolean", + "default": false, "description": "Skip Nanoplot" }, "skip_whatshapstats": { "type": "boolean", + "default": false, "description": "Skip WhatsHap stats" + }, + "skip_modcall": { + "type": "boolean", + "default": false, + "description": "Skip modification calling" + }, + "use_gpu": { + "type": "boolean", + "default": false, + "description": "Use GPU for supported tools (e.g. DeepVariant, DeepSomatic)" } } }, @@ -388,6 +432,7 @@ "properties": { "version": { "type": "boolean", + "default": false, "description": "Display version and exit.", "fa_icon": "fas fa-question-circle", "hidden": true @@ -411,6 +456,7 @@ }, "plaintext_email": { "type": "boolean", + "default": false, "description": "Send plain-text email instead of HTML.", "fa_icon": "fas fa-remove-format", "hidden": true @@ -425,6 +471,7 @@ }, "monochrome_logs": { "type": "boolean", + "default": false, "description": "Do not use coloured log outputs.", "fa_icon": "fas fa-palette", "hidden": true @@ -476,14 +523,17 @@ }, "help": { "type": ["boolean", "string"], + "default": false, "description": "Display the help message." }, "help_full": { "type": "boolean", + "default": false, "description": "Display the full detailed help message." }, "show_hidden": { "type": "boolean", + "default": false, "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } @@ -493,6 +543,9 @@ { "$ref": "#/$defs/input_output_options" }, + { + "$ref": "#/$defs/pon_options" + }, { "$ref": "#/$defs/small_variant_calling_options" }, diff --git a/subworkflows/local/deepsomatic.nf b/subworkflows/local/deepsomatic.nf index c91ca6af..d1baf584 100644 --- a/subworkflows/local/deepsomatic.nf +++ b/subworkflows/local/deepsomatic.nf @@ -4,29 +4,49 @@ include { DEEPSOMATIC_POSTPROCESSVARIANTS } from '../../modules/local/deepsomati workflow DEEPSOMATIC { take: - ch_input // channel: [ val(meta), path(normal), path(normal_index), path(tumor), path(tumor_index)] - ch_intervals - ch_fasta // channel: [ val(meta2), path(fasta) ] - ch_fai // channel: [ val(meta3), path(fai) ] - ch_gzi // channel: [ val(meta4), path(gzi) ] + ch_input // [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + // normal_bam/bai may be [] for tumor-only mode + ch_intervals // [[:], []] -- empty intervals (genome-wide calling) + ch_fasta // [[:], fasta] + ch_fai // [[:], fai] + ch_gzi // [[:], gzi] -- bgzipped FASTA index (empty if FASTA is not bgzipped) main: + // + // MODULE: DEEPSOMATIC_MAKEEXAMPLES (label: process_high) + // Input: [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + // Output: .examples -- [meta, [tfrecord shards...]] -- serialised pileup examples + // .gvcf -- [meta, [gvcf tfrecord shards...]] + // DEEPSOMATIC_MAKEEXAMPLES(ch_input, ch_fasta, ch_fai, ch_gzi) + // + // MODULE: DEEPSOMATIC_CALLVARIANTS (label: process_gpu / process_high) + // Input: DEEPSOMATIC_MAKEEXAMPLES.out.examples -- [meta, [tfrecord shards...]] + // Output: .call_variants_tfrecords -- [meta, tfrecord] -- DNN variant call records + // DEEPSOMATIC_CALLVARIANTS(DEEPSOMATIC_MAKEEXAMPLES.out.examples) - // Input to postprocessing step needs both the gvcfs from MAKEEXAMPLES and the variant - // calls from CALLVARIANTS. Joining on meta, which is assumed to be unique. - - + // Join CALLVARIANTS output with MAKEEXAMPLES gVCF records (both keyed on meta) + // The postprocessing step needs both the DNN calls and the gVCF pileup records ch_postproc_input = DEEPSOMATIC_CALLVARIANTS.out.call_variants_tfrecords.join( DEEPSOMATIC_MAKEEXAMPLES.out.gvcf, failOnMismatch: true ).map { meta, call_tfrecord, gvcf_tfrecords -> [meta, call_tfrecord, gvcf_tfrecords, [], []] } - + // ch_postproc_input: [meta, call_tfrecord, [gvcf_tfrecords...], [], []] + // trailing [] are for optional candidate positions and haplotype outputs (unused) + + // + // MODULE: DEEPSOMATIC_POSTPROCESSVARIANTS (label: process_medium) + // Input: [meta, call_tfrecord, [gvcf_tfrecords...], [], []] + // Output: .vcf -- [meta, vcf] -- somatic variant calls (VCF) + // .vcf_index -- [meta, tbi] + // .gvcf -- [meta, gvcf] -- genome VCF (all sites) + // .gvcf_index-- [meta, tbi] + // DEEPSOMATIC_POSTPROCESSVARIANTS( ch_postproc_input, ch_fasta, @@ -35,8 +55,8 @@ workflow DEEPSOMATIC { ) emit: - vcf = DEEPSOMATIC_POSTPROCESSVARIANTS.out.vcf - vcf_index = DEEPSOMATIC_POSTPROCESSVARIANTS.out.vcf_index - gvcf = DEEPSOMATIC_POSTPROCESSVARIANTS.out.gvcf - gvcf_index = DEEPSOMATIC_POSTPROCESSVARIANTS.out.gvcf_index + vcf = DEEPSOMATIC_POSTPROCESSVARIANTS.out.vcf // [meta, vcf] + vcf_index = DEEPSOMATIC_POSTPROCESSVARIANTS.out.vcf_index // [meta, tbi] + gvcf = DEEPSOMATIC_POSTPROCESSVARIANTS.out.gvcf // [meta, gvcf] + gvcf_index = DEEPSOMATIC_POSTPROCESSVARIANTS.out.gvcf_index // [meta, tbi] } diff --git a/subworkflows/local/paired/paired_smallvar_germline.nf b/subworkflows/local/paired/paired_smallvar_germline.nf index a85eb096..2ded1cf6 100644 --- a/subworkflows/local/paired/paired_smallvar_germline.nf +++ b/subworkflows/local/paired/paired_smallvar_germline.nf @@ -8,24 +8,30 @@ include { SMALL_VARIANT_CONSENSUS as GERMLINE_CONSENSUS } from '../../../subwo workflow PAIRED_SMALLVAR_GERMLINE { take: - normal_bams // [ meta, normal_bam, normal_bai ] - fasta - fai - clair3_models + normal_bams // [meta, normal_bam, normal_bai] -- normal sample BAMs from T/N pairs + fasta // [[:], fasta] + fai // [[:], fai] + clair3_models // [meta(id=model_name), model_dir] -- downloaded Clair3 model directories main: ch_versions = channel.empty() germline_vcf = channel.empty() germline_tbi = channel.empty() + // COMBINE NORMAL BAMS WITH DOWNLOADED CLAIR3 MODELS + // Clair3 requires the model directory path; models are keyed by model name (meta.id) if(params.germline_var_keep.contains('clair')) { + // Extract model name from meta.id for combine-by key clair3_models .map{ meta, file -> def clair3_model_name = meta.id return [meta, clair3_model_name, file] } .set{clair3_models} + // clair3_models: [meta(id=model_name), model_name_str, model_dir] + + // Emit [meta, clair3_model_name, bam, bai] to use model_name as the combine key normal_bams .map{ meta, bam, bai -> def new_meta = meta.subMap('id', @@ -40,15 +46,25 @@ workflow PAIRED_SMALLVAR_GERMLINE { return [ new_meta, meta.clair3_model, bam, bai ] } .set { normal_bams_model } + // normal_bams_model: [meta, clair3_model_name, bam, bai] + // clair3_model_name is the join key used by .combine(clair3_models, by:1) - // CLAIR3 + // + // MODULE: CLAIR3 (label: process_high) + // Input: [meta, bam, bai, model_dir, platform_str] + // fasta / fai + // Output: .vcf -- [meta, vcf] -- germline SNVs/indels + // .tbi -- [meta, tbi] + // normal_bams_model - .combine(clair3_models,by:1) + .combine(clair3_models,by:1) // join on clair3_model_name .map {_clair3_model, meta_bam, bam, bai, _meta_model, model -> def platform = (meta_bam.platform == 'pb') ? 'hifi' : meta_bam.platform return [meta_bam, bam, bai, model, platform] } .set{ clair3_input_ch } + // clair3_input_ch: [meta, bam, bai, model_dir, platform_str] + // platform_str: 'hifi' for PacBio ('pb' → 'hifi'), otherwise meta.platform (e.g. 'ont') CLAIR3 ( clair3_input_ch, @@ -63,10 +79,20 @@ workflow PAIRED_SMALLVAR_GERMLINE { return [new_meta, vcf, tbi] } .set{clair3_ch} + // clair3_ch: [meta(+caller:'clair3'), vcf, tbi] } + // DEEPVARIANT if(params.germline_var_keep.contains('deepvariant')) { + // + // SUBWORKFLOW: DEEPVARIANT (nf-core) + // Input: [meta, bam, bai, []] -- [] is empty intervals (genome-wide) + // fasta / fai + // [[:],[]] x2 -- empty PAR/GFF interval files (not used for WGS) + // Output: .vcf -- [meta, vcf] + // .vcf_index -- [meta, tbi] + // normal_bams .map {meta, bam, bai -> def new_meta = meta.subMap('id', @@ -82,13 +108,14 @@ workflow PAIRED_SMALLVAR_GERMLINE { return [new_meta, bam, bai, intervals] } .set{deepvariant_input_ch} + // deepvariant_input_ch: [meta, bam, bai, []] DEEPVARIANT ( deepvariant_input_ch, fasta, fai, - [[:],[]], - [[:],[]] + [[:],[]], // PAR regions (not used) + [[:],[]] // GFF annotation (not used) ) DEEPVARIANT.out.vcf @@ -98,13 +125,20 @@ workflow PAIRED_SMALLVAR_GERMLINE { return [new_meta, vcf, tbi] } .set{deepvariant_ch} + // deepvariant_ch: [meta(+caller:'deepvariant'), vcf, tbi] } + // COMBINE GERMLINE VARIATION + // If both callers requested: run consensus subworkflow; otherwise pass through single-caller output if (params.germline_var_keep.size() > 1) { + // Mix both caller VCFs into a single channel for GERMLINE_CONSENSUS clair3_ch .mix(deepvariant_ch) .set{combined_germline_ch} + // combined_germline_ch: [meta(+caller), vcf, tbi] -- one item per caller per sample + // SUBWORKFLOW: GERMLINE_CONSENSUS (SMALL_VARIANT_CONSENSUS alias) + // Normalise, annotate with caller ID, intersect, and combine per params GERMLINE_CONSENSUS( combined_germline_ch, fasta, @@ -115,6 +149,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { GERMLINE_CONSENSUS.out.vcf .join(GERMLINE_CONSENSUS.out.tbi) .set{ germline_vcf } + // germline_vcf: [meta(+caller from consensus), vcf, tbi] } else if (params.germline_var_keep == ['clair']) { clair3_ch @@ -125,6 +160,7 @@ workflow PAIRED_SMALLVAR_GERMLINE { .set{germline_vcf} } + // Strip 'caller' field from final germline VCF meta (not needed downstream) germline_vcf .map{ meta, vcf, tbi -> def new_meta = meta.subMap('id', @@ -141,5 +177,5 @@ workflow PAIRED_SMALLVAR_GERMLINE { .set{germline_vcf} emit: - germline_vcf + germline_vcf // [meta, vcf, tbi] -- final germline VCF (Clair3, DeepVariant, or consensus) } diff --git a/subworkflows/local/paired/paired_smallvar_somatic.nf b/subworkflows/local/paired/paired_smallvar_somatic.nf index 37c77d7e..c19553a9 100644 --- a/subworkflows/local/paired/paired_smallvar_somatic.nf +++ b/subworkflows/local/paired/paired_smallvar_somatic.nf @@ -10,23 +10,32 @@ include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../../subwor workflow PAIRED_SMALLVAR_SOMATIC { take: - tumor_normal_bams // [ meta, tumor_bam, tumor_bai, normal_hapbam, normal_bai ] - fasta - fai + tumor_normal_bams // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai] + fasta // [[:], fasta] + fai // [[:], fai] main: ch_versions = channel.empty() somatic_vcf = channel.empty() somatic_tbi = channel.empty() - // CLAIRS + // CLAIRS: somatic SNV/indel calling from T/N paired BAMs if(params.somatic_var_keep.contains('clair')) { + // Append ClairS model name (from meta) as the last element for CLAIRS module tumor_normal_bams .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai -> return[meta , tumor_bam, tumor_bai, normal_bam, normal_bai, meta.clairS_model] } .set { clairs_input } - + // clairs_input: [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, clairS_model_str] + + // + // MODULE: CLAIRS (label: process_high) + // Input: [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, model_str] + // fasta / fai + // Output: .vcfs -- [meta, [snv_vcf, indel_vcf]] -- separate SNV and indel VCFs + // .tbi -- [meta, [snv_tbi, indel_tbi]] + // CLAIRS ( clairs_input, fasta, @@ -34,15 +43,27 @@ workflow PAIRED_SMALLVAR_SOMATIC { ) // CONCAT CLAIRS INDEL AND SNV OUTPUT - + // ClairS outputs separate SNV and indel VCFs; merge into a single sorted VCF CLAIRS.out.vcfs .join(CLAIRS.out.tbi) .set{clairs_out} + // clairs_out: [meta, [snv_vcf, indel_vcf], [snv_tbi, indel_tbi]] + // + // MODULE: BCFTOOLS_CONCAT (label: process_medium) + // Input: [meta, [vcf...], [tbi...]] + // Output: .vcf -- [meta, vcf] -- unsorted concatenated SNV+indel VCF + // BCFTOOLS_CONCAT ( clairs_out ) + // + // MODULE: BCFTOOLS_SORT (label: process_medium) + // Input: [meta, vcf] + // Output: .vcf -- [meta, vcf] -- coordinate-sorted VCF + // .tbi -- [meta, tbi] + // BCFTOOLS_SORT ( BCFTOOLS_CONCAT.out.vcf ) @@ -54,23 +75,34 @@ workflow PAIRED_SMALLVAR_SOMATIC { return [new_meta, vcf, tbi] } .set{clairs_ch} + // clairs_ch: [meta(+caller:'clairs'), vcf, tbi] -- merged and sorted ClairS somatic VCF } - // DEEPSOMATIC + // DEEPSOMATIC: somatic variant calling using deep learning T/N model if(params.somatic_var_keep.contains('deepsomatic')) { + // DeepSomatic expects [normal, tumor] order (opposite of input tuple) tumor_normal_bams .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai -> return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } .set{ deepsomatic_input } - + // deepsomatic_input: [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + + // + // SUBWORKFLOW: DEEPSOMATIC (local) + // Input: [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] + // [[:],[]] -- empty intervals + // fasta / fai / [[:],[]] -- empty GZI + // Output: .vcf -- [meta, vcf] + // .vcf_index -- [meta, tbi] + // DEEPSOMATIC ( deepsomatic_input, - [[:],[]], + [[:],[]], // intervals (empty = genome-wide) fasta, fai, - [[:],[]] + [[:],[]] // GZI (empty if FASTA is uncompressed) ) DEEPSOMATIC.out.vcf @@ -80,14 +112,18 @@ workflow PAIRED_SMALLVAR_SOMATIC { return [new_meta, vcf, tbi] } .set{deepsomatic_ch} - + // deepsomatic_ch: [meta(+caller:'deepsomatic'), vcf, tbi] } - // COMBINE GERMLINE VARIATION + + // COMBINE SOMATIC VARIATION + // If both callers requested: run consensus subworkflow; otherwise pass through single-caller output if (params.somatic_var_keep.size() > 1) { clairs_ch .mix(deepsomatic_ch) .set{combine_somatic_ch} + // combine_somatic_ch: [meta(+caller), vcf, tbi] -- one item per caller per sample + // SUBWORKFLOW: SOMATIC_CONSENSUS (SMALL_VARIANT_CONSENSUS alias) SOMATIC_CONSENSUS( combine_somatic_ch, fasta, @@ -99,6 +135,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { SOMATIC_CONSENSUS.out.vcf .join(SOMATIC_CONSENSUS.out.tbi) .set{ somatic_vcf } + // somatic_vcf: [meta(+caller from consensus), vcf, tbi] } else if (params.somatic_var_keep == ['clair']) { clairs_ch @@ -108,6 +145,8 @@ workflow PAIRED_SMALLVAR_SOMATIC { deepsomatic_ch .set{somatic_vcf} } + + // Strip 'caller' from meta before emitting somatic_vcf .map{ meta, vcf, tbi -> def new_meta = meta.subMap('id', @@ -122,6 +161,7 @@ workflow PAIRED_SMALLVAR_SOMATIC { return[new_meta, vcf, tbi] } .set{somatic_vcf} + emit: - somatic_vcf + somatic_vcf // [meta, vcf, tbi] -- final somatic VCF (ClairS, DeepSomatic, or consensus) } diff --git a/subworkflows/local/phasing_haplotyping.nf b/subworkflows/local/phasing_haplotyping.nf index 935be201..e0aaf290 100644 --- a/subworkflows/local/phasing_haplotyping.nf +++ b/subworkflows/local/phasing_haplotyping.nf @@ -11,25 +11,29 @@ include { BCFTOOLS_SORT } from '../../module workflow PHASING_HAPLOTYPING { take: - tumor_normal_bams // [meta, bam, bai] - germline_vcf - somatic_vcf - fasta - fai + tumor_normal_bams // [meta, bam, bai] -- all samples: tumor, normal, and tumor-only + germline_vcf // [meta, vcf, tbi] -- germline small variants (from PAIRED_SMALLVAR_GERMLINE or TUMORONLY_SMALLVAR) + somatic_vcf // [meta, vcf, tbi] -- somatic small variants (from PAIRED_SMALLVAR_SOMATIC or TUMORONLY_SMALLVAR) + fasta // [[:], fasta] + fai // [[:], fai] main: // SPLIT INTO PAIRED AND TUMOR ONLY + // paired_data is set to the matched sample ID for paired samples, null/false for tumor-only tumor_normal_bams .branch { meta, _bams, _bai -> paired: meta.paired_data tumor_only: !meta.paired_data } .set { branched_bams } + // branched_bams.paired: [meta, bam, bai] -- tumor + normal from paired runs + // branched_bams.tumor_only: [meta, bam, bai] -- tumor-only samples branched_bams.paired .set{ paired_ch } + // Strip 'type' from tumor-only meta (no type distinction needed in this stream) branched_bams.tumor_only .map { meta, bam, bai -> def new_meta = meta.subMap('id', @@ -44,14 +48,19 @@ workflow PHASING_HAPLOTYPING { return [ new_meta, bam, bai ] } .set{ tumor_only_ch } + // tumor_only_ch: [meta (no type), bam, bai] + // Split paired samples into normal and tumor streams for separate handling paired_ch .branch { meta, _bam, _bai -> normal: meta.type == "normal" tumor: meta.type == "tumor" } .set {paired_ch_branched} + // paired_ch_branched.normal: [meta, bam, bai] -- normal BAMs from T/N pairs + // paired_ch_branched.tumor: [meta, bam, bai] -- tumor BAMs from T/N pairs + // Strip 'type' from paired normal/tumor meta to allow joining with tumor-only channel paired_ch_branched.normal .map { meta, bam, bai -> def new_meta = meta.subMap('id', @@ -66,6 +75,7 @@ workflow PHASING_HAPLOTYPING { return [ new_meta, bam, bai ] } .set{ paired_normal_ch } + // paired_normal_ch: [meta (no type), bam, bai] paired_ch_branched.tumor .map { meta, bam, bai -> @@ -81,24 +91,45 @@ workflow PHASING_HAPLOTYPING { return [ new_meta, bam, bai ] } .set{ paired_tumor_ch } + // paired_tumor_ch: [meta (no type), bam, bai] + // Germline phasing uses normal BAMs (+ tumor-only BAMs used as their own "normal" proxy) tumor_only_ch .mix(paired_normal_ch) .set { normal_bams_w_tumoronly_ch } + // normal_bams_w_tumoronly_ch: [meta, bam, bai] + // -- normal BAMs from T/N pairs + tumor-only BAMs (both phased with germline VCF) + + // Somatic phasing uses tumor BAMs (+ tumor-only BAMs) tumor_only_ch .mix(paired_tumor_ch) .set{ tumor_bams_ch} + // tumor_bams_ch: [meta, bam, bai] -- tumor BAMs from T/N pairs + tumor-only BAMs - // MODCALL + // MODCALL: detect base modifications (e.g. 5mC) from aligned BAMs using Longphase + // Results are used as additional evidence during phasing if (!params.skip_modcall) { + // + // MODULE: LONGPHASE_MODCALL_GERMLINE (label: process_high) + // Input: [meta, bam, bai] -- normal BAMs (+ tumor-only BAMs) + // fasta / fai + // Output: .mod_vcf -- [meta, vcf] -- base modification calls (e.g. CpG methylation) + // LONGPHASE_MODCALL_GERMLINE ( normal_bams_w_tumoronly_ch, fasta, fai ) + // + // MODULE: LONGPHASE_MODCALL_SOMATIC (label: process_high) + // Input: [meta, bam, bai] -- tumor BAMs (+ tumor-only BAMs) + // fasta / fai + // Output: .mod_vcf -- [meta, vcf] -- base modification calls for tumor + // + LONGPHASE_MODCALL_SOMATIC ( tumor_bams_ch, fasta, @@ -106,31 +137,54 @@ workflow PHASING_HAPLOTYPING { ) } + + // Merge germline and somatic VCFs into a single file for somatic phasing + // Longphase requires all variant sites in one VCF to produce a consistent phase block germline_vcf .join(somatic_vcf) .map { meta, germline_vcf, germline_tbi, somatic_vcf, somatic_tbi -> - def vcfs = [somatic_vcf, germline_vcf] + def vcfs = [somatic_vcf, germline_vcf] // somatic first (higher priority in phasing) def tbis = [somatic_tbi, germline_tbi] return [ meta, vcfs, tbis] } .set{germline_somatic_vcfs} + // germline_somatic_vcfs (pre-concat): [meta, [somatic_vcf, germline_vcf], [somatic_tbi, germline_tbi]] + + // + // MODULE: BCFTOOLS_CONCAT (label: process_medium) + // Input: [meta, [vcfs...], [tbis...]] -- somatic + germline VCFs to concatenate + // Output: .vcf -- [meta, vcf] -- unsorted concatenated VCF + // BCFTOOLS_CONCAT(germline_somatic_vcfs) BCFTOOLS_CONCAT.out.vcf .set{concat_out} + // concat_out: [meta, vcf] -- concatenated (unsorted) somatic+germline VCF + + // + // MODULE: BCFTOOLS_SORT (label: process_medium) + // Input: [meta, vcf] -- unsorted concatenated VCF + // Output: .vcf -- [meta, vcf] -- coordinate-sorted VCF + // .tbi -- [meta, tbi] + // BCFTOOLS_SORT(concat_out) BCFTOOLS_SORT.out.vcf .set{germline_somatic_vcfs} + // germline_somatic_vcfs (final): [meta, vcf] -- sorted combined somatic+germline VCF for somatic phasing - // PHASING + // PHASING: assign variants to haplotypes using Longphase + // - Germline phasing: uses normal BAMs + germline-only VCF (produces the phase blocks) + // - Somatic phasing: uses tumor BAMs + merged somatic+germline VCF (transfers germline phase to somatic sites) if (!params.skip_modcall) { + // With modcall: include base-modification VCF as additional phasing evidence normal_bams_w_tumoronly_ch .join(germline_vcf) .join(LONGPHASE_MODCALL_GERMLINE.out.mod_vcf) .map { meta, bam, bai, vcf, _tbi, mods-> - def svs = [] + def svs = [] // SVs for phasing are not used here return [ meta, bam, bai, vcf, svs, mods ] } .set{ longphase_phase_germline_input_ch } + // longphase_phase_germline_input_ch: [meta, bam, bai, germline_vcf, [], mod_vcf] tumor_bams_ch .join(germline_somatic_vcfs) @@ -140,8 +194,10 @@ workflow PHASING_HAPLOTYPING { return [ meta, bam, bai, vcf, svs, mods ] } .set{ longphase_phase_somatic_input_ch } + // longphase_phase_somatic_input_ch: [meta, bam, bai, somatic+germline_vcf, [], mod_vcf] } else { + // Without modcall: empty lists for SVs and mods normal_bams_w_tumoronly_ch .join(germline_vcf) .map { meta, bam, bai, vcf, _tbi -> @@ -150,6 +206,7 @@ workflow PHASING_HAPLOTYPING { return [ meta, bam, bai, vcf, svs, mods ] } .set{ longphase_phase_germline_input_ch } + // longphase_phase_germline_input_ch: [meta, bam, bai, germline_vcf, [], []] tumor_bams_ch .join(germline_somatic_vcfs) @@ -159,8 +216,16 @@ workflow PHASING_HAPLOTYPING { return [ meta, bam, bai, vcf, svs, mods ] } .set{ longphase_phase_somatic_input_ch } + // longphase_phase_somatic_input_ch: [meta, bam, bai, somatic+germline_vcf, [], []] } + // + // MODULE: LONGPHASE_PHASE_GERMLINE (label: process_medium) + // Input: [meta, bam, bai, vcf, svs, mods] -- normal BAMs + germline VCF (± mod VCF) + // fasta / fai + // Output: .snv_vcf -- [meta, vcf] -- phased germline SNV VCF (PS tags added) + // .snv_vcf_index -- [meta, tbi] + // LONGPHASE_PHASE_GERMLINE ( longphase_phase_germline_input_ch, fasta, @@ -170,7 +235,15 @@ workflow PHASING_HAPLOTYPING { LONGPHASE_PHASE_GERMLINE.out.snv_vcf .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf_index) .set{ phased_germline_vcf } - + // phased_germline_vcf: [meta, vcf, tbi] -- Longphase-phased germline VCF + + // + // MODULE: LONGPHASE_PHASE_SOMATIC (label: process_medium) + // Input: [meta, bam, bai, combined_vcf, svs, mods] -- tumor BAMs + somatic+germline VCF (± mod VCF) + // fasta / fai + // Output: .snv_vcf -- [meta, vcf] -- phased somatic (+ germline) VCF + // .snv_vcf_index -- [meta, tbi] + // LONGPHASE_PHASE_SOMATIC ( longphase_phase_somatic_input_ch, fasta, @@ -180,13 +253,14 @@ workflow PHASING_HAPLOTYPING { LONGPHASE_PHASE_SOMATIC.out.snv_vcf .join(LONGPHASE_PHASE_SOMATIC.out.snv_vcf_index) .set{ phased_somatic_vcf } + // phased_somatic_vcf: [meta, vcf, tbi] -- Longphase-phased somatic (+ germline) VCF - // HAPLOTAGING - // remove type for merging - + // HAPLOTAGGING: tag each read in the BAM with its haplotype (HP tag) using the phased germline VCF + // All sample types (tumor, normal, tumor-only) are haplotagged using the germline phase blocks + // 'type' is re-added to meta here so downstream tools can distinguish tumor from normal in the output if(!params.skip_modcall) { - + // Strip 'type' from modcall output meta to allow joining with other channels (which have no 'type') LONGPHASE_MODCALL_GERMLINE.out.mod_vcf .map { meta, mods -> def new_meta = meta.subMap('id', @@ -201,7 +275,9 @@ workflow PHASING_HAPLOTYPING { return [ new_meta, mods ] } .set{modcall_vcf_ch} + // modcall_vcf_ch: [meta (no type), mod_vcf] -- base modification VCF from germline modcall + // Build haplotag input for tumor-only samples (re-add type:"tumor") tumor_only_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .join(modcall_vcf_ch) @@ -211,6 +287,7 @@ workflow PHASING_HAPLOTYPING { return [new_meta, bam, bai, vcf, svs, mods] } .set{ tumor_only_ch } + // tumor_only_ch (updated): [meta+type:tumor, bam, bai, phased_germline_vcf, [], mod_vcf] paired_tumor_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) @@ -221,6 +298,7 @@ workflow PHASING_HAPLOTYPING { return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_tumor_ch } + // paired_tumor_ch (updated): [meta+type:tumor, bam, bai, phased_germline_vcf, [], mod_vcf] paired_normal_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) @@ -231,10 +309,11 @@ workflow PHASING_HAPLOTYPING { return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_normal_ch } + // paired_normal_ch (updated): [meta+type:normal, bam, bai, phased_germline_vcf, [], mod_vcf] } else { - + // Without modcall: empty lists for mods tumor_only_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) .map { meta, bam, bai, vcf -> @@ -244,6 +323,7 @@ workflow PHASING_HAPLOTYPING { return [new_meta, bam, bai, vcf, svs, mods] } .set{ tumor_only_ch } + // tumor_only_ch (updated): [meta+type:tumor, bam, bai, phased_germline_vcf, [], []] paired_tumor_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) @@ -254,6 +334,7 @@ workflow PHASING_HAPLOTYPING { return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_tumor_ch } + // paired_tumor_ch (updated): [meta+type:tumor, bam, bai, phased_germline_vcf, [], []] paired_normal_ch .join(LONGPHASE_PHASE_GERMLINE.out.snv_vcf) @@ -264,14 +345,24 @@ workflow PHASING_HAPLOTYPING { return [new_meta, bam, bai, vcf, svs, mods] } .set{ paired_normal_ch } + // paired_normal_ch (updated): [meta+type:normal, bam, bai, phased_germline_vcf, [], []] } + // Merge all sample types for haplotagging in a single LONGPHASE_HAPLOTAG call tumor_only_ch .mix(paired_tumor_ch) .mix(paired_normal_ch) .set {longphase_haplotag_input_ch} - + // longphase_haplotag_input_ch: [meta(+type), bam, bai, phased_germline_vcf, [], mod_vcf_or_[]] + // -- all samples (tumor-only, paired tumor, paired normal) + + // + // MODULE: LONGPHASE_HAPLOTAG (label: process_medium) + // Input: [meta, bam, bai, phased_vcf, svs, mods] -- BAM + phased germline VCF (± mod VCF) + // fasta / fai + // Output: .bam -- [meta, bam] -- BAM with HP (haplotype) and PS (phase set) tags added to reads + // LONGPHASE_HAPLOTAG ( longphase_haplotag_input_ch, fasta, @@ -280,17 +371,24 @@ workflow PHASING_HAPLOTYPING { LONGPHASE_HAPLOTAG.out.bam .set{ tumor_normal_hapbams_ch } + // tumor_normal_hapbams_ch (pre-index): [meta, bam] -- haplotagged BAM (no index yet) + // + // MODULE: SAMTOOLS_INDEX (label: process_medium) + // Input: [meta, bam] -- haplotagged BAM + // Output: .bai -- [meta, bai] + // SAMTOOLS_INDEX ( tumor_normal_hapbams_ch ) tumor_normal_hapbams_ch .join(SAMTOOLS_INDEX.out.bai) .set{ tumor_normal_hapbams_ch } + // tumor_normal_hapbams_ch (final): [meta, bam, bai] -- haplotagged BAM with index emit: - tumor_normal_hapbams_ch - phased_germline_vcf - phased_somatic_vcf + tumor_normal_hapbams_ch // [meta, bam, bai] -- haplotagged BAMs for all samples + phased_germline_vcf // [meta, vcf, tbi] -- phased germline VCF (used by SEVERUS + VEP) + phased_somatic_vcf // [meta, vcf, tbi] -- phased somatic VCF (used by VEP) } diff --git a/subworkflows/local/prepare_annotation.nf b/subworkflows/local/prepare_annotation.nf index 8771680d..f6b98e78 100644 --- a/subworkflows/local/prepare_annotation.nf +++ b/subworkflows/local/prepare_annotation.nf @@ -3,12 +3,12 @@ include {ENSEMBLVEP_DOWNLOAD } from '../../modules/nf-core/ensemblvep/download/m workflow PREPARE_ANNOTATION { take: - vep_cache - vep_cache_version - vep_genome - vep_args - vep_species - download_vep_cache + vep_cache // path: local VEP cache directory (or S3 annotation-cache URL) + vep_cache_version // int: VEP cache version (e.g. 110) + vep_genome // str: genome assembly string (e.g. "GRCh38") + vep_args // str: extra VEP CLI arguments (parsed to detect --merged / --refseq) + vep_species // str: species name (e.g. "homo_sapiens") + download_vep_cache // bool: if true, download cache via ENSEMBLVEP_DOWNLOAD instead of using local path main: @@ -16,11 +16,16 @@ workflow PREPARE_ANNOTATION { ensemblvep_cache = channel.empty() // - // MODULE: ENSEMBLVEP_DOWNLOAD + // MODULE: ENSEMBLVEP_DOWNLOAD (label: process_medium) + // Only runs when params.download_vep_cache == true + // Input: vep_download_info -- [[:], vep_genome, vep_species, vep_cache_version] + // Output: .cache -- downloaded and extracted VEP cache directory // if (download_vep_cache) { + // Build input tuple: empty meta + genome/species/version for ENSEMBLVEP_DOWNLOAD vep_download_info = channel.of([[],vep_genome, vep_species, vep_cache_version]) + // vep_download_info: [[:], genome_str, species_str, cache_version_int] ENSEMBLVEP_DOWNLOAD ( vep_download_info @@ -31,6 +36,8 @@ workflow PREPARE_ANNOTATION { } else { + // Validate that the local cache directory exists and resolve the correct subdirectory + // The annotation-cache S3 bucket uses a version-prefixed path; local paths do not def vep_annotation_cache_key = (vep_cache == "s3://annotation-cache/vep_cache/") ? "${vep_cache_version}_${vep_genome}/" : "" def vep_species_suffix = vep_args.contains("--merged") ? '_merged' : (vep_args.contains("--refseq") ? '_refseq' : '') def vep_cache_dir = "${vep_annotation_cache_key}${vep_species}${vep_species_suffix}/${vep_cache_version}_${vep_genome}" @@ -43,11 +50,13 @@ workflow PREPARE_ANNOTATION { } } + // Collect the resolved cache root as a channel value ensemblvep_cache = channel.fromPath(file("${vep_cache}/${vep_annotation_cache_key}"), checkIfExists: true).collect() } + // ensemblvep_cache: path (or list-of-paths) to the VEP cache root directory emit: - vep_cache = ensemblvep_cache + vep_cache = ensemblvep_cache // path -- VEP cache directory (downloaded or validated local) versions = ch_versions } diff --git a/subworkflows/local/prepare_reference_files.nf b/subworkflows/local/prepare_reference_files.nf index 42e2e959..efc867d9 100644 --- a/subworkflows/local/prepare_reference_files.nf +++ b/subworkflows/local/prepare_reference_files.nf @@ -13,13 +13,13 @@ include { WGET } from '../../modules/nf-core/wget/main workflow PREPARE_REFERENCE_FILES { take: - fasta - ascat_alleles - ascat_loci - ascat_loci_gc - ascat_loci_rt - basecall_meta - clair3_modelMap + fasta // str: path to reference FASTA (may be .gz) + ascat_alleles // str: path to ASCAT allele files (directory or .zip), or null + ascat_loci // str: path to ASCAT loci files (directory or .zip), or null + ascat_loci_gc // str: path to ASCAT GC correction file (.zip or direct), or null + ascat_loci_rt // str: path to ASCAT RT correction file (.zip or direct), or null + basecall_meta // [meta, basecall_model_str, kinetics_str] -- from METAEXTRACT per sample + clair3_modelMap // Map -- used to resolve download URLs main: ch_versions = channel.empty() @@ -29,8 +29,13 @@ workflow PREPARE_REFERENCE_FILES { gc_file = channel.empty() rt_file = channel.empty() - // Check if fasta and gtf are zipped + // Decompress FASTA if gzipped; pass through as-is if already uncompressed if (fasta.endsWith('.gz')){ + // + // MODULE: UNZIP_FASTA (PIGZ_UNCOMPRESS alias; label: process_medium) + // Input: [[:], fasta.gz] + // Output: .file -- [[:], fasta] -- decompressed FASTA + // UNZIP_FASTA( [ [:], fasta ]) ch_prepared_fasta = UNZIP_FASTA.out.file @@ -38,11 +43,11 @@ workflow PREPARE_REFERENCE_FILES { } else { ch_prepared_fasta = channel.value([ [:], fasta ]) } - // ch_prepared_fasta: [[:], fasta_path] -- empty meta; uncompressed if input was .gz - - // if clair3 model is specified, then download that - // otherwise use info in bam header and download that + // ch_prepared_fasta: [[:], fasta_path] -- empty meta; uncompressed FASTA + // Build Clair3 model download URLs from basecall metadata + // Priority: explicit meta.clair3_model param > auto-detected from BAM header via modelMap + // PacBio models from HKU mirror; ONT models from Oxford Nanopore CDN basecall_meta.map { meta, basecall_model_meta, _kinetics_meta -> def id_new = basecall_model_meta ? clair3_modelMap.get(basecall_model_meta) : basecall_model_meta def meta_new = [id: id_new] @@ -51,31 +56,37 @@ workflow PREPARE_REFERENCE_FILES { def url = "${download_prefix}/${model}.tar.gz" return [ meta_new, url ] } - .unique() + .unique() // deduplicate: multiple samples with the same basecall model share one download .set{ clair3_model_urls } - // [meta(id=clair3_model_id), download_url] -- one item per unique Clair3 model; deduplicated with .unique() + // clair3_model_urls: [meta(id=clair3_model_name), download_url_str] + // one item per unique Clair3 model needed across all samples // - // MODULE: Download model + // MODULE: WGET (label: process_single) + // Input: [meta, url_str] -- model name (id) + download URL + // Output: .outfile -- [meta, tarball] -- downloaded .tar.gz model archive // - WGET ( clair3_model_urls ) ch_versions = ch_versions.mix(WGET.out.versions) // - // MODULE: Untar model + // MODULE: UNTAR (label: process_single) + // Input: WGET.out.outfile -- [meta, tarball] + // Output: .untar -- [meta, model_dir] -- extracted Clair3 model directory // - UNTAR ( WGET.out.outfile ) UNTAR.out.untar.set { downloaded_clair3_models } - // [meta(id=clair3_model_id), model_dir] -- extracted Clair3 model directory + // downloaded_clair3_models: [meta(id=clair3_model_name), model_dir] // - // MODULE: Index the fasta + // MODULE: SAMTOOLS_FAIDX (label: process_single) + // Input: [[:], fasta, []] -- empty meta + empty regions file (index full FASTA) + // false -- do not write fai to stdout + // Output: .fai -- [[:], fai_path] // SAMTOOLS_FAIDX ( ch_prepared_fasta.map { meta, fa -> [meta, fa, []] }, @@ -86,51 +97,66 @@ workflow PREPARE_REFERENCE_FILES { // ch_prepared_fai: [[:], fai_path] -- empty meta // - // Prepare ASCAT files + // Prepare ASCAT reference files + // Each file set can be provided as a .zip archive or a plain directory/file path + // All ASCAT outputs are flat file collections (no meta tuple) for use with ASCAT module // - - // prepare ascat and controlfreec reference files if ( !params.skip_ascat ) { + // Allele files: per-chromosome SNP allele frequency files (used for LogR/BAF calculation) if (!ascat_alleles) allele_files = channel.empty() else if (ascat_alleles.endsWith(".zip")) { + // MODULE: UNZIP_ALLELES (UNZIP alias; label: process_single) + // Input: [meta(id=basename), [zip_file]] -- collected zip + // Output: .unzipped_archive -- [meta, dir] -- extracted directory; flatMap lists individual files UNZIP_ALLELES(channel.fromPath(file(ascat_alleles)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) allele_files = UNZIP_ALLELES.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() + // allele_files: [path, path, ...] -- all per-chromosome allele files collected ch_versions = ch_versions.mix(UNZIP_ALLELES.out.versions) } else allele_files = channel.fromPath(ascat_alleles).collect() + // Loci files: per-chromosome SNP loci positions if (!ascat_loci) loci_files = channel.empty() else if (ascat_loci.endsWith(".zip")) { + // MODULE: UNZIP_LOCI (UNZIP alias; label: process_single) UNZIP_LOCI(channel.fromPath(file(ascat_loci)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) loci_files = UNZIP_LOCI.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() + // loci_files: [path, path, ...] -- all per-chromosome loci files collected ch_versions = ch_versions.mix(UNZIP_LOCI.out.versions) } else loci_files = channel.fromPath(ascat_loci).collect() + // GC correction file: genome-wide GC content per locus (optional) if (!ascat_loci_gc) gc_file = channel.value([]) else if ( ascat_loci_gc.endsWith(".zip") ) { + // MODULE: UNZIP_GC (UNZIP alias; label: process_single) UNZIP_GC(channel.fromPath(file(ascat_loci_gc)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) gc_file = UNZIP_GC.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() + // gc_file: [path, ...] -- GC correction file(s) collected ch_versions = ch_versions.mix(UNZIP_GC.out.versions) } else gc_file = channel.fromPath(ascat_loci_gc).collect() + // Replication timing correction file: RT correction per locus (optional) if (!ascat_loci_rt) rt_file = channel.value([]) else if (ascat_loci_rt.endsWith(".zip")) { + // MODULE: UNZIP_RT (UNZIP alias; label: process_single) UNZIP_RT(channel.fromPath(file(ascat_loci_rt)).collect().map{ it -> [ [ id:it[0].baseName ], it ] }) rt_file = UNZIP_RT.out.unzipped_archive.flatMap { it -> it[1].listFiles() }.collect() + // rt_file: [path, ...] -- RT correction file(s) collected ch_versions = ch_versions.mix(UNZIP_RT.out.versions) } else rt_file = channel.fromPath(ascat_loci_rt).collect() } emit: - prepped_fasta = ch_prepared_fasta // [[:], fasta_path] - prepped_fai = ch_prepared_fai // [[:], fai_path] + prepped_fasta = ch_prepared_fasta // [[:], fasta_path] -- uncompressed reference FASTA + prepped_fai = ch_prepared_fai // [[:], fai_path] -- samtools FAI index // ASCAT reference files -- flat file collections (no meta tuple wrapper) - allele_files - loci_files - gc_file - rt_file + // Each is a list of paths collected into a single channel value + allele_files // [path, ...] -- per-chromosome allele frequency files + loci_files // [path, ...] -- per-chromosome loci position files + gc_file // [path, ...] -- GC correction file ([] if not provided) + rt_file // [path, ...] -- replication timing correction file ([] if not provided) - downloaded_clair3_models // [meta(id=clair3_model_id), model_dir] + downloaded_clair3_models // [meta(id=clair3_model_name), model_dir] versions = ch_versions } diff --git a/subworkflows/local/small_variant_consensus.nf b/subworkflows/local/small_variant_consensus.nf index cf3b6e86..9befdb2c 100644 --- a/subworkflows/local/small_variant_consensus.nf +++ b/subworkflows/local/small_variant_consensus.nf @@ -10,50 +10,78 @@ include { BCFTOOLS_SORT } from '../../modul workflow SMALL_VARIANT_CONSENSUS { take: - mixed_vcfs // [meta: w caller_info,mixed_vcfs, mixed_indicies] - fasta - fai - prioritize_caller - combine_method + mixed_vcfs // [meta(+caller field), vcf, tbi] -- one item per caller per sample + // meta.caller is one of: 'clair3', 'clairs-to', 'clairs', 'deepvariant', 'deepsomatic' + fasta // [[:], fasta] + fai // [[:], fai] + prioritize_caller // str: which caller's calls take priority ('deepvariant'/'deepsomatic' or 'clair') + combine_method // str: 'consensus' (intersection only) or 'all' (intersection + private calls from priority caller) main: - //normalize VCFs + + // + // MODULE: BCFTOOLS_NORM (label: process_medium) + // Input: [meta, vcf, tbi] -- per-caller VCF + // Output: .vcf -- [meta, vcf] -- left-aligned, normalised VCF + // .tbi -- [meta, tbi] + // BCFTOOLS_NORM(mixed_vcfs, fasta) BCFTOOLS_NORM.out.vcf .join(BCFTOOLS_NORM.out.tbi) .set {normalized_vcfs} - - // create annotation file with caller name + // normalized_vcfs: [meta(+caller), vcf, tbi] -- normalised per-caller VCF + + // + // MODULE: BCFTOOLS_QUERY (label: process_single) + // Extract variant positions to build a caller-annotation file used by BCFTOOLS_ANNOTATE + // Input: [meta, vcf, tbi] -- normalised VCF + // Output: .output -- [meta, tsv] -- tab-separated annotation file (CHROM POS CALLER) + // .index -- [meta, tbi] + // BCFTOOLS_QUERY(normalized_vcfs, [], [], []) + // Prepare BCFTOOLS_ANNOTATE input: VCF + caller-name annotation file normalized_vcfs .join(BCFTOOLS_QUERY.out.output) .join(BCFTOOLS_QUERY.out.index) .map{ meta, vcf, tbi, annotations, annotations_index -> - def columns = [] - def header_lines = [] - def rename_chrs = [] + def columns = [] // no extra column specs + def header_lines = [] // no extra header lines + def rename_chrs = [] // no chromosome renaming return [ meta, vcf, tbi, annotations, annotations_index, columns, header_lines, rename_chrs ] } .set{annotate_input} - - // Annotate vcfs with caller id + // annotate_input: [meta, vcf, tbi, annotations_tsv, annotations_tbi, [], [], []] + + // + // MODULE: BCFTOOLS_ANNOTATE (label: process_medium) + // Adds CALLER INFO field to each VCF record using the query-generated annotation file + // Input: [meta, vcf, tbi, annotations_tsv, annotations_tbi, [], [], []] + // Output: .vcf -- [meta, vcf] -- VCF with CALLER annotation added + // .tbi -- [meta, tbi] + // BCFTOOLS_ANNOTATE(annotate_input) BCFTOOLS_ANNOTATE.out.vcf .join(BCFTOOLS_ANNOTATE.out.tbi) .set{annotated_vcfs} + // annotated_vcfs: [meta(+caller), vcf, tbi] -- VCF with CALLER INFO tag + + // Branch annotated VCFs by caller family for the intersection step annotated_vcfs .branch { meta, _vcfs, _tbi -> deepvariant: meta.caller in [ 'deepvariant', 'deepsomatic' ] clair: meta.caller in ['clair3','clairs-to','clairs'] } .set{annotated_vcfs_branched} + // annotated_vcfs_branched.deepvariant: [meta(caller=deepvariant/deepsomatic), vcf, tbi] + // annotated_vcfs_branched.clair: [meta(caller=clair3/clairs-to/clairs), vcf, tbi] clair_ch = annotated_vcfs_branched.clair deepvariant_ch = annotated_vcfs_branched.deepvariant + // Strip 'caller' field from meta before joining so both channels share the same key clair_ch. map {meta, vcfs, tbi -> def new_meta = meta.subMap('id', @@ -69,6 +97,7 @@ workflow SMALL_VARIANT_CONSENSUS { return [ new_meta, vcfs, tbi] } .set{clair_ch} + // clair_ch: [meta (no caller), vcf, tbi] deepvariant_ch .map {meta, vcfs, tbi -> @@ -85,7 +114,9 @@ workflow SMALL_VARIANT_CONSENSUS { return [ new_meta, vcfs, tbi] } .set{deepvariant_ch} + // deepvariant_ch: [meta (no caller), vcf, tbi] + // Join DeepVariant and Clair VCFs per sample into a single tuple for BCFTOOLS_ISEC deepvariant_ch .join(clair_ch) .map { meta, deepvar_vcf, deepvar_tbi, clair_vcf, clair_tbi -> @@ -94,19 +125,35 @@ workflow SMALL_VARIANT_CONSENSUS { return [ meta, vcfs, tbis] } .set{mixed_vcfs} + // mixed_vcfs (re-paired): [meta, [deepvar_vcf, clair_vcf], [deepvar_tbi, clair_tbi]] + // Add empty optional fields required by BCFTOOLS_ISEC mixed_vcfs .map{ meta, vcfs, tbis -> - def file = [] - def target = [] - def regions = [] + def file = [] // no regions file + def target = [] // no target sites + def regions = [] // no region string return [meta, vcfs, tbis, file, target, regions] } .set{isec_input} - + // isec_input: [meta, [deepvar_vcf, clair_vcf], [deepvar_tbi, clair_tbi], [], [], []] + + // + // MODULE: BCFTOOLS_ISEC (label: process_medium) + // Computes the intersection and private sets for the two callers + // Input: [meta, [vcf1, vcf2], [tbi1, tbi2], [], [], []] + // Output (custom nf-core module outputs): + // .deepvar_consensus_vcf -- [meta, vcf] -- variants called by both callers (DeepVariant record) + // .clair_consensus_vcf -- [meta, vcf] -- variants called by both callers (Clair record) + // .deepvar_private_vcf -- [meta, vcf] -- variants unique to DeepVariant + // .clair_private_vcf -- [meta, vcf] -- variants unique to Clair + // (+ corresponding .tbi outputs for each) + // BCFTOOLS_ISEC(isec_input) if (combine_method == 'consensus') { + // Take only the intersection: variants called by BOTH callers + // Use the record from the prioritized caller if (prioritize_caller in ['deepvariant', 'deepsomatic']) { BCFTOOLS_ISEC.out.deepvar_consensus_vcf .set{vcf} @@ -119,10 +166,14 @@ workflow SMALL_VARIANT_CONSENSUS { BCFTOOLS_ISEC.out.clair_consensus_tbi .set{tbi} } + // vcf/tbi: [meta, vcf/tbi] -- consensus-only calls from the priority caller } else if (combine_method == 'all') { + // Take the intersection PLUS the private calls from the prioritized caller + // (private calls from the non-priority caller are discarded) if (prioritize_caller in ['deepvariant', 'deepsomatic']) { + // consensus (DeepVariant record) + DeepVariant-private variants BCFTOOLS_ISEC.out.deepvar_consensus_vcf .join(BCFTOOLS_ISEC.out.deepvar_consensus_tbi) .join(BCFTOOLS_ISEC.out.clair_private_vcf) @@ -131,11 +182,13 @@ workflow SMALL_VARIANT_CONSENSUS { return[meta, [deepvar_vcf, clair_vcf], [deepvar_tbi, clair_tbi]] } .set{concat_input} + // concat_input: [meta, [consensus_vcf, private_vcf], [consensus_tbi, private_tbi]] BCFTOOLS_CONCAT(concat_input) BCFTOOLS_CONCAT.out.vcf .set{concat_out} } else if (prioritize_caller == 'clair') { + // consensus (Clair record) + Clair-private variants BCFTOOLS_ISEC.out.deepvar_private_vcf .join(BCFTOOLS_ISEC.out.deepvar_private_tbi) .join(BCFTOOLS_ISEC.out.clair_consensus_vcf) @@ -144,19 +197,22 @@ workflow SMALL_VARIANT_CONSENSUS { return[meta, [deepvar_vcf, clair_vcf], [deepvar_tbi, clair_tbi]] } .set{concat_input} + // concat_input: [meta, [private_vcf, consensus_vcf], [private_tbi, consensus_tbi]] BCFTOOLS_CONCAT(concat_input) BCFTOOLS_CONCAT.out.vcf .set{concat_out} } + // concat_out: [meta, vcf] -- unsorted concatenated VCF (consensus + priority-caller-private) BCFTOOLS_SORT(concat_out) BCFTOOLS_SORT.out.vcf .set{vcf} BCFTOOLS_SORT.out.tbi .set{tbi} + // vcf/tbi: [meta, vcf/tbi] -- sorted combined VCF } emit: - vcf - tbi + vcf // [meta, vcf] -- final consensus/combined VCF + tbi // [meta, tbi] } diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf index 4603663a..e9b50e2f 100644 --- a/subworkflows/local/tumor_only/tumoronly_smallvar.nf +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -12,43 +12,64 @@ include { SMALL_VARIANT_CONSENSUS as SOMATIC_CONSENSUS } from '../../../subwork workflow TUMORONLY_SMALLVAR { take: - tumor_bams // [ meta, tumor_bams, tumor_bai ] - fasta - fai - pon_channel + tumor_bams // [meta, tumor_bam, tumor_bai] -- tumor-only aligned BAMs (no matched normal) + fasta // [[:], fasta] + fai // [[:], fai] + pon_channel // [ [pon_vcf_path, ...], [is_population_allele_flag, ...] ] + // used by ClairS-TO to filter germline variants with population allele databases main: - // empty channel emission - ch_versions = channel.empty() somatic_vcf = channel.empty() germline_vcf = channel.empty() somatic_tbi = channel.empty() germline_tbi = channel.empty() - // CLAIRS-TO (SOMATIC/NONGERMLINE VARIANT CALLING) + // CLAIRS-TO: somatic AND germline variant calling from tumor-only BAM + // ClairS-TO uses a panel-of-normals / population allele database to separate somatic from germline + // Runs if either somatic or germline clair calling is requested (produces both jointly) if(params.somatic_var_keep.contains('clair') || params.germline_var_keep.contains('clair')) { + // Append model name and PoN info to build the full CLAIRSTO input tumor_bams .map { meta, bam, bai -> return [ meta, bam, bai, meta.clairSTO_model] } .combine(pon_channel) .set{ clairsto_input_ch} + // clairsto_input_ch: [meta, bam, bai, clairSTO_model_str, [pon_vcf_paths], [pon_flags]] + + // + // MODULE: CLAIRSTO (label: process_high) + // Input: [meta, bam, bai, model_str, [pon_vcfs], [pon_flags]] + // fasta / fai + // Output: .snv_vcf -- [meta, vcf] -- SNV calls (germline + somatic, unsplit) + // .indel_vcf -- [meta, vcf] -- indel calls (germline + somatic, unsplit) + // CLAIRSTO ( clairsto_input_ch, fasta, fai ) - // SPLIT CLAIRSTO GERMLINE AND SOMATIC VARIATION + // ClairS-TO outputs a combined VCF with FILTER tags indicating somatic/germline status; + // VCFSPLIT separates these into two VCFs CLAIRSTO.out.indel_vcf .join(CLAIRSTO.out.snv_vcf) .set{ clairsto_combined_vcf } + // clairsto_combined_vcf: [meta, indel_vcf, snv_vcf] + // + // MODULE: VCFSPLIT (label: process_single) + // Input: [meta, indel_vcf, snv_vcf] -- combined ClairS-TO output + // Output: .germline_vcf -- [meta, vcf] -- germline variants only + // .germline_tbi -- [meta, tbi] + // .somatic_vcf -- [meta, vcf] -- somatic variants only + // .somatic_tbi -- [meta, tbi] + // VCFSPLIT ( clairsto_combined_vcf ) @@ -60,6 +81,7 @@ workflow TUMORONLY_SMALLVAR { return [ new_meta, vcf, tbi] } .set{clairsto_germline_ch} + // clairsto_germline_ch: [meta(+caller:'clairs-to'), vcf, tbi] -- germline variants VCFSPLIT.out.somatic_vcf .join(VCFSPLIT.out.somatic_tbi) @@ -68,25 +90,35 @@ workflow TUMORONLY_SMALLVAR { return [ new_meta, vcf, tbi] } .set{clairsto_somatic_ch} + // clairsto_somatic_ch: [meta(+caller:'clairs-to'), vcf, tbi] -- somatic variants } - // DEEPVARIANT + + // DEEPVARIANT: germline-only variant calling (no somatic mode for tumor-only) if(params.germline_var_keep.contains('deepvariant')) { + + // + // SUBWORKFLOW: DEEPVARIANT (nf-core) + // Input: [meta, bam, bai, []] -- [] = genome-wide (no interval list) + // fasta / fai / [[:],[]] x2 -- empty PAR/GFF + // Output: .vcf -- [meta, vcf] + // .vcf_index -- [meta, tbi] + // tumor_bams .map { meta, bam, bai -> def intervals = [] return [meta,bam,bai, intervals] } .set{deepvariant_input_ch} + // deepvariant_input_ch: [meta, bam, bai, []] DEEPVARIANT ( deepvariant_input_ch, fasta, fai, - [[:],[]], - [[:],[]] + [[:],[]], // PAR regions (not used) + [[:],[]] // GFF annotation (not used) ) - DEEPVARIANT.out.vcf .join(DEEPVARIANT.out.vcf_index) .map{ meta, vcf, tbi -> @@ -94,14 +126,18 @@ workflow TUMORONLY_SMALLVAR { return [new_meta, vcf, tbi] } .set{deepvariant_ch} + // deepvariant_ch: [meta(+caller:'deepvariant'), vcf, tbi] } // COMBINE GERMLINE VARIANTS + // If both callers requested: run consensus; otherwise pass through single-caller output if (params.germline_var_keep.size() > 1) { clairsto_germline_ch .mix(deepvariant_ch) .set{combined_germline_ch} + // combined_germline_ch: [meta(+caller), vcf, tbi] -- one item per caller per sample + // SUBWORKFLOW: GERMLINE_CONSENSUS (SMALL_VARIANT_CONSENSUS alias) GERMLINE_CONSENSUS( combined_germline_ch, fasta, @@ -112,6 +148,7 @@ workflow TUMORONLY_SMALLVAR { GERMLINE_CONSENSUS.out.vcf .join(GERMLINE_CONSENSUS.out.tbi) .set{germline_vcf} + // germline_vcf: [meta(+caller from consensus), vcf, tbi] } else if (params.germline_var_keep == ['clair']) { clairsto_germline_ch @@ -121,7 +158,9 @@ workflow TUMORONLY_SMALLVAR { deepvariant_ch .set{germline_vcf} } - // DEEPSOMATIC + + // DEEPSOMATIC: somatic variant calling in tumor-only mode (no matched normal) + // Normal BAM/BAI are passed as empty lists; DeepSomatic uses the model's internal normal baseline if(params.somatic_var_keep.contains('deepsomatic')) { tumor_bams .map { meta, tumor_bam, tumor_bai -> @@ -130,13 +169,22 @@ workflow TUMORONLY_SMALLVAR { return [meta,normal_bam,normal_bai,tumor_bam,tumor_bai] } .set{deepsomatic_input_ch} + // deepsomatic_input_ch: [meta, [], [], tumor_bam, tumor_bai] + // empty normal_bam/bai signals tumor-only mode to DEEPSOMATIC subworkflow + // + // SUBWORKFLOW: DEEPSOMATIC (local) + // Input: [meta, [], [], tumor_bam, tumor_bai] -- tumor-only (no normal) + // [[:],[]] / fasta / fai / [[:],[]] + // Output: .vcf -- [meta, vcf] + // .vcf_index -- [meta, tbi] + // DEEPSOMATIC ( deepsomatic_input_ch, - [[:],[]], + [[:],[]], // intervals (empty = genome-wide) fasta, fai, - [[:],[]] + [[:],[]] // GZI (empty if FASTA is uncompressed) ) DEEPSOMATIC.out.vcf .join(DEEPSOMATIC.out.vcf_index) @@ -145,13 +193,17 @@ workflow TUMORONLY_SMALLVAR { return [new_meta, vcf, tbi] } .set{deepsomatic_ch} + // deepsomatic_ch: [meta(+caller:'deepsomatic'), vcf, tbi] } + // COMBINE SOMATIC VARIATION if (params.somatic_var_keep.size() > 1) { clairsto_somatic_ch .mix(deepsomatic_ch) .set{combined_somatic_ch} + // combined_somatic_ch: [meta(+caller), vcf, tbi] -- one item per caller per sample + // SUBWORKFLOW: SOMATIC_CONSENSUS (SMALL_VARIANT_CONSENSUS alias) SOMATIC_CONSENSUS( combined_somatic_ch, fasta, @@ -162,6 +214,7 @@ workflow TUMORONLY_SMALLVAR { SOMATIC_CONSENSUS.out.vcf .join(SOMATIC_CONSENSUS.out.tbi) .set{somatic_vcf} + // somatic_vcf: [meta(+caller from consensus), vcf, tbi] } else if (params.somatic_var_keep == ['clair']) { clairsto_somatic_ch @@ -172,6 +225,7 @@ workflow TUMORONLY_SMALLVAR { .set{somatic_vcf} } + // Strip 'caller' from meta before emitting both VCFs somatic_vcf .map{ meta, vcf, tbi -> def new_meta = meta.subMap('id', @@ -201,9 +255,10 @@ workflow TUMORONLY_SMALLVAR { return[new_meta, vcf, tbi] } .set{germline_vcf} + emit: - somatic_vcf - germline_vcf + somatic_vcf // [meta, vcf, tbi] -- final somatic VCF (ClairS-TO, DeepSomatic, or consensus) + germline_vcf // [meta, vcf, tbi] -- final germline VCF (ClairS-TO germline, DeepVariant, or consensus) } diff --git a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf index 94d8789b..34db6e1f 100644 --- a/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_lrsomatic_pipeline/main.nf @@ -84,17 +84,23 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // + // Parse the input samplesheet CSV and build a per-sample BAM channel + // Each samplesheet row describes one tumor (+ optional normal) sample + // Columns: sample_id, bam_tumor, bam_normal, method, sex, fiber, + // clair3_model, clairSTO_model, clairS_model, tumor_replicate, normal_replicate channel .fromList(samplesheetToList(params.input, "${projectDir}/assets/schema_input.json")) + // Step 1: build a combined meta map from the samplesheet columns + // paired_data = true if a normal BAM is present; false for tumor-only .map { meta, bam_tumor, bam_normal, method, sex, fiber, clair3_model, clairSTO_model, clairS_model, tumor_replicate, normal_replicate -> def real_clair3_model = (clair3_model == null ) ? null : clair3_model def real_clairS_model = (clairS_model == null ) ? null : clairS_model def real_clairSTO_model = (clairSTO_model == null ) ? null : clairSTO_model def paired_data = bam_normal ? true : false def meta_info = meta + [ paired_data: paired_data, - platform: method, - sex: sex, - fiber: fiber, + platform: method, // 'ont' or 'pb' + sex: sex, // 'XX', 'XY', or null (for ASCAT) + fiber: fiber, // 'y' or 'n' (fiber-seq data flag) clair3_model: real_clair3_model, clairS_model: real_clairS_model, clairSTO_model: real_clairSTO_model, @@ -102,9 +108,13 @@ workflow PIPELINE_INITIALISATION { normal_replicate: normal_replicate] return [ meta_info, [ bam_tumor ], [ bam_normal ?: [] ] ] } + // Flatten BAM lists (handles multi-run entries where bam_tumor/bam_normal are lists) .map { meta, bam_tumor, bam_normal -> [ meta, bam_tumor.flatten(), bam_normal.flatten() ] } + // Step 2: split each row into separate tumor and normal items + // flatMap emits 1 item (tumor-only) or 2 items (tumor + normal) per samplesheet row + // Each item gets type='tumor' or type='normal' and the appropriate replicate ID .flatMap { meta, tumor_bam, normal_bam -> def meta_tumor = meta.clone() meta_tumor.type = 'tumor' @@ -120,6 +130,7 @@ workflow PIPELINE_INITIALISATION { 'clairSTO_model', 'replicate') def result = [[meta_tumor, tumor_bam]] + // result so far: [[meta_tumor, [tumor_bam_path...]]] if (normal_bam) { def meta_normal = meta.clone() @@ -136,17 +147,24 @@ workflow PIPELINE_INITIALISATION { 'clairSTO_model', 'replicate') result << [meta_normal, normal_bam] + // result now: [[meta_tumor, [tumor_bams]], [meta_normal, [normal_bams]]] } return result } .set { ch_samplesheet } - - // ch_samplesheet -> meta: [id, paired_data, platform, sex, type] - // bam: unaligned bams + // ch_samplesheet: [meta, [bam...]] + // meta fields: id, paired_data, type ('tumor'|'normal'), platform ('ont'|'pb'), + // sex, fiber ('y'|'n'), clair3_model, clairS_model, clairSTO_model, replicate + // paired_data: true for both items in a T/N pair (same value for tumor AND normal rows) + // bam: list of paths (multiple runs for same sample remain as a list until SAMTOOLS_CAT) + // + // NOTE: tumor-only rows emit ONE item (type='tumor', paired_data=false) + // paired rows emit TWO items — tumor (paired_data=true) + normal (paired_data=true) + // Both share the same 'id' to allow downstream joins emit: - samplesheet = ch_samplesheet + samplesheet = ch_samplesheet // [meta, [bam...]] -- see channel structure above versions = ch_versions } diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 1eba0cf8..fcdc165a 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -58,6 +58,15 @@ "perl-math-cdf": 0.1, "tabix": 1.21 }, + "LONGPHASE_HAPLOTAG": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_GERMLINE": { + "longphase": "2.0.1" + }, + "LONGPHASE_PHASE_SOMATIC": { + "longphase": "2.0.1" + }, "METAEXTRACT": { "samtools": 1.21 }, @@ -537,56 +546,56 @@ "sample3/vep/somatic/sample3_SOMATIC_VEP.vcf.gz_summary.html" ], [ - "sample1_normal.bam:md5,186e4e8400cce1f02190fa91ad449271", - "sample1_normal.bam.bai:md5,cabfbe44aa1f0fb6cf5b4d54e6c4d811", - "sample1_tumor.bam:md5,2887783d87d9e4dedbbca367d5e4efdb", - "sample1_tumor.bam.bai:md5,9eb6cf08de5a60644fa54c8810e3dc58", + "sample1_normal.bam:md5,3ce847c38eb619781e32a10c28e0c35c", + "sample1_normal.bam.bai:md5,8dd8c7fa037badc7097067d5a88672cd", + "sample1_tumor.bam:md5,ed5eb35b63d5e92fa8e461b9a1732b21", + "sample1_tumor.bam.bai:md5,21018d3f1f85be74fd7dc66873219b05", "sample1.flagstat:md5,1c41ea9923945501eb7e41f83a90502d", "sample1.idxstats:md5,902e503387799123ea59255e3fca172c", "sample1.stats:md5,70fabbdc07dec0479b3fc7dcec344054", "sample1.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample1.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample1.stats:md5,5012c82d3d3ca60ffdd2fb970f772566", - "sample1_whatshap_stats.gtf:md5,32e249c78790982098e4b0a606171d69", - "sample1_whatshap_stats.log:md5,407b5fcdfbeec1830b2ed6f65f1c2c18", - "sample1_whatshap_stats.tsv:md5,41290e994b5e6dab5ed696925cbb0716", + "sample1_whatshap_stats.gtf:md5,428ca0e0f48dc2e3e1b978fa7cf720f3", + "sample1_whatshap_stats.log:md5,5c1f0f79a60a6879b75271fa94b620e8", + "sample1_whatshap_stats.tsv:md5,98582c7e0ff74a2a1978bf70ac9926ee", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,d63f058075bfe791248954ca2ee6c4fb", - "read_qual.txt:md5,78247dfa2ea336eac0e128eba5e9eef4", + "breakpoints_double.csv:md5,27b409c73dd0d8bde316545f86ac7f15", + "read_qual.txt:md5,fbe6cd0b65cbfc1ca699e252e531ab72", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample2_normal.bam:md5,aff37a8ad733e11fd20978392810e8d8", - "sample2_normal.bam.bai:md5,64744e26f51927c77fd48c282f6ec07d", - "sample2_tumor.bam:md5,9e14b05c07bde2a4653072cba2161a67", - "sample2_tumor.bam.bai:md5,04f64a62a741c7b725877e5d37ceff2f", + "sample2_normal.bam:md5,2ecddb6279310240f2dc29b0cf7f8c84", + "sample2_normal.bam.bai:md5,9caebccee8882bcf95e65631c0ac6730", + "sample2_tumor.bam:md5,c8db7cc4b189dec3fadd2cce07d9fcae", + "sample2_tumor.bam.bai:md5,28827d78aa318e26f71b68581ed5c607", "sample2.flagstat:md5,714d0cc0c213e2640e54a16f3d0e6e7e", "sample2.idxstats:md5,72eb83bb11748dc863fef1a0a5497e4b", "sample2.stats:md5,87cb6e9adf8a133244e8b331be43bb14", "sample2.flagstat:md5,4344a8745efef9cc2a017024218d61c6", "sample2.idxstats:md5,69467fc02c83a30084736aeea8b785fb", "sample2.stats:md5,1e044857eeefb284fda88ee58ff7a04a", - "sample2_whatshap_stats.gtf:md5,af33281699a1d0da83fbe7eaff198d03", - "sample2_whatshap_stats.log:md5,8f5f400786f32871c16e523d9e236fc4", - "sample2_whatshap_stats.tsv:md5,e8b67840491b7d092ac3d5d91db0ff46", + "sample2_whatshap_stats.gtf:md5,a13f0ac1edd7abde4ad013bf2619fe0f", + "sample2_whatshap_stats.log:md5,1d5ed1faca328d3014e9b14a44d18a23", + "sample2_whatshap_stats.tsv:md5,a275209ef9e7885ee5ea3a4aa1c970fd", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,a68d7fc9c7a7cb2f31e73189c5412f7b", - "read_qual.txt:md5,8b92ff7dc4536188be159b95525511cd", + "breakpoints_double.csv:md5,7d2fe02046bd2ff7138b46d8f67fc755", + "read_qual.txt:md5,fe3f87458d7c0c6591c37e1fd70cecf2", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "sample3_tumor.bam:md5,13432ff8635f1d142f5f260676930754", - "sample3_tumor.bam.bai:md5,b5ace84a3a8619a93227af01e211b1b9", + "sample3_tumor.bam:md5,f5dfadf92345cd529de4c1919f82b632", + "sample3_tumor.bam.bai:md5,f8ca34c0584329c62cb70ce8fb942cb6", "sample3.flagstat:md5,8ff32d733c62c4910bf185ef24bf27cf", "sample3.idxstats:md5,2de140e61f9e86c9c10af20dd565cc93", "sample3.stats:md5,d7a8552a8a41a217954a0c825d468a60", - "sample3_whatshap_stats.gtf:md5,415b20e0cc30409d24501d64b185dc49", - "sample3_whatshap_stats.log:md5,99a842c8f8f3259ec66b68e8fe0345e6", - "sample3_whatshap_stats.tsv:md5,a65d179e31756ae4127f0bf74da7e701", + "sample3_whatshap_stats.gtf:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample3_whatshap_stats.log:md5,ca067293878d1760638626a8c5a31432", + "sample3_whatshap_stats.tsv:md5,62beceb9731cafc620ce5c6eb07a9cc9", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50", - "breakpoints_double.csv:md5,46e03bf2d67aa736b599f00fe7f01e06", - "read_qual.txt:md5,b918430d35354dad1d7f02f21e4cd4ed", + "breakpoints_double.csv:md5,a9a0e0a75975904952788c2a0bd3fa85", + "read_qual.txt:md5,25efaa43bb81a4592bfb8f5f08f84b34", "breakpoint_clusters.tsv:md5,d36a70de292ee130ef30da4a58bced18", "breakpoint_clusters_list.tsv:md5,0c0ce62e329f8de492487e8414c30a50" ] @@ -595,6 +604,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.2" }, - "timestamp": "2026-03-26T16:13:56.877873308" + "timestamp": "2026-03-27T17:04:12.049740619" } } \ No newline at end of file diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 5a4e1a5e..10da2149 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -136,6 +136,9 @@ workflow LRSOMATIC { Channel .of( tuple(pon_files, pon_flags) ) .set { pon_channel } + // pon_channel: [ [pon_vcf_path, ...], [is_population_allele_flag, ...] ] + // -- single tuple of parallel lists; each flag indicates whether the corresponding VCF + // is a population allele database (True) vs. a panel-of-normals artefact file (False) ch_versions = channel.empty() ch_multiqc_files = channel.empty() @@ -145,11 +148,14 @@ workflow LRSOMATIC { // // extracts the base calling model from the bam files + // MODULE: METAEXTRACT (label: process_single) + // Input: [meta, [bam...]] METAEXTRACT( ch_samplesheet ) basecall_meta = METAEXTRACT.out.meta_ext - // [meta, basecall_model_str, kinetics_str] -- basecall model and kinetics extracted from BAM header - // Adds the base calling model to meta.basecall_model + // basecall_meta: [meta, basecall_model_str, kinetics_str] + // basecall_model_str -- e.g. "dna_r10.4.1_e8.2_400bps_sup@v5.0.0" or "hifi_revio" + // kinetics_str -- "true" if PacBio kinetics tags present, else "false" ch_samplesheet .join(basecall_meta) @@ -175,10 +181,20 @@ workflow LRSOMATIC { [ meta, bam.flatten()] } .set{ch_samplesheet} - // [meta_full, [bam...]] -- meta now includes: id, paired_data, type, platform, sex, fiber, clair3_model, clairS_model, clairSTO_model, kinetics + // ch_samplesheet (updated): [meta, [bam...]] + // meta fields: id, paired_data, type, platform, sex, fiber, replicate, + // clair3_model, clairS_model, clairSTO_model, kinetics + // bams are grouped per sample (multiple runs merged into a list) // // SUBWORKFLOW: PREPARE_REFERENCE_FILES + // Decompresses the reference FASTA if needed, indexes it, downloads Clair3 models, + // and decompresses ASCAT reference files + // Input: params.fasta, ASCAT file paths, basecall_meta, clair3_modelMap + // Output: .prepped_fasta -- [[:], fasta] + // .prepped_fai -- [[:], fai] + // .downloaded_clair3_models-- [meta(id=model_name), model_dir] + // .allele_files / .loci_files / .gc_file / .rt_file -- flat file collections // PREPARE_REFERENCE_FILES ( @@ -192,13 +208,16 @@ workflow LRSOMATIC { ) downloaded_clair3_models = PREPARE_REFERENCE_FILES.out.downloaded_clair3_models + // downloaded_clair3_models: [meta(id=clair3_model_name), model_dir] ch_nanoplot_pre_txt = channel.empty() if (!params.skip_qc && !params.skip_cramino) { // - // Module: CRAMINO + // MODULE: CRAMINO_PRE (label: process_medium) + // Input: [meta, [bam...]] -- pre-alignment unaligned BAMs + // Output: cramino_pre.out.arrow -- [meta, arrow_file] (feather format stats) // CRAMINO_PRE( ch_samplesheet ) @@ -206,7 +225,9 @@ workflow LRSOMATIC { if (!params.skip_nanoplot) { // - // Module: Nanoplot + // MODULE: NANOPLOT_PRE (label: process_medium) + // Input: CRAMINO_PRE.out.arrow -- [meta, arrow_file] + // Output: nanoplot HTML/txt reports // NANOPLOT_PRE(CRAMINO_PRE.out.arrow) @@ -215,6 +236,7 @@ workflow LRSOMATIC { } + // Drop 'replicate' from meta before concatenation -- replicate info not needed downstream ch_samplesheet .map{ meta, bam -> def new_meta = meta.subMap('id', @@ -230,42 +252,40 @@ workflow LRSOMATIC { return[new_meta, bam] } .set{ch_samplesheet_no_rep} + // ch_samplesheet_no_rep: [meta, [bam...]] + // meta fields: id, paired_data, type, platform, sex, fiber, + // clair3_model, clairS_model, clairSTO_model, kinetics + // (replicate field removed; bams still a list — concatenated next) - - // ch_samplesheet -> meta: [id, paired_data, platform, sex, type, fiber, basecall_model] - // bam: list of unaligned bams - + // Branch on number of input BAMs: samples with a single BAM skip concatenation + ch_split = ch_samplesheet_no_rep .branch { _meta, bam -> single: bam.size() == 1 multiple: bam.size() > 1 } + // ch_split.single: [meta, [bam]] -- pass-through, no concatenation needed + // ch_split.multiple: [meta, [bam...]] -- need SAMTOOLS_CAT to merge // - // MODULE: SAMTOOLS_CAT + // MODULE: SAMTOOLS_CAT (label: process_single) + // Input: [meta, [bam...]] -- multiple unaligned BAMs for same sample + // Output: .bam -- [meta, bam] -- single merged unaligned BAM // - // concatenates bam files from single sample SAMTOOLS_CAT ( ch_split.multiple ) .bam .mix ( ch_split.single ) .set { ch_cat_ubams } - // [meta, bam] -- single merged unaligned BAM per sample + // ch_cat_ubams: [meta, bam] -- single (possibly concatenated) unaligned BAM per sample vep_cache = channel.empty() if (!params.skip_vep) { - channel - .of([ - vep_cache: params.vep_cache, - vep_cache_version: params.vep_cache_version, - vep_genome: params.vep_genome, - vep_args: params.vep_args, - vep_species: params.vep_species, - download_vep_cache: params.download_vep_cache - ]) - + // SUBWORKFLOW: PREPARE_ANNOTATION + // Validates or downloads the VEP cache directory + // Output: .vep_cache -- path to VEP cache root directory PREPARE_ANNOTATION ( params.vep_cache, params.vep_cache_version, @@ -275,19 +295,21 @@ workflow LRSOMATIC { params.download_vep_cache ) ch_versions = ch_versions.mix(PREPARE_ANNOTATION.out.versions) + // Wrap VEP cache path in a tuple with empty meta for use in ENSEMBLVEP_VEP vep_cache = PREPARE_ANNOTATION.out.vep_cache.map {cache -> [[:], cache] } + // vep_cache: [[:], cache_dir_path] -- empty meta + VEP cache directory } ch_versions = ch_versions.mix(PREPARE_REFERENCE_FILES.out.versions) - ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta - ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai + ch_fasta = PREPARE_REFERENCE_FILES.out.prepped_fasta // [[:], fasta] + ch_fai = PREPARE_REFERENCE_FILES.out.prepped_fai // [[:], fai] - // ASCAT files - allele_files = PREPARE_REFERENCE_FILES.out.allele_files - loci_files = PREPARE_REFERENCE_FILES.out.loci_files - gc_file = PREPARE_REFERENCE_FILES.out.gc_file - rt_file = PREPARE_REFERENCE_FILES.out.rt_file + // ASCAT reference files -- flat path collections (no meta wrapper), passed directly to ASCAT module + allele_files = PREPARE_REFERENCE_FILES.out.allele_files // [path, ...] -- per-chromosome allele files + loci_files = PREPARE_REFERENCE_FILES.out.loci_files // [path, ...] -- per-chromosome loci files + gc_file = PREPARE_REFERENCE_FILES.out.gc_file // [path, ...] -- GC correction ([] if skipped) + rt_file = PREPARE_REFERENCE_FILES.out.rt_file // [path, ...] -- RT correction ([] if skipped) // // MODULE: FIBERTOOLSRS_PREDICTM6A @@ -295,39 +317,57 @@ workflow LRSOMATIC { // predict m6a in unaligned bam if (!params.skip_fiber) { + // Fiber-seq processing: predict m6A methylation, call nucleosomes and FIRE elements + // Only applicable to PacBio samples with fiber-seq data (meta.fiber == "y") if (!params.skip_normalfiber){ + // Process all samples (including normals) for fiber-seq ubams = ch_cat_ubams } else { + // Skip fiber-seq processing for normal samples; set aside normals to re-join later ch_cat_ubams .branch { meta, _bams -> normal: meta.type == "normal" tumor: meta.type == "tumor" } .set { ch_cat_ubams_normal_branching } + // ch_cat_ubams_normal_branching.normal: [meta, bam] -- normal samples (held out) + // ch_cat_ubams_normal_branching.tumor: [meta, bam] -- tumor samples only normal_bams = ch_cat_ubams_normal_branching.normal ubams = ch_cat_ubams_normal_branching.tumor } + // Branch by sequencing platform: PacBio needs m6A prediction, ONT does not ubams .branch{ meta, _bams -> pacBio: meta.platform == "pb" ont: meta.platform == "ont" } .set{ch_cat_ubams_pacbio_ont_branching} + // ch_cat_ubams_pacbio_ont_branching.pacBio: [meta, bam] -- PacBio samples + // ch_cat_ubams_pacbio_ont_branching.ont: [meta, bam] -- ONT samples (skip m6A) pacbio_bams = ch_cat_ubams_pacbio_ont_branching.pacBio + // Branch PacBio samples: only those with kinetics tags can have m6A predicted pacbio_bams .branch{meta, _bams -> kinetics: meta.kinetics == "true" noKinetics: meta.kinetics == "false" } .set{pacbio_bams} + // pacbio_bams.kinetics: [meta, bam] -- PacBio with kinetics (mm/ml tags); m6A predictable + // pacbio_bams.noKinetics: [meta, bam] -- PacBio without kinetics; skip PREDICTM6A if (!params.skip_m6a) { + // + // MODULE: FIBERTOOLSRS_PREDICTM6A (label: process_high) + // Input: [meta, bam] -- PacBio BAM with kinetics tags + // Output: .bam -- [meta, bam] -- BAM with m6A (MM/ML) tags added + // FIBERTOOLSRS_PREDICTM6A ( pacbio_bams.kinetics ) + // Merge PacBio with and without kinetics: both now have (or skip) m6A tags pacbio_bams.noKinetics .mix(FIBERTOOLSRS_PREDICTM6A.out.bam) .set{predicted_bams} @@ -337,22 +377,28 @@ workflow LRSOMATIC { .mix(pacbio_bams.kinetics) .set{predicted_bams} } + // predicted_bams: [meta, bam] -- all PacBio samples (m6A tags present where applicable) - - + // Re-merge ONT and PacBio before fiber-seq branching ch_cat_ubams_pacbio_ont_branching.ont .mix(predicted_bams) .set{fiber_branch} + // fiber_branch (pre-split): [meta, bam] -- all samples (ONT + PacBio, with m6A if applicable) + // Branch on fiber-seq flag: only fiber-seq samples get nucleosome/FIRE calling fiber_branch .branch{ meta, _bams -> fiber: meta.fiber == "y" nonFiber: meta.fiber == "n" } .set{fiber_branch} + // fiber_branch.fiber: [meta, bam] -- fiber-seq samples → nucleosome + FIRE calling + // fiber_branch.nonFiber: [meta, bam] -- non-fiber samples → passed through unchanged // - // MODULE: FIBERTOOLSRS_NUCLEOSOMES + // MODULE: FIBERTOOLSRS_NUCLEOSOMES (label: process_high) + // Input: [meta, bam] -- fiber-seq BAM (with m6A tags for PacBio) + // Output: .bam -- [meta, bam] -- BAM with nucleosome footprint tags added // FIBERTOOLSRS_NUCLEOSOMES ( @@ -360,7 +406,9 @@ workflow LRSOMATIC { ) // - // MODULE: FIBERTOOLSRS_FIRE + // MODULE: FIBERTOOLSRS_FIRE (label: process_high) + // Input: FIBERTOOLSRS_NUCLEOSOMES.out.bam -- [meta, bam] -- BAM with nucleosome tags + // Output: .bam -- [meta, bam] -- BAM with FIRE (Fiber-seq Inferred Regulatory Elements) tags // FIBERTOOLSRS_FIRE ( @@ -368,22 +416,26 @@ workflow LRSOMATIC { ) if (!params.skip_normalfiber){ + // Re-merge fiber and non-fiber samples after FIRE annotation fiber_branch.nonFiber .mix(FIBERTOOLSRS_FIRE.out.bam) .set{ch_cat_ubams} - } else { + // Re-merge fiber, non-fiber, and held-out normal samples fiber_branch.nonFiber .mix(normal_bams) .mix(FIBERTOOLSRS_FIRE.out.bam) .set{ch_cat_ubams} - } + // ch_cat_ubams (updated): [meta, bam] -- all samples; fiber-seq samples now carry + // nucleosome + FIRE tags in BAM; m6A tags present for PacBio fiber-seq if(!params.skip_qc) { // - // MODULE: FIBERTOOLSRS_QC + // MODULE: FIBERTOOLSRS_QC (label: process_medium) + // Input: FIBERTOOLSRS_FIRE.out.bam -- [meta, bam] -- annotated fiber-seq BAM + // Output: QC reports for fiber-seq signal (written to outdir) // FIBERTOOLSRS_QC ( @@ -392,10 +444,13 @@ workflow LRSOMATIC { } } // - // MODULE: MINIMAP2_ALIGN + // MODULE: MINIMAP2_ALIGN (label: process_high) + // Input: [meta, bam] -- unaligned BAM (may carry m6A/nucleosome/FIRE tags for fiber-seq) + // ch_fasta -- [[:], fasta] + // sort_bam=true, cigar_paf_format='bai', cigar_bam='', split_prefix='' + // Output: .bam -- [meta, bam] -- coordinate-sorted aligned BAM + // .index -- [meta, bai] -- BAM index // - // Aligns ubams - // ch_cat_ubams: [meta, bam] -- may include m6A/nucleosome/FIRE annotations for fiber-seq samples MINIMAP2_ALIGN ( ch_cat_ubams, @@ -407,25 +462,29 @@ workflow LRSOMATIC { ) MINIMAP2_ALIGN.out.bam .set { ch_minimap_bam } - // [meta, bam] -- aligned BAM - - // ch_minimap_bams into tumor and paired to phase the paired ones on normal - // and add index + // ch_minimap_bam: [meta, bam] -- coordinate-sorted aligned BAM + // Join BAM with its index, then branch into paired-sample vs. tumor-only paths ch_minimap_bam .join(MINIMAP2_ALIGN.out.index) .set {ch_index_minimap} + // ch_index_minimap: [meta, bam, bai] -- aligned BAM + index, all samples ch_index_minimap .branch { meta, _bams, _bais -> - paired: meta.paired_data - tumor_only: !meta.paired_data + paired: meta.paired_data // meta.paired_data is the normal sample ID for tumors, or the tumor ID for normals + tumor_only: !meta.paired_data // meta.paired_data is null/false for tumor-only samples } .set { branched_minimap } - // branched_minimap.paired: [meta, bam, bai] -- one item per sample (tumor AND normal flow separately) - // branched_minimap.tumor_only: [meta, bam, bai] + // branched_minimap.paired: [meta, bam, bai] -- tumor AND normal samples flow together here; + // each item is a single sample, joined downstream + // branched_minimap.tumor_only: [meta, bam, bai] -- tumor-only samples (no matched normal) + // SUBWORKFLOW: TUMORONLY_SMALLVAR + // Input: branched_minimap.tumor_only -- [meta, bam, bai] + // Output: .somatic_vcf -- [meta, vcf, tbi] -- somatic SNVs/indels + // .germline_vcf -- [meta, vcf, tbi] -- germline SNVs/indels (ClairS-TO germline output) TUMORONLY_SMALLVAR( branched_minimap.tumor_only, ch_fasta, @@ -436,13 +495,17 @@ workflow LRSOMATIC { branched_minimap.paired .set{paired_ch} + // Split paired samples into tumor and normal streams for joining paired_ch .branch { meta, _bams, _bais -> normal: meta.type == "normal" tumor: meta.type == "tumor" } .set{branched_paired_ch} + // branched_paired_ch.normal: [meta, bam, bai] -- normal samples (meta.type == "normal") + // branched_paired_ch.tumor: [meta, bam, bai] -- tumor samples (meta.type == "tumor") + // Strip 'type' field from normal meta before joining, so the key is just sample ID branched_paired_ch.normal .map{ meta, bam, bai -> def new_meta = meta.subMap('id', @@ -457,7 +520,10 @@ workflow LRSOMATIC { return[new_meta, bam, bai] } .set{paired_normal_bams} + // paired_normal_bams: [meta (no type), normal_bam, normal_bai] + // Join tumor and normal BAMs into a single channel for somatic variant calling + // Join key is meta (with 'type' stripped), so tumor meta.id must equal normal meta.id branched_paired_ch.tumor .map{ meta, bam, bai -> def new_meta = meta.subMap('id', @@ -473,12 +539,21 @@ workflow LRSOMATIC { } .join(paired_normal_bams) .set { somatic_smallvar_input } + // somatic_smallvar_input: [meta, tumor_bam, tumor_bai, normal_bam, normal_bai] + // SUBWORKFLOW: PAIRED_SMALLVAR_SOMATIC + // Input: somatic_smallvar_input -- [meta, tumor_bam, tumor_bai, normal_bam, normal_bai] + // Output: .somatic_vcf -- [meta, vcf, tbi] -- somatic SNVs/indels (ClairS and/or DeepSomatic consensus) PAIRED_SMALLVAR_SOMATIC ( somatic_smallvar_input, ch_fasta, ch_fai ) + + // SUBWORKFLOW: PAIRED_SMALLVAR_GERMLINE + // Input: branched_paired_ch.normal -- [meta, bam, bai] -- normal sample BAMs only + // downloaded_clair3_models -- [meta(id=model_name), model_dir] + // Output: .germline_vcf -- [meta, vcf, tbi] -- germline SNVs/indels (Clair3 and/or DeepVariant consensus) PAIRED_SMALLVAR_GERMLINE ( branched_paired_ch.normal, ch_fasta, @@ -486,15 +561,26 @@ workflow LRSOMATIC { downloaded_clair3_models ) + // Merge germline VCFs from paired and tumor-only paths into a single channel PAIRED_SMALLVAR_GERMLINE.out.germline_vcf .mix(TUMORONLY_SMALLVAR.out.germline_vcf) .set{ch_germline_vcf} + // ch_germline_vcf: [meta, vcf, tbi] -- germline variants for all samples (paired + tumor-only) - + // Merge somatic VCFs from tumor-only and paired T/N paths into a single channel TUMORONLY_SMALLVAR.out.somatic_vcf .mix(PAIRED_SMALLVAR_SOMATIC.out.somatic_vcf) .set{ch_somatic_vcf} - + // ch_somatic_vcf: [meta, vcf, tbi] -- somatic variants for all samples + + // SUBWORKFLOW: PHASING_HAPLOTYPING + // Input: ch_index_minimap -- [meta, bam, bai] -- all aligned BAMs (tumor + normal + tumor-only) + // ch_germline_vcf -- [meta, vcf, tbi] -- germline variants (used to phase reads) + // ch_somatic_vcf -- [meta, vcf, tbi] -- somatic variants (get phasing transferred) + // ch_fasta / ch_fai + // Output: .phased_germline_vcf -- [meta, vcf, tbi] -- phased germline VCF + // .phased_somatic_vcf -- [meta, vcf, tbi] -- phased somatic VCF + // .tumor_normal_hapbams_ch -- [meta, bam, bai] -- haplotagged BAMs (all samples) PHASING_HAPLOTYPING ( ch_index_minimap, ch_germline_vcf, @@ -503,13 +589,14 @@ workflow LRSOMATIC { ch_fai ) - + // Prepare phased VCFs for VEP: add empty 'extra' list required by ENSEMBLVEP_VEP PHASING_HAPLOTYPING.out.phased_somatic_vcf .map { meta, vcf, _tbi -> def extra = [] return [meta, vcf, extra] } .set { somatic_vep } + // somatic_vep: [meta, vcf, []] -- phased somatic VCF ready for VEP annotation PHASING_HAPLOTYPING.out.phased_germline_vcf .map { meta, vcf, _tbi -> @@ -517,24 +604,25 @@ workflow LRSOMATIC { return [meta, vcf, extra] } .set { germline_vep } - - /// figure out severus channel structure then test - - // [meta, vcf, []] -- somatic variants merged from T/N and tumor-only paths + // germline_vep: [meta, vcf, []] -- phased germline VCF ready for VEP annotation whatshap_stats_txt = channel.empty() if (!params.skip_qc && !params.skip_whatshapstats) { - // Create channel for whatshap stats + // Drop the empty 'extra' element added for VEP input germline_vep .map { meta, vcf, _extra -> return [meta, vcf] } .set { ch_whatshap_stats } + // ch_whatshap_stats: [meta, vcf] -- phased germline VCF for phasing QC // - // Module: WHATSHAP_STATS + // MODULE: WHATSHAP_STATS (label: process_single) + // Input: [meta, vcf] -- phased VCF (germline) + // gtf=true, sample=true, chr_lengths=false + // Output: .tsv -- [meta, tsv] -- per-chromosome phasing statistics // WHATSHAP_STATS ( @@ -551,7 +639,11 @@ workflow LRSOMATIC { if (!params.skip_vep) { // - // MODULE: GERMLINE_VEP + // MODULE: GERMLINE_VEP (ENSEMBLVEP_VEP alias; label: process_medium) + // Input: germline_vep -- [meta, vcf, []] -- phased germline VCF + // vep_cache -- [[:], cache_dir] + // ch_fasta -- [[:], fasta] + // Output: annotated germline VCF with consequence predictions // if (params.vep_custom != null) { vep_custom = file(params.vep_custom) @@ -576,7 +668,11 @@ workflow LRSOMATIC { ) // - // MODULE: SOMATIC_VEP + // MODULE: SOMATIC_VEP (ENSEMBLVEP_VEP alias; label: process_medium) + // Input: somatic_vep -- [meta, vcf, []] -- phased somatic VCF + // vep_cache -- [[:], cache_dir] + // ch_fasta -- [[:], fasta] + // Output: annotated somatic VCF with consequence predictions // SOMATIC_VEP ( @@ -592,6 +688,8 @@ workflow LRSOMATIC { ) } + // Build SEVERUS input by combining tumor-only and T/N paired samples with phased germline VCFs + // Tumor-only samples get empty lists for normal BAM/BAI (SEVERUS runs in tumor-only mode) branched_minimap.tumor_only .map{ meta, bam, bai -> def new_meta = meta.subMap('id', @@ -610,12 +708,19 @@ workflow LRSOMATIC { def normal_bai = [] return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai] } + // Mix with paired T/N input (which already has normal BAM/BAI from somatic_smallvar_input) .mix(somatic_smallvar_input) + // Attach phased germline VCF (used by SEVERUS for phased SV calling) .join(PHASING_HAPLOTYPING.out.phased_germline_vcf) .set{severus_input} + // severus_input: [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_germline_vcf, phased_germline_tbi] + // normal_bam/bai are empty lists [] for tumor-only samples // - // MODULE: SEVERUS + // MODULE: SEVERUS (label: process_high) + // Input: severus_input -- [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, vcf, tbi] + // [[:], bed_file, pon_file] -- optional target BED and panel-of-normals for SV filtering + // Output: .all_vcf -- [meta, vcf] -- all somatic SVs (sniffles2 format) // SEVERUS ( @@ -631,9 +736,14 @@ workflow LRSOMATIC { return [meta, vcf, extra] } .set { sv_vep } - // [meta, severus_all_vcf, []] -- all SVs for VEP annotation + // sv_vep: [meta, severus_all_vcf, []] -- all SVs ready for VEP annotation if(!params.skip_vep) { + // + // MODULE: SV_VEP (ENSEMBLVEP_VEP alias; label: process_medium) + // Input: sv_vep -- [meta, vcf, []] -- SEVERUS SV VCF + // Output: annotated SV VCF with consequence predictions + // SV_VEP ( sv_vep, params.vep_genome, @@ -654,7 +764,9 @@ workflow LRSOMATIC { if (!params.skip_qc && !params.skip_cramino) { // - // MODULE: CRAMINO + // MODULE: CRAMINO_POST (label: process_medium) + // Input: ch_minimap_bam -- [meta, bam] -- post-alignment coordinate-sorted BAM + // Output: .arrow -- [meta, arrow_file] -- alignment statistics in feather format // CRAMINO_POST ( ch_minimap_bam ) @@ -662,7 +774,9 @@ workflow LRSOMATIC { if (!params.skip_nanoplot) { // - // Module: Nanoplot + // MODULE: NANOPLOT_POST (label: process_medium) + // Input: CRAMINO_POST.out.arrow -- [meta, arrow_file] + // Output: HTML/txt QC reports (post-alignment) // NANOPLOT_POST(CRAMINO_POST.out.arrow) @@ -681,12 +795,19 @@ workflow LRSOMATIC { if (!params.skip_qc && !params.skip_mosdepth) { - // prepare mosdepth input channel: we need to specify compulsory path to bed as well + // MOSDEPTH requires a BED file argument; pass [] to compute genome-wide depth ch_minimap_bam.join(MINIMAP2_ALIGN.out.index) .map { meta, bam, bai -> [meta, bam, bai, []] } .set { ch_mosdepth_in } - // [meta, bam, bai, []] -- [] is the required empty BED path for MOSDEPTH + // ch_mosdepth_in: [meta, bam, bai, []] -- [] is the optional BED (empty = genome-wide) + // + // MODULE: MOSDEPTH (label: process_medium) + // Input: [meta, bam, bai, bed] -- bed is [] for genome-wide coverage + // ch_fasta -- [[:], fasta] -- used for CRAM decoding (if applicable) + // Output: .global_txt -- [meta, txt] -- global depth summary + // .summary_txt -- [meta, txt] -- per-contig depth summary + // MOSDEPTH ( ch_mosdepth_in, ch_fasta @@ -697,7 +818,12 @@ workflow LRSOMATIC { } // - // SUBWORKFLOW: BAM_STATS_SAMTOOLS + // SUBWORKFLOW: BAM_STATS_SAMTOOLS (nf-core subworkflow) + // Input: [meta, bam, bai] -- aligned BAM with index + // ch_fasta -- [[:], fasta] + // Output: .stats -- [meta, txt] -- samtools stats output + // .flagstat -- [meta, txt] -- samtools flagstat output + // .idxstats -- [meta, txt] -- samtools idxstats output // ch_bam_stats = channel.empty() ch_bam_flagstat = channel.empty() @@ -706,7 +832,7 @@ workflow LRSOMATIC { if (!params.skip_qc && !params.skip_bamstats ) { BAM_STATS_SAMTOOLS ( - ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // Join bam channel with index channel + ch_minimap_bam.join(MINIMAP2_ALIGN.out.index), // [meta, bam, bai] ch_fasta ) @@ -716,16 +842,20 @@ workflow LRSOMATIC { } // - // MODULE: ASCAT + // MODULE: ASCAT (label: process_high) + // Input: [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] -- NOTE: normal before tumor (ASCAT convention) + // allele_files, loci_files, gc_file, rt_file -- ASCAT reference files + // Output: .png plots, .segments, .purity_ploidy -- copy number results // if (!params.skip_ascat) { + // ASCAT expects [normal, tumor] order; rearrange from severus_input [tumor, normal] order severus_input .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, _vcf, _tbi -> return [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] } .set { ascat_ch } - // [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] -- NOTE: normal before tumor (ASCAT convention) + // ascat_ch: [meta, normal_bam, normal_bai, tumor_bam, tumor_bai] ASCAT ( ascat_ch, @@ -742,19 +872,25 @@ workflow LRSOMATIC { } // - // MODULE: WAKHAN + // MODULE: WAKHAN (label: process_medium) + // Haplotype-aware genome assembly and variant phasing visualisation + // Input: [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_germline_vcf, severus_all_vcf] + // ch_fasta -- [[:], fasta] + // centromere_bed -- BED file of centromere coordinates (for assembly anchoring) + // Output: WAKHAN assembly reports (written to outdir) // if (!params.skip_wakhan) { - // Prepare input channel for WAKHAN + // Attach SEVERUS SV VCF to the severus_input channel (dropping the phased TBI) severus_input .join(SEVERUS.out.all_vcf) .map { meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, _phased_tbi, all_vcf -> return [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, all_vcf] } .set { wakhan_input } - // [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_vcf, severus_all_vcf] + // wakhan_input: [meta, tumor_bam, tumor_bai, normal_bam, normal_bai, phased_germline_vcf, severus_all_vcf] + // normal_bam/bai are [] for tumor-only samples WAKHAN ( wakhan_input, @@ -764,25 +900,31 @@ workflow LRSOMATIC { } // - // Collate and save software versions + // Collate software versions from two sources: + // 1. ch_versions (classic path): version YAML files emitted by modules + // 2. channel.topic("versions") (topic channel path): version tuples [process, tool, version] + // emitted directly by modules that use the topic-channel pattern // def topic_versions = channel.topic("versions") - .distinct() + .distinct() // deduplicate identical version entries across samples .branch { entry -> - versions_file: entry instanceof Path - versions_tuple: true + versions_file: entry instanceof Path // classic YAML file path + versions_tuple: true // [process, tool, version] tuple } def topic_versions_string = topic_versions.versions_tuple .map { process, tool, version -> + // Strip workflow prefix (everything before the last ':') from process name [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] } - .groupTuple(by:0) + .groupTuple(by:0) // group tool versions by process name .map { process, tool_versions -> tool_versions.unique().sort() "${process}:\n${tool_versions.join('\n')}" } + // topic_versions_string: formatted YAML-like string per process, ready to write + // Merge both version sources and write to versions YAML (consumed by MultiQC) softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) .mix(topic_versions_string) .collectFile( @@ -791,10 +933,14 @@ workflow LRSOMATIC { sort: true, newLine: true ).set { ch_collated_versions } + // ch_collated_versions: path -- merged software versions YAML for MultiQC // - // MODULE: MultiQC + // MODULE: MULTIQC (label: process_single) + // Aggregates QC reports from all modules into a single HTML report + // Input: [[id:'multiqc'], [qc_files...], [config_files...], [logo], [], []] + // Output: .report -- [meta, html] -- MultiQC HTML report // summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") @@ -816,7 +962,8 @@ workflow LRSOMATIC { ) ) - // Collect MultiQC files + // Collect QC outputs from all optional modules + // .collect{it -> it[1]} extracts the file from [meta, file] tuples; ifEmpty([]) handles skipped modules ch_multiqc_files = ch_multiqc_files.mix(ch_bam_stats.collect{it -> it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_bam_flagstat.collect{it -> it[1]}.ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_bam_idxstats.collect{it -> it[1]}.ifEmpty([])) @@ -829,6 +976,7 @@ workflow LRSOMATIC { ch_multiqc_files = ch_multiqc_files.mix(whatshap_stats_txt.collect{it -> it[1]}.ifEmpty([])) + // Build the final MULTIQC input tuple: all QC files + config files + logo MULTIQC ( ch_multiqc_files .collect() @@ -838,6 +986,7 @@ workflow LRSOMATIC { multiqc_config_files += [file(params.multiqc_config, checkIfExists: true)] } def multiqc_logo_file = params.multiqc_logo ? [file(params.multiqc_logo, checkIfExists: true)] : [] + // MULTIQC input: [meta, [qc_files], [config_files], [logo], [], []] [[id: 'multiqc'], files, multiqc_config_files, multiqc_logo_file, [], []] } ) From 5cfadfb1ff1651a7e088e9ff46d3897aa76f64b7 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 30 Mar 2026 12:11:35 +0200 Subject: [PATCH 181/183] prettier --- subworkflows/local/phasing_haplotyping.nf | 2 +- workflows/lrsomatic.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/subworkflows/local/phasing_haplotyping.nf b/subworkflows/local/phasing_haplotyping.nf index e0aaf290..832d196d 100644 --- a/subworkflows/local/phasing_haplotyping.nf +++ b/subworkflows/local/phasing_haplotyping.nf @@ -129,7 +129,7 @@ workflow PHASING_HAPLOTYPING { // fasta / fai // Output: .mod_vcf -- [meta, vcf] -- base modification calls for tumor // - + LONGPHASE_MODCALL_SOMATIC ( tumor_bams_ch, fasta, diff --git a/workflows/lrsomatic.nf b/workflows/lrsomatic.nf index 10da2149..6cf4cad5 100644 --- a/workflows/lrsomatic.nf +++ b/workflows/lrsomatic.nf @@ -258,7 +258,7 @@ workflow LRSOMATIC { // (replicate field removed; bams still a list — concatenated next) // Branch on number of input BAMs: samples with a single BAM skip concatenation - + ch_split = ch_samplesheet_no_rep .branch { _meta, bam -> single: bam.size() == 1 From 486156fe33148ee5db2014730b8d04481f7d5616 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Mon, 30 Mar 2026 12:22:59 +0200 Subject: [PATCH 182/183] fix merge conflict --- subworkflows/local/tumor_only/tumoronly_smallvar.nf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/subworkflows/local/tumor_only/tumoronly_smallvar.nf b/subworkflows/local/tumor_only/tumoronly_smallvar.nf index f1ddbf61..e9b50e2f 100644 --- a/subworkflows/local/tumor_only/tumoronly_smallvar.nf +++ b/subworkflows/local/tumor_only/tumoronly_smallvar.nf @@ -20,12 +20,7 @@ workflow TUMORONLY_SMALLVAR { main: -<<<<<<< HEAD - // empty channel emission - -======= ch_versions = channel.empty() ->>>>>>> deepvariant somatic_vcf = channel.empty() germline_vcf = channel.empty() somatic_tbi = channel.empty() From deefcf928dcfd0ecef8fae63fee6dbc120444484 Mon Sep 17 00:00:00 2001 From: robert-a-forsyth Date: Tue, 31 Mar 2026 17:05:50 +0200 Subject: [PATCH 183/183] documentation, small fixes to config --- conf/base.config | 4 +-- conf/modules.config | 4 +-- modules/local/clair3/main.nf | 7 ++-- .../local/deepsomatic/callvariants/main.nf | 2 +- .../nf-core/deepvariant/callvariants/main.nf | 2 +- .../deepvariant-makeexamples.diff | 8 +++++ .../deepvariant-postprocessvariants.diff | 8 +++++ .../haplotag/longphase-haplotag.diff | 34 +++++++++++++++++++ nextflow_schema.json | 6 ++-- 9 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 modules/nf-core/longphase/haplotag/longphase-haplotag.diff diff --git a/conf/base.config b/conf/base.config index 08378854..d39f1fce 100644 --- a/conf/base.config +++ b/conf/base.config @@ -31,14 +31,14 @@ process { accelerator = { (params.use_gpu as boolean) ? 1 : null } cpus = { 8 * task.attempt } memory = { 48.GB * task.attempt } - time = { 16.h * task.attempt } + time = { 8.h * task.attempt } } withLabel:process_gpu_very_high { ext.use_gpu = { params.use_gpu as boolean } accelerator = { (params.use_gpu as boolean) ? 1 : null } cpus = { 16 * task.attempt } memory = { 96.GB * task.attempt } - time = { 16.h * task.attempt } + time = { 10.h * task.attempt } } withLabel:process_gpu_very_high_memory { ext.use_gpu = { params.use_gpu as boolean } diff --git a/conf/modules.config b/conf/modules.config index 4fa65136..8a66d956 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -192,10 +192,10 @@ process { meta.platform == 'pb' ? meta.paired_data ? '--channel_list "BASE_CHANNELS,haplotype" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"' - : '--channel_list "BASE_CHANNELS,haplotype,allele_frequency" --alt_aligned_pileup "diff_channels" --pileup_image_width "99" --population_vcfs "/opt/models/deepsomatic/pons/AF_pacbio_PON_CoLoRSdb.GRCh38.AF0.05.vcf.gz"' + : '--channel_list "BASE_CHANNELS,haplotype,allele_frequency" --alt_aligned_pileup "diff_channels" --pileup_image_width "99" --population_vcfs "/opt/models/deepsomatic/pons/AF_pacbio_PON_CoLoRSdb.GRCh38.AF0.05.vcf.gz","AF_ilmn_PON_DeepVariant.GRCh38.AF0.05.vcf.gz","PON_dbsnp138_gnomad_ILMN1000g_pon.vcf.gz","PON_dbsnp138_gnomad_PB1000g_pon.vcf.gz"' : meta.paired_data ? '--channel_list "BASE_CHANNELS,haplotype" --alt_aligned_pileup "diff_channels" --pileup_image_width "99"' - : '--channel_list "BASE_CHANNELS,haplotype,allele_frequency" --alt_aligned_pileup "diff_channels" --pileup_image_width "99" --population_vcfs "/opt/models/deepsomatic/pons/ON_dbsnp138_gnomad_ILMN1000g_pon.vcf.gz"' + : '--channel_list "BASE_CHANNELS,haplotype,allele_frequency" --alt_aligned_pileup "diff_channels" --pileup_image_width "99" --population_vcfs "/opt/models/deepsomatic/pons/AF_pacbio_PON_CoLoRSdb.GRCh38.AF0.05.vcf.gz","AF_ilmn_PON_DeepVariant.GRCh38.AF0.05.vcf.gz","PON_dbsnp138_gnomad_ILMN1000g_pon.vcf.gz","PON_dbsnp138_gnomad_PB1000g_pon.vcf.gz"' } publishDir = [ enabled: false diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 44479086..64e8f8fd 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -4,8 +4,8 @@ process CLAIR3 { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/clair3:1.2.0--py310h779eee5_0': - 'quay.io/biocontainers/clair3:1.2.0--py310h779eee5_0' }" + (params.use_gpu ? 'docker://hkubal/clair3-gpu:v1.2.0' : 'https://depot.galaxyproject.org/singularity/clair3:1.2.0--py310h779eee5_0') : + (params.use_gpu ? 'docker.io/hkubal/clair3-gpu:v1.2.0' : 'quay.io/biocontainers/clair3:1.2.0--py310h779eee5_0') }" input: tuple val(meta) , path(bam), path(bai), path(model), val(platform) @@ -25,8 +25,10 @@ process CLAIR3 { script: def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" + def use_gpu = task.ext.use_gpu as boolean """ + ${use_gpu ? 'export CUDA_VISIBLE_DEVICES=${CUDA_VISIBLE_DEVICES:-0}' : ':'} run_clair3.sh \\ --bam_fn=${bam} \\ --ref_fn=${reference} \\ @@ -35,6 +37,7 @@ process CLAIR3 { --platform=${platform} \\ --model=${model} \\ --sample_name=${prefix} \\ + ${use_gpu ? '--use_gpu --device=cuda:0' : ''} \\ ${args} """ diff --git a/modules/local/deepsomatic/callvariants/main.nf b/modules/local/deepsomatic/callvariants/main.nf index afeb33e1..a2d7bc3e 100644 --- a/modules/local/deepsomatic/callvariants/main.nf +++ b/modules/local/deepsomatic/callvariants/main.nf @@ -3,7 +3,7 @@ process DEEPSOMATIC_CALLVARIANTS { label "${params.use_gpu ? 'process_gpu_high' : 'process_high'}" //Conda is not supported at the moment - container "docker.io/google/deepsomatic:1.7.0" + container params.use_gpu ? "docker.io/google/deepsomatic:1.7.0-gpu" : "docker.io/google/deepsomatic:1.7.0" input: tuple val(meta), path(make_examples_tfrecords) diff --git a/modules/nf-core/deepvariant/callvariants/main.nf b/modules/nf-core/deepvariant/callvariants/main.nf index e0b24884..a8516403 100644 --- a/modules/nf-core/deepvariant/callvariants/main.nf +++ b/modules/nf-core/deepvariant/callvariants/main.nf @@ -4,7 +4,7 @@ process DEEPVARIANT_CALLVARIANTS { label "${params.use_gpu ? 'process_gpu_very_high' : 'process_very_high'}" //Conda is not supported at the moment - container "docker.io/google/deepvariant:1.9.0" + container params.use_gpu ? "docker.io/google/deepvariant:1.9.0-gpu" : "docker.io/google/deepvariant:1.9.0" input: tuple val(meta), path(make_examples_tfrecords) diff --git a/modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff b/modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff index 8e5312b2..ee309ee6 100644 --- a/modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff +++ b/modules/nf-core/deepvariant/makeexamples/deepvariant-makeexamples.diff @@ -3,6 +3,14 @@ Changes in component 'nf-core/deepvariant/makeexamples' Changes in 'deepvariant/makeexamples/main.nf': --- modules/nf-core/deepvariant/makeexamples/main.nf +++ modules/nf-core/deepvariant/makeexamples/main.nf +@@ -1,6 +1,6 @@ + process DEEPVARIANT_MAKEEXAMPLES { + tag "$meta.id" +- label 'process_high' ++ label 'process_very_high' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" @@ -36,6 +36,7 @@ --mode calling \\ --ref "${fasta}" \\ diff --git a/modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff b/modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff index c7acc49a..c46b2925 100644 --- a/modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff +++ b/modules/nf-core/deepvariant/postprocessvariants/deepvariant-postprocessvariants.diff @@ -3,6 +3,14 @@ Changes in component 'nf-core/deepvariant/postprocessvariants' Changes in 'deepvariant/postprocessvariants/main.nf': --- modules/nf-core/deepvariant/postprocessvariants/main.nf +++ modules/nf-core/deepvariant/postprocessvariants/main.nf +@@ -1,6 +1,6 @@ + process DEEPVARIANT_POSTPROCESSVARIANTS { + tag "$meta.id" +- label 'process_medium' ++ label 'process_high' + + //Conda is not supported at the moment + container "docker.io/google/deepvariant:1.9.0" @@ -64,6 +64,7 @@ --outfile "${prefix}.vcf.gz" \\ --nonvariant_site_tfrecord_path "${gvcf_tfrecords_logical_name}" \\ diff --git a/modules/nf-core/longphase/haplotag/longphase-haplotag.diff b/modules/nf-core/longphase/haplotag/longphase-haplotag.diff new file mode 100644 index 00000000..0d93067d --- /dev/null +++ b/modules/nf-core/longphase/haplotag/longphase-haplotag.diff @@ -0,0 +1,34 @@ +Changes in component 'nf-core/longphase/haplotag' +'modules/nf-core/longphase/haplotag/meta.yml' is unchanged +Changes in 'longphase/haplotag/main.nf': +--- modules/nf-core/longphase/haplotag/main.nf ++++ modules/nf-core/longphase/haplotag/main.nf +@@ -42,6 +42,11 @@ + if [ -f "${prefix}.out" ]; then + mv ${prefix}.out ${prefix}.log + fi ++ ++ cat <<-END_VERSIONS > versions.yml ++ "${task.process}": ++ longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') ++ END_VERSIONS + """ + + stub: +@@ -52,5 +57,10 @@ + """ + touch ${prefix}.${suffix} + ${log} ++ ++ cat <<-END_VERSIONS > versions.yml ++ "${task.process}": ++ longphase: \$(longphase --version | head -n 1 | sed 's/Version: //') ++ END_VERSIONS + """ +-} ++} +'modules/nf-core/longphase/haplotag/environment.yml' is unchanged +'modules/nf-core/longphase/haplotag/tests/main.nf.test' is unchanged +'modules/nf-core/longphase/haplotag/tests/main.nf.test.snap' is unchanged +'modules/nf-core/longphase/haplotag/tests/nextflow.config' is unchanged +************************************************************ diff --git a/nextflow_schema.json b/nextflow_schema.json index eceb2aaf..06a0603b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -66,7 +66,6 @@ "germline_var_keep": { "type": "array", "description": "List of germline variant callers to use. Must include at least one of [deepvariant, clair].", - "default": ["deepvariant", "clair"], "items": { "type": "string", "enum": ["deepvariant", "clair"] @@ -76,7 +75,6 @@ "somatic_var_keep": { "type": "array", "description": "List of somatic variant callers to use. Must include at least one of [deepsomatic, clair].", - "default": ["deepsomatic", "clair"], "items": { "type": "string", "enum": ["deepsomatic", "clair"] @@ -371,7 +369,7 @@ "use_gpu": { "type": "boolean", "default": false, - "description": "Use GPU for supported tools (e.g. DeepVariant, DeepSomatic)" + "description": "Use GPU for supported tools (e.g. DeepVariant, DeepSomatic, Clair3)" } } }, @@ -522,7 +520,7 @@ "hidden": true }, "help": { - "type": ["boolean", "string"], + "type": "boolean", "default": false, "description": "Display the help message." },