From 99766d99ed07cd00cd731ee6474845500dde0c96 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 30 Jun 2026 15:37:59 +0200 Subject: [PATCH 01/27] Prepare dev (3.9.1dev) (#2225) --- .nf-core.yml | 2 +- CHANGELOG.md | 39 +++ assets/multiqc_config.yml | 2 +- nextflow.config | 57 +++- ro-crate-metadata.json | 594 +++++++++++++++++++++++++++++--------- 5 files changed, 561 insertions(+), 133 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 5c329b8251..8431730ebe 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -24,4 +24,4 @@ template: name: sarek org: nf-core outdir: . - version: 3.9.0 + version: 3.9.1dev diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a284adc9e..88b429de3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,45 @@ All notable changes to this project will be documented in this file. 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). +## dev - unreleased + +### Added + +### Changed + +### Fixed + +### Removed + +### Dependencies - modules + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | + +### Dependencies - plugins + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | + +### Parameters + +| Params | status | +| ------ | ------ | + +### Developer section + +#### Added + +- [#2225](https://github.com/nf-core/sarek/pull/2225) - Add contributor ORCIDs to `nextflow.config` + +#### Changed + +- [#2225](https://github.com/nf-core/sarek/pull/2225) - Back to dev (3.9.1dev) + +#### Fixed + +#### Removed + ## [3.9.0](https://github.com/nf-core/sarek/releases/tag/3.9.0) - Sarvesjåhkå Sarvesjåhkå is the biggest stream from Sarvesvágge to flow in Rapaätno. diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 419eb35523..1ab45319b9 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,7 +3,7 @@ custom_logo_url: https://github.com/nf-core/sarek/ custom_logo_title: "nf-core/sarek" report_comment: > - This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the documentation. + This report has been generated by the nf-core/sarek analysis pipeline. For information about how to interpret these results, please see the documentation. report_section_order: "nf-core-sarek-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 06fb3810fd..f778ed037b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -390,7 +390,7 @@ manifest { name = 'nf-core/sarek' contributors = [ [ - name: ' Friederike Hanssen', + name: 'Friederike Hanssen', affiliation: 'Seqera', email: 'friederike.hanssen@seqera.io', github: '@friederikehanssen', @@ -415,78 +415,93 @@ manifest { name: 'Abhinav Sharma', github: '@abhi18av', contribution: ['contributor'], + orcid: '' ], [ name: 'Adam Talbot', affiliation: 'Seqera', github: '@adamrtalbot', contribution: ['contributor'], + orcid: '' ], [ name: 'Adrian Lärkeryd', github: '@adrlar', contribution: ['contributor'], + orcid: '0000-0003-1424-7840' ], [ name: 'Àitor Olivares', github: '@AitorPeseta', contribution: ['contributor'], + orcid: '' ], [ name: 'Alexander Peltzer', github: '@apeltzer', contribution: ['contributor'], + orcid: '0000-0002-6503-2180' ], [ name: 'Alison Meynert', github: '@ameynert', contribution: ['contributor'], + orcid: '0000-0001-5839-1751' ], [ name: 'Anders Sune Pedersen', github: '@asp8200', contribution: ['contributor'], + orcid: '' ], [ name: 'Aron Skaftason', github: '@arontommi', contribution: ['contributor'], + orcid: '0000-0002-5547-8568' ], [ name: 'Barry Digby', github: '@BarryDigby', contribution: ['contributor'], + orcid: '0000-0002-8492-6585' ], [ name: 'Bekir Ergüner', github: '@berguner', contribution: ['contributor'], + orcid: '0000-0001-5475-0892' ], [ name: 'Björn Nystedt', github: '@bjornnystedt', contribution: ['contributor'], + orcid: '' ], [ name: 'Christina Chatzipantsiou', github: '@cgpu', contribution: ['contributor'], + orcid: '0000-0002-4257-7241' ], [ name: 'Chela James', github: '@chelauk', contribution: ['contributor'], + orcid: '0000-0003-3996-0909' ], [ name: 'David Mas-Ponte', github: '@davidmasp', contribution: ['contributor'], + orcid: '0000-0001-7409-305X' ], [ name: 'Edmund Miller', affiliation: 'Seqera', github: '@edmundmiller', contribution: ['contributor'], + orcid: '' ], [ name: 'Famke Bäuerle', @@ -499,57 +514,68 @@ manifest { name: 'Francesco Lescai', github: '@lescai', contribution: ['contributor'], + orcid: '0000-0002-6399-9101' ], [ name: 'Francisco Martínez', github: '@nevinwu', contribution: ['contributor'], + orcid: '' ], [ name: 'Gavin Mackenzie', github: '@GCJMackenzie', contribution: ['contributor'], + orcid: '' ], [ name: 'Gisela Gabernet', github: '@ggabernet', contribution: ['contributor'], + orcid: '' ], [ name: 'Grant Neilson', github: '@grantn5', contribution: ['contributor'], + orcid: '' ], [ name: 'Max Käller', github: '@gulfshores', contribution: ['contributor'], + orcid: '0000-0001-6813-3051' ], [ name: 'Harshil Patel', affiliation: 'Seqera', github: '@drpatelh', contribution: ['contributor'], + orcid: '' ], [ name: 'Hongwei Ye', github: '@YeHW', contribution: ['contributor'], + orcid: '' ], [ name: 'James A. Fellows Yates', github: '@jfy133', contribution: ['contributor'], + orcid: '' ], [ name: 'Jesper Eisfeldt', github: '@J35P312', contribution: ['contributor'], + orcid: '0000-0003-3716-4917' ], [ name: 'Johannes Alneberg', github: '@alneberg', contribution: ['contributor'], + orcid: '0000-0002-2467-008X' ], [ name: 'Jonas Kjellin', @@ -562,113 +588,135 @@ manifest { name: 'José Fernández Navarro', github: '@jfnavarro', contribution: ['contributor'], + orcid: '' ], [ name: 'Júlia Mir Pedrol', github: '@mirpedrol', contribution: ['contributor'], + orcid: '0000-0001-6104-9260' ], [ name: 'Ken Brewer', affiliation: 'Seqera', github: '@kenibrewer', contribution: ['contributor'], + orcid: '' ], [ name: 'Lasse Westergaard Folkersen', github: '@lassefolkersen', contribution: ['contributor'], + orcid: '0000-0003-0708-9530' ], [ name: 'Lucia Conde', github: '@lconde-ucl', contribution: ['contributor'], + orcid: '' ], [ name: 'Louis Le Nézet', github: '@LouisLeNezet', contribution: ['contributor'], + orcid: '0009-0000-0202-2703' ], [ name: 'Malin Larsson', github: '@malinlarsson', contribution: ['contributor'], + orcid: '' ], [ name: 'Marcel Martin', github: '@marcelm', contribution: ['contributor'], + orcid: '' ], [ name: 'Nick Smith', github: '@nickhsmith', contribution: ['contributor'], + orcid: '' ], [ name: 'Nicolas Schcolnicov', github: '@nschcolnicov', contribution: ['contributor'], + orcid: '' ], [ name: 'Nilesh Tawari', github: '@nilesh-tawari', contribution: ['contributor'], + orcid: '0000-0002-1127-0765' ], [ name: 'Nils Homer', github: '@nh13', contribution: ['contributor'], + orcid: '0009-0007-7860-1155' ], [ name: 'Olga Botvinnik', github: '@olgabot', contribution: ['contributor'], + orcid: '0000-0003-4412-7970' ], [ name: 'Oskar Wacker', github: '@WackerO', contribution: ['contributor'], + orcid: '0009-0003-2041-610X' ], [ name: 'Pall Olason', github: '@pallolason', contribution: ['contributor'], + orcid: '0000-0002-3350-3443' ], [ name: 'Paul Cantalupo', github: '@pcantalupo', contribution: ['contributor'], + orcid: '0000-0003-3966-8481' ], [ name: 'Phil Ewels', affiliation: 'Seqera', github: '@ewels', contribution: ['contributor'], + orcid: '' ], [ name: 'Pierre Lindenbaum', github: '@lindenb', contribution: ['contributor'], + orcid: '0000-0003-0148-9787' ], [ name: 'Sabrina Krakau', github: '@skrakau', contribution: ['contributor'], + orcid: '0000-0003-0603-7907' ], [ name: 'Sam Minot', github: '@sminot', contribution: ['contributor'], + orcid: '' ], [ name: 'Sebastian DiLorenzo', github: '@Sebastian-D', contribution: ['contributor'], + orcid: '0000-0002-9759-2211' ], [ name: 'Silvia Morini', github: '@silviamorins', contribution: ['contributor'], + orcid: '0000-0002-2798-9870' ], [ name: 'Simon Pearce', @@ -681,26 +729,31 @@ manifest { name: 'Solenne Correard', github: '@scorreard', contribution: ['contributor'], + orcid: '0000-0002-0554-5443' ], [ name: 'Susanne Jodoin', github: '@SusiJo', contribution: ['contributor'], + orcid: '0009-0001-9152-7291' ], [ name: 'Tobias Koch', github: '@KochTobi', contribution: ['contributor'], + orcid: '' ], [ name: 'Winni Kretzschmar', github: '@winni2k', contribution: ['contributor'], + orcid: '' ], [ name: 'Patricie Skaláková', github: '@Patricie34', contribution: ['contributor'], + orcid: '0009-0009-0647-7639' ] ] homePage = 'https://github.com/nf-core/sarek' @@ -709,7 +762,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'master' nextflowVersion = '!>=25.10.2' - version = '3.9.0' + version = '3.9.1dev' doi = '10.12688/f1000research.16665.2, 10.1093/nargab/lqae031, 10.5281/zenodo.3476425' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index e6fbb45a6a..1b96b6ccf1 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -21,9 +21,9 @@ { "@id": "./", "@type": "Dataset", - "creativeWorkStatus": "Stable", - "datePublished": "2026-06-01T12:50:07+00:00", - "description": "

\n \n \n \"nf-core/sarek\"\n \n

\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/nf-core/sarek)\n[![GitHub Actions CI Status](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/sarek/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/sarek/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3476425-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3476425)\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.10.2-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/nf-core/sarek)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/sarek)\n[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)\n[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)\n[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/sarek** is a workflow designed to detect variants on whole genome or targeted sequencing data. Initially designed for Human, and Mouse, it can work on any species with a reference genome. Sarek can also handle tumour / normal pairs and could include additional relapses.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/sarek/results).\n\nIt's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/nf-core-sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek).\n\n

\n \n

\n\n## Pipeline summary\n\nDepending on the options and samples provided, the pipeline can currently perform the following:\n\n- Form consensus reads from UMI sequences (`fgbio`)\n- Sequencing quality control and trimming (enabled by `--trim_fastq`) (`FastQC`, `fastp`)\n- Contamination removal (`BBSplit`, enabled by `--tools bbsplit`)\n- Map Reads to Reference (`BWA-mem`, `BWA-mem2`, `dragmap` or `Sentieon BWA-mem`)\n- Process BAM file (`GATK MarkDuplicates`, `GATK BaseRecalibrator` and `GATK ApplyBQSR` or `Sentieon LocusCollector` and `Sentieon Dedup`)\n- _Experimental Feature_: Use GPU-accelerated parabricks implementation as alternative to \"Map Reads to Reference\" + \"Process BAM file\" (`--aligner parabricks`)\n- Summarise alignment statistics (`samtools stats`, `mosdepth`)\n- Variant calling (enabled by `--tools`, see [compatibility](https://nf-co.re/sarek/latest/docs/usage#which-variant-calling-tool-is-implemented-for-which-data-type)):\n - `ASCAT`\n - `CNVkit`\n - `Control-FREEC`\n - `DeepVariant`\n - `freebayes`\n - `GATK HaplotypeCaller`\n - `GATK Mutect2`\n - `indexcov`\n - `Lofreq`\n - `Manta`\n - `mpileup`\n - `MSIsensor2`\n - `MSIsensor-pro`\n - `MuSE`\n - `Sentieon Haplotyper`\n - `Strelka`\n - `TIDDIT`\n- Post-variant calling options, one of:\n - Filtering (`bcftools view` (default: filter by `PASS,.`)), normalisation (`bcftools norm`) and consensus calling (`bcftools isec`, default: called by at least 2 tools `-n+2`) on all vcfs and/or `bcftools concat` for germline vcfs\n - `Varlociraptor` for all vcfs\n- Variant filtering and annotation (`SnpEff`, `Ensembl VEP`, `BCFtools annotate`, `SnpSift`)\n- Summarise and represent QC (`MultiQC`)\n\n

\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`samplesheet.csv`:\n\n```csv\npatient,sample,lane,fastq_1,fastq_2\nID1,S1,L002,ID1_S1_L002_R1_001.fastq.gz,ID1_S1_L002_R2_001.fastq.gz\n```\n\nEach row represents a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/sarek \\\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\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/sarek/usage) and the [parameter documentation](https://nf-co.re/sarek/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/sarek/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/sarek/output).\n\n## Benchmarking\n\nOn each release, the pipeline is run on 3 full size tests:\n\n- `test_full` runs tumor-normal data for one patient from the SEQ2C consortium\n- `test_full_germline` runs a WGS 30X Genome-in-a-Bottle(NA12878) dataset\n- `test_full_germline_ncbench_agilent` runs two WES samples with 75M and 200M reads (data available [here](https://github.com/ncbench/ncbench-workflow#contributing-callsets)). The results are uploaded to Zenodo, evaluated against a truth dataset, and results are made available via the [NCBench dashboard](https://ncbench.github.io/report/report.html#).\n\n## Credits\n\nSarek was originally written by Maxime U Garcia and Szilveszter Juhos at the [National Genomics Infastructure](https://ngisweden.scilifelab.se) and [National Bioinformatics Infastructure Sweden](https://nbis.se) which are both platforms at [SciLifeLab](https://scilifelab.se), with the support of [The Swedish Childhood Tumor Biobank (Barntumörbanken)](https://ki.se/forskning/barntumorbanken).\nFriederike Hanssen and Gisela Gabernet at [QBiC](https://www.qbic.uni-tuebingen.de/) later joined and helped with further development.\n\nThe Nextflow DSL2 conversion of the pipeline was lead by Friederike Hanssen and Maxime U Garcia.\n\nMaintenance is now lead by Friederike Hanssen and Maxime U Garcia (now at [Seqera](https://seqera.io))\n\nMain developers:\n\n- [Maxime U Garcia](https://github.com/maxulysse)\n- [Friederike Hanssen](https://github.com/FriederikeHanssen)\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Abhinav Sharma](https://github.com/abhi18av)\n- [Adam Talbot](https://github.com/adamrtalbot)\n- [Adrian Lärkeryd](https://github.com/adrlar)\n- [Àitor Olivares](https://github.com/AitorPeseta)\n- [Alexander Peltzer](https://github.com/apeltzer)\n- [Alison Meynert](https://github.com/ameynert)\n- [Anders Sune Pedersen](https://github.com/asp8200)\n- [arontommi](https://github.com/arontommi)\n- [BarryDigby](https://github.com/BarryDigby)\n- [Bekir Ergüner](https://github.com/berguner)\n- [bjornnystedt](https://github.com/bjornnystedt)\n- [cgpu](https://github.com/cgpu)\n- [Chela James](https://github.com/chelauk)\n- [David Mas-Ponte](https://github.com/davidmasp)\n- [Edmund Miller](https://github.com/edmundmiller)\n- [Famke Bäuerle](https://github.com/famosab)\n- [Francesco Lescai](https://github.com/lescai)\n- [Francisco Martínez](https://github.com/nevinwu)\n- [Gavin Mackenzie](https://github.com/GCJMackenzie)\n- [Gisela Gabernet](https://github.com/ggabernet)\n- [Grant Neilson](https://github.com/grantn5)\n- [gulfshores](https://github.com/gulfshores)\n- [Harshil Patel](https://github.com/drpatelh)\n- [Hongwei Ye](https://github.com/YeHW)\n- [James A. Fellows Yates](https://github.com/jfy133)\n- [Jesper Eisfeldt](https://github.com/J35P312)\n- [Johannes Alneberg](https://github.com/alneberg)\n- [Jonas Kjellin](https://github.com/kjellinjonas)\n- [José Fernández Navarro](https://github.com/jfnavarro)\n- [Júlia Mir Pedrol](https://github.com/mirpedrol)\n- [Ken Brewer](https://github.com/kenibrewer)\n- [Lasse Westergaard Folkersen](https://github.com/lassefolkersen)\n- [Lucia Conde](https://github.com/lconde-ucl)\n- [Louis Le Nézet](https://github.com/LouisLeNezet)\n- [Malin Larsson](https://github.com/malinlarsson)\n- [Marcel Martin](https://github.com/marcelm)\n- [Nick Smith](https://github.com/nickhsmith)\n- [Nicolas Schcolnicov](https://github.com/nschcolnicov)\n- [Nilesh Tawari](https://github.com/nilesh-tawari)\n- [Nils Homer](https://github.com/nh13)\n- [Olga Botvinnik](https://github.com/olgabot)\n- [Oskar Wacker](https://github.com/WackerO)\n- [pallolason](https://github.com/pallolason)\n- [Paul Cantalupo](https://github.com/pcantalupo)\n- [Phil Ewels](https://github.com/ewels)\n- [Pierre Lindenbaum](https://github.com/lindenb)\n- [Sabrina Krakau](https://github.com/skrakau)\n- [Sam Minot](https://github.com/sminot)\n- [Sebastian-D](https://github.com/Sebastian-D)\n- [Silvia Morini](https://github.com/silviamorins)\n- [Simon Pearce](https://github.com/SPPearce)\n- [Solenne Correard](https://github.com/scorreard)\n- [Susanne Jodoin](https://github.com/SusiJo)\n- [Szilveszter Juhos](https://github.com/szilvajuhos)\n- [Tobias Koch](https://github.com/KochTobi)\n- [Winni Kretzschmar](https://github.com/winni2k)\n- [Patricie Skaláková](https://github.com/Patricie34)\n\n## Acknowledgements\n\n| [![Barntumörbanken](docs/images/BTB_logo.png)](https://ki.se/forskning/barntumorbanken) | [![SciLifeLab](docs/images/SciLifeLab_logo.png)](https://scilifelab.se) |\n| :-----------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: |\n| [![National Genomics Infrastructure](docs/images/NGI_logo.png)](https://ngisweden.scilifelab.se/) | [![National Bioinformatics Infrastructure Sweden](docs/images/NBIS_logo.png)](https://nbis.se) |\n| [![QBiC](docs/images/QBiC_logo.png)](https://www.qbic.uni-tuebingen.de) | [![GHGA](docs/images/GHGA_logo.png)](https://www.ghga.de/) |\n| [![DNGC](docs/images/DNGC_logo.png)](https://eng.ngc.dk/) | |\n\n## Contributions & Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek) (you can join with [this invite](https://nf-co.re/join/slack)), or contact us: [Maxime U Garcia](mailto:maxime.garcia@seqera.io?subject=[GitHub]%20nf-core/sarek), [Friederike Hanssen](mailto:friederike.hanssen@qbic.uni-tuebingen.de?subject=[GitHub]%20nf-core/sarek)\n\n## Citations\n\nIf you use `nf-core/sarek` for your analysis, please cite the `Sarek` article as follows:\n\n> Friederike Hanssen, Maxime U Garcia, Lasse Folkersen, Anders Sune Pedersen, Francesco Lescai, Susanne Jodoin, Edmund Miller, Oskar Wacker, Nicholas Smith, nf-core community, Gisela Gabernet, Sven Nahnsen **Scalable and efficient DNA sequencing analysis on different compute infrastructures aiding variant discovery** _NAR Genomics and Bioinformatics_ Volume 6, Issue 2, June 2024, lqae031, [doi: 10.1093/nargab/lqae031](https://doi.org/10.1093/nargab/lqae031).\n\n> Garcia M, Juhos S, Larsson M et al. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants [version 2; peer review: 2 approved]** _F1000Research_ 2020, 9:63 [doi: 10.12688/f1000research.16665.2](http://dx.doi.org/10.12688/f1000research.16665.2).\n\nYou can cite the sarek zenodo record for a specific version using the following [doi: 10.5281/zenodo.3476425](https://doi.org/10.5281/zenodo.3476425)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\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\n## CHANGELOG\n\n- [CHANGELOG](CHANGELOG.md)\n", + "creativeWorkStatus": "InProgress", + "datePublished": "2026-06-30T11:52:57+00:00", + "description": "

\n \n \n \"nf-core/sarek\"\n \n

\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/nf-core/sarek)\n[![GitHub Actions CI Status](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/sarek/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/sarek/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3476425-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3476425)\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.10.2-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/nf-core/sarek)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/sarek)\n[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)\n[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)\n[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/sarek** is a workflow designed to detect variants on whole genome or targeted sequencing data. Initially designed for Human, and Mouse, it can work on any species with a reference genome. Sarek can also handle tumour / normal pairs and could include additional relapses.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/sarek/results).\n\nIt's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/nf-core-sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek).\n\n

\n \n

\n\n## Pipeline summary\n\nDepending on the options and samples provided, the pipeline can currently perform the following:\n\n- Form consensus reads from UMI sequences (`fgbio`)\n- Sequencing quality control and trimming (enabled by `--trim_fastq`) (`FastQC`, `fastp`)\n- Contamination removal (`BBSplit`, enabled by `--tools bbsplit`)\n- Map Reads to Reference (`BWA-mem`, `BWA-mem2`, `dragmap` or `Sentieon BWA-mem`)\n- Process BAM file (`GATK MarkDuplicates`, `GATK BaseRecalibrator` and `GATK ApplyBQSR` or `Sentieon LocusCollector` and `Sentieon Dedup`)\n- _Experimental Feature_: Use GPU-accelerated parabricks implementation as alternative to \"Map Reads to Reference\" + \"Process BAM file\" (`--aligner parabricks`)\n- Summarise alignment statistics (`samtools stats`, `mosdepth`)\n- Variant calling (enabled by `--tools`, see [compatibility](https://nf-co.re/sarek/latest/docs/usage#which-variant-calling-tool-is-implemented-for-which-data-type)):\n - `ASCAT`\n - `CNVkit`\n - `Control-FREEC`\n - `DeepVariant`\n - `freebayes`\n - `GATK HaplotypeCaller`\n - `GATK Mutect2`\n - `indexcov`\n - `Lofreq`\n - `Manta`\n - `mpileup`\n - `MSIsensor2`\n - `MSIsensor-pro`\n - `MuSE`\n - `Sentieon Haplotyper`\n - `Strelka`\n - `TIDDIT`\n- Post-variant calling options, one of:\n - Filtering (`bcftools view` (default: filter by `PASS,.`)), normalisation (`bcftools norm`) and consensus calling (`bcftools isec`, default: called by at least 2 tools `-n+2`) on all vcfs and/or `bcftools concat` for germline vcfs\n - `Varlociraptor` for all vcfs\n- Variant filtering and annotation (`SnpEff`, `Ensembl VEP`, `BCFtools annotate`, `SnpSift`)\n- Summarise and represent QC (`MultiQC`)\n\n

\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`samplesheet.csv`:\n\n```csv\npatient,sample,lane,fastq_1,fastq_2\nID1,S1,L002,ID1_S1_L002_R1_001.fastq.gz,ID1_S1_L002_R2_001.fastq.gz\n```\n\nEach row represents a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/sarek \\\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\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/sarek/usage) and the [parameter documentation](https://nf-co.re/sarek/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/sarek/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/sarek/output).\n\n## Benchmarking\n\nOn each release, the pipeline is run on 3 full size tests:\n\n- `test_full` runs tumor-normal data for one patient from the SEQ2C consortium\n- `test_full_germline` runs a WGS 30X Genome-in-a-Bottle(NA12878) dataset\n- `test_full_germline_ncbench_agilent` runs two WES samples with 75M and 200M reads (data available [here](https://github.com/ncbench/ncbench-workflow#contributing-callsets)). The results are uploaded to Zenodo, evaluated against a truth dataset, and results are made available via the [NCBench dashboard](https://ncbench.github.io/report/report.html#).\n\n## Credits\n\nSarek was originally written by Maxime U Garcia and Szilveszter Juhos at the [National Genomics Infastructure](https://ngisweden.scilifelab.se) and [National Bioinformatics Infastructure Sweden](https://nbis.se) which are both platforms at [SciLifeLab](https://scilifelab.se), with the support of [The Swedish Childhood Tumor Biobank (Barntumörbanken)](https://ki.se/forskning/barntumorbanken).\nFriederike Hanssen and Gisela Gabernet at [QBiC](https://www.qbic.uni-tuebingen.de/) later joined and helped with further development.\n\nThe Nextflow DSL2 conversion of the pipeline was lead by Friederike Hanssen and Maxime U Garcia.\n\nMaintenance is now lead by Friederike Hanssen and Maxime U Garcia (now at [Seqera](https://seqera.io))\n\nMain developers:\n\n- [Maxime U Garcia](https://github.com/maxulysse)\n- [Friederike Hanssen](https://github.com/FriederikeHanssen)\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Abhinav Sharma](https://github.com/abhi18av)\n- [Adam Talbot](https://github.com/adamrtalbot)\n- [Adrian Lärkeryd](https://github.com/adrlar)\n- [Àitor Olivares](https://github.com/AitorPeseta)\n- [Alexander Peltzer](https://github.com/apeltzer)\n- [Alison Meynert](https://github.com/ameynert)\n- [Anders Sune Pedersen](https://github.com/asp8200)\n- [arontommi](https://github.com/arontommi)\n- [BarryDigby](https://github.com/BarryDigby)\n- [Bekir Ergüner](https://github.com/berguner)\n- [bjornnystedt](https://github.com/bjornnystedt)\n- [cgpu](https://github.com/cgpu)\n- [Chela James](https://github.com/chelauk)\n- [David Mas-Ponte](https://github.com/davidmasp)\n- [Edmund Miller](https://github.com/edmundmiller)\n- [Famke Bäuerle](https://github.com/famosab)\n- [Francesco Lescai](https://github.com/lescai)\n- [Francisco Martínez](https://github.com/nevinwu)\n- [Gavin Mackenzie](https://github.com/GCJMackenzie)\n- [Gisela Gabernet](https://github.com/ggabernet)\n- [Grant Neilson](https://github.com/grantn5)\n- [gulfshores](https://github.com/gulfshores)\n- [Harshil Patel](https://github.com/drpatelh)\n- [Hongwei Ye](https://github.com/YeHW)\n- [James A. Fellows Yates](https://github.com/jfy133)\n- [Jesper Eisfeldt](https://github.com/J35P312)\n- [Johannes Alneberg](https://github.com/alneberg)\n- [Jonas Kjellin](https://github.com/kjellinjonas)\n- [José Fernández Navarro](https://github.com/jfnavarro)\n- [Júlia Mir Pedrol](https://github.com/mirpedrol)\n- [Ken Brewer](https://github.com/kenibrewer)\n- [Lasse Westergaard Folkersen](https://github.com/lassefolkersen)\n- [Lucia Conde](https://github.com/lconde-ucl)\n- [Louis Le Nézet](https://github.com/LouisLeNezet)\n- [Malin Larsson](https://github.com/malinlarsson)\n- [Marcel Martin](https://github.com/marcelm)\n- [Nick Smith](https://github.com/nickhsmith)\n- [Nicolas Schcolnicov](https://github.com/nschcolnicov)\n- [Nilesh Tawari](https://github.com/nilesh-tawari)\n- [Nils Homer](https://github.com/nh13)\n- [Olga Botvinnik](https://github.com/olgabot)\n- [Oskar Wacker](https://github.com/WackerO)\n- [pallolason](https://github.com/pallolason)\n- [Paul Cantalupo](https://github.com/pcantalupo)\n- [Phil Ewels](https://github.com/ewels)\n- [Pierre Lindenbaum](https://github.com/lindenb)\n- [Sabrina Krakau](https://github.com/skrakau)\n- [Sam Minot](https://github.com/sminot)\n- [Sebastian-D](https://github.com/Sebastian-D)\n- [Silvia Morini](https://github.com/silviamorins)\n- [Simon Pearce](https://github.com/SPPearce)\n- [Solenne Correard](https://github.com/scorreard)\n- [Susanne Jodoin](https://github.com/SusiJo)\n- [Szilveszter Juhos](https://github.com/szilvajuhos)\n- [Tobias Koch](https://github.com/KochTobi)\n- [Winni Kretzschmar](https://github.com/winni2k)\n- [Patricie Skaláková](https://github.com/Patricie34)\n\n## Acknowledgements\n\n| [![Barntumörbanken](docs/images/BTB_logo.png)](https://ki.se/forskning/barntumorbanken) | [![SciLifeLab](docs/images/SciLifeLab_logo.png)](https://scilifelab.se) |\n| :-----------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: |\n| [![National Genomics Infrastructure](docs/images/NGI_logo.png)](https://ngisweden.scilifelab.se/) | [![National Bioinformatics Infrastructure Sweden](docs/images/NBIS_logo.png)](https://nbis.se) |\n| [![QBiC](docs/images/QBiC_logo.png)](https://www.qbic.uni-tuebingen.de) | [![GHGA](docs/images/GHGA_logo.png)](https://www.ghga.de/) |\n| [![DNGC](docs/images/DNGC_logo.png)](https://eng.ngc.dk/) | |\n\n## Contributions & Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek) (you can join with [this invite](https://nf-co.re/join/slack)), or contact us: [Maxime U Garcia](mailto:maxime.garcia@seqera.io?subject=[GitHub]%20nf-core/sarek), [Friederike Hanssen](mailto:friederike.hanssen@qbic.uni-tuebingen.de?subject=[GitHub]%20nf-core/sarek)\n\n## Citations\n\nIf you use `nf-core/sarek` for your analysis, please cite the `Sarek` article as follows:\n\n> Friederike Hanssen, Maxime U Garcia, Lasse Folkersen, Anders Sune Pedersen, Francesco Lescai, Susanne Jodoin, Edmund Miller, Oskar Wacker, Nicholas Smith, nf-core community, Gisela Gabernet, Sven Nahnsen **Scalable and efficient DNA sequencing analysis on different compute infrastructures aiding variant discovery** _NAR Genomics and Bioinformatics_ Volume 6, Issue 2, June 2024, lqae031, [doi: 10.1093/nargab/lqae031](https://doi.org/10.1093/nargab/lqae031).\n\n> Garcia M, Juhos S, Larsson M et al. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants [version 2; peer review: 2 approved]** _F1000Research_ 2020, 9:63 [doi: 10.12688/f1000research.16665.2](http://dx.doi.org/10.12688/f1000research.16665.2).\n\nYou can cite the sarek zenodo record for a specific version using the following [doi: 10.5281/zenodo.3476425](https://doi.org/10.5281/zenodo.3476425)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\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\n## CHANGELOG\n\n- [CHANGELOG](CHANGELOG.md)\n", "hasPart": [ { "@id": "main.nf" @@ -105,7 +105,7 @@ }, "mentions": [ { - "@id": "#c60357f9-6f0b-4e98-b39b-24df795b1c33" + "@id": "#b97eb6f8-b646-40a3-ae10-5f5ffb44d674" } ], "name": "nf-core/sarek" @@ -132,146 +132,214 @@ "SoftwareSourceCode", "ComputationalWorkflow" ], - "creator": [ + "author": [ { - "@id": "#max.u.garcia@gmail.com" + "@id": "https://orcid.org/0009-0001-9875-5262" }, { - "@id": "https://orcid.org/0009-0006-2111-4316" + "@id": "https://orcid.org/0000-0003-2827-9261" }, { - "@id": "https://orcid.org/0000-0001-7409-305X" + "@id": "https://orcid.org/0000-0001-6280-4643" + } + ], + "contributor": [ + { + "@id": "#3b628590-2d18-45c2-8735-ca0ac1469638" }, { - "@id": "#malin.larsson@liu.se" + "@id": "#e58783af-bd4e-4da8-be47-64110be9efec" }, { - "@id": "https://orcid.org/0000-0001-6104-9260" + "@id": "https://orcid.org/0000-0003-1424-7840" }, { - "@id": "#l.conde@ucl.ac.uk" + "@id": "#5b1ef3a6-a674-419a-968c-dd4902210dd7" }, { - "@id": "https://orcid.org/0000-0003-3996-0909" + "@id": "https://orcid.org/0000-0002-6503-2180" }, { - "@id": "#yehwhey@gmail.com" + "@id": "https://orcid.org/0000-0001-5839-1751" }, { - "@id": "#famke.baeuerle@gmail.com" + "@id": "#c2a47fa4-6d82-4006-b980-a095896f3748" }, { - "@id": "https://orcid.org/0000-0003-3996-0909" + "@id": "https://orcid.org/0000-0002-5547-8568" }, { - "@id": "#max.u.garcia@gmail.com" + "@id": "https://orcid.org/0000-0002-8492-6585" }, { - "@id": "#jc.fernandez.navarro@gmail.com" + "@id": "https://orcid.org/0000-0001-5475-0892" }, { - "@id": "https://orcid.org/0000-0003-3966-8481" + "@id": "#4cda009a-bb61-41e4-a4cf-7e34ba24f47b" + }, + { + "@id": "https://orcid.org/0000-0002-4257-7241" }, { - "@id": "#24893913+SPPearce@users.noreply.github.com" + "@id": "https://orcid.org/0000-0003-3996-0909" + }, + { + "@id": "https://orcid.org/0000-0001-7409-305X" }, { - "@id": "#heuermh@acm.org" + "@id": "#6f59c36f-bca8-4c87-82ad-c9092227118d" }, { "@id": "https://orcid.org/0000-0003-1387-0251" }, { - "@id": "https://orcid.org/0000-0001-6280-4643" + "@id": "https://orcid.org/0000-0002-6399-9101" }, { - "@id": "https://orcid.org/0000-0003-0603-7907" + "@id": "#7e30bf1a-cca3-460b-b647-c765bd5cb29a" }, { - "@id": "#53608000+lescai@users.noreply.github.com" + "@id": "#70e64dde-3c79-45ed-9877-19625cfb5d01" }, { - "@id": "https://orcid.org/0000-0002-6503-2180" + "@id": "#e29c293c-19df-4bf0-ae54-0ff9a4ec1497" }, { - "@id": "#adr.lar@me.com" + "@id": "#f2dc6677-dfb3-46e1-b26f-289cee5115be" }, { - "@id": "https://orcid.org/0009-0001-9875-5262" + "@id": "https://orcid.org/0000-0001-6813-3051" }, { - "@id": "https://orcid.org/0009-0007-7860-1155" + "@id": "#97d0e55f-7192-42b9-ac51-0512e426e7de" }, { - "@id": "https://orcid.org/0000-0002-5762-6253" - } - ], - "dateCreated": "", - "dateModified": "2026-06-01T14:50:07Z", - "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", - "keywords": [ - "nf-core", - "nextflow", - "annotation", - "cancer", - "gatk4", - "genomics", - "germline", - "pre-processing", - "somatic", - "target-panels", - "variant-calling", - "whole-exome-sequencing", - "whole-genome-sequencing" - ], - "license": [ - "MIT" - ], - "maintainer": [ + "@id": "#c993a226-ea9c-49c1-9d91-eb18659cb722" + }, { - "@id": "https://orcid.org/0000-0001-7409-305X" + "@id": "#5e39fb6a-58a7-406b-9d6a-c5c4f281fd89" + }, + { + "@id": "https://orcid.org/0000-0003-3716-4917" + }, + { + "@id": "https://orcid.org/0000-0002-2467-008X" }, { - "@id": "#malin.larsson@liu.se" + "@id": "https://orcid.org/0000-0002-3830-7046" + }, + { + "@id": "#692a3ff8-8e27-4140-aee2-141037e8888d" }, { "@id": "https://orcid.org/0000-0001-6104-9260" }, { - "@id": "#l.conde@ucl.ac.uk" + "@id": "#6f14922a-b41f-4dd3-8661-3eaf0b99f70a" }, { - "@id": "https://orcid.org/0000-0003-3996-0909" + "@id": "https://orcid.org/0000-0003-0708-9530" }, { - "@id": "#yehwhey@gmail.com" + "@id": "#74c1ff6a-fa5f-4a4a-84c5-f4eefa1d3d09" }, { - "@id": "#max.u.garcia@gmail.com" + "@id": "https://orcid.org/0009-0000-0202-2703" }, { - "@id": "#jc.fernandez.navarro@gmail.com" + "@id": "#ba7614f8-0190-4209-a2f4-a8a8dd8f96bf" }, { - "@id": "https://orcid.org/0000-0003-3966-8481" + "@id": "#e9bfeffd-dc8a-42f6-a3e0-5ebcb00c3097" }, { - "@id": "#24893913+SPPearce@users.noreply.github.com" + "@id": "#093c6988-c462-4474-b731-a9a085033797" }, { - "@id": "https://orcid.org/0000-0003-1387-0251" + "@id": "#b9b9b14b-4d16-4cc2-8689-c2abac06db13" }, { - "@id": "https://orcid.org/0000-0001-6280-4643" + "@id": "https://orcid.org/0000-0002-1127-0765" + }, + { + "@id": "https://orcid.org/0009-0007-7860-1155" + }, + { + "@id": "https://orcid.org/0000-0003-4412-7970" + }, + { + "@id": "https://orcid.org/0009-0003-2041-610X" + }, + { + "@id": "https://orcid.org/0000-0002-3350-3443" + }, + { + "@id": "https://orcid.org/0000-0003-3966-8481" + }, + { + "@id": "#14924136-a73b-406c-91eb-5f10620ea097" + }, + { + "@id": "https://orcid.org/0000-0003-0148-9787" }, { "@id": "https://orcid.org/0000-0003-0603-7907" }, { - "@id": "https://orcid.org/0000-0002-6503-2180" + "@id": "#1724fe39-c41b-49b9-8525-d7df86b20b98" }, { - "@id": "https://orcid.org/0009-0007-7860-1155" + "@id": "https://orcid.org/0000-0002-9759-2211" + }, + { + "@id": "https://orcid.org/0000-0002-2798-9870" + }, + { + "@id": "https://orcid.org/0000-0002-1680-5538" + }, + { + "@id": "https://orcid.org/0000-0002-0554-5443" + }, + { + "@id": "https://orcid.org/0009-0001-9152-7291" + }, + { + "@id": "#08187f11-d51b-40f0-b09d-a1ff8bf52d45" + }, + { + "@id": "#30622e12-b2e6-43e8-99ed-b07a5cf40165" + }, + { + "@id": "https://orcid.org/0009-0009-0647-7639" + } + ], + "dateCreated": "", + "dateModified": "2026-06-30T13:52:57Z", + "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", + "keywords": [ + "nf-core", + "nextflow", + "annotation", + "cancer", + "gatk4", + "genomics", + "germline", + "pre-processing", + "somatic", + "target-panels", + "variant-calling", + "whole-exome-sequencing", + "whole-genome-sequencing" + ], + "license": [ + "MIT" + ], + "maintainer": [ + { + "@id": "https://orcid.org/0009-0001-9875-5262" + }, + { + "@id": "https://orcid.org/0000-0003-2827-9261" } ], "name": [ @@ -285,10 +353,10 @@ }, "url": [ "https://github.com/nf-core/sarek", - "https://nf-co.re/sarek/3.9.0/" + "https://nf-co.re/sarek/dev/" ], "version": [ - "3.9.0" + "3.9.1dev" ] }, { @@ -304,11 +372,11 @@ "version": "!>=25.10.2" }, { - "@id": "#c60357f9-6f0b-4e98-b39b-24df795b1c33", + "@id": "#b97eb6f8-b646-40a3-ae10-5f5ffb44d674", "@type": "TestSuite", "instance": [ { - "@id": "#55b91080-044c-4de6-8964-4b2671a50ed6" + "@id": "#d14a97e6-1b18-45f9-919e-bed422607342" } ], "mainEntity": { @@ -317,7 +385,7 @@ "name": "Test suite for nf-core/sarek" }, { - "@id": "#55b91080-044c-4de6-8964-4b2671a50ed6", + "@id": "#d14a97e6-1b18-45f9-919e-bed422607342", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/sarek", "resource": "repos/nf-core/sarek/actions/workflows/nf-test.yml", @@ -456,136 +524,404 @@ "url": "https://nf-co.re/" }, { - "@id": "#max.u.garcia@gmail.com", + "@id": "https://orcid.org/0009-0001-9875-5262", "@type": "Person", - "email": "max.u.garcia@gmail.com", - "name": "Maxime U Garcia" + "affiliation": "Seqera", + "email": "friederike.hanssen@seqera.io", + "name": "Friederike Hanssen", + "url": "https://github.com/friederikehanssen" + }, + { + "@id": "https://orcid.org/0000-0003-2827-9261", + "@type": "Person", + "affiliation": "NGI", + "email": "maxime.garcia@scilifelab.se", + "name": "Maxime U Garcia", + "url": "https://github.com/maxulysse" + }, + { + "@id": "https://orcid.org/0000-0001-6280-4643", + "@type": "Person", + "email": "szilveszter.juhos@scilifelab.se", + "name": "Szilveszter Juhos", + "url": "https://github.com/szilvajuhos" + }, + { + "@id": "#3b628590-2d18-45c2-8735-ca0ac1469638", + "@type": "Person", + "email": "abhi18av@users.noreply.github.com", + "name": "Abhinav Sharma", + "url": "https://github.com/abhi18av" }, { - "@id": "https://orcid.org/0009-0006-2111-4316", + "@id": "#e58783af-bd4e-4da8-be47-64110be9efec", "@type": "Person", - "email": "smith@in.tum.de", - "name": "Smith Nicholas" + "affiliation": "Seqera", + "email": "12817534+adamrtalbot@users.noreply.github.com", + "name": "Adam Talbot", + "url": "https://github.com/adamrtalbot" + }, + { + "@id": "https://orcid.org/0000-0003-1424-7840", + "@type": "Person", + "name": "Adrian Lärkeryd", + "url": "https://github.com/adrlar" + }, + { + "@id": "#5b1ef3a6-a674-419a-968c-dd4902210dd7", + "@type": "Person", + "name": "Àitor Olivares", + "url": "https://github.com/AitorPeseta" + }, + { + "@id": "https://orcid.org/0000-0002-6503-2180", + "@type": "Person", + "email": "apeltzer@users.noreply.github.com", + "name": "Alexander Peltzer", + "url": "https://github.com/apeltzer" + }, + { + "@id": "https://orcid.org/0000-0001-5839-1751", + "@type": "Person", + "email": "alison.meynert@ed.ac.uk", + "name": "Alison Meynert", + "url": "https://github.com/ameynert" + }, + { + "@id": "#c2a47fa4-6d82-4006-b980-a095896f3748", + "@type": "Person", + "email": "37172585+asp8200@users.noreply.github.com", + "name": "Anders Sune Pedersen", + "url": "https://github.com/asp8200" + }, + { + "@id": "https://orcid.org/0000-0002-5547-8568", + "@type": "Person", + "name": "Aron Skaftason", + "url": "https://github.com/arontommi" + }, + { + "@id": "https://orcid.org/0000-0002-8492-6585", + "@type": "Person", + "name": "Barry Digby", + "url": "https://github.com/BarryDigby" + }, + { + "@id": "https://orcid.org/0000-0001-5475-0892", + "@type": "Person", + "email": "bekire@gmail.com", + "name": "Bekir Ergüner", + "url": "https://github.com/berguner" + }, + { + "@id": "#4cda009a-bb61-41e4-a4cf-7e34ba24f47b", + "@type": "Person", + "name": "Björn Nystedt", + "url": "https://github.com/bjornnystedt" + }, + { + "@id": "https://orcid.org/0000-0002-4257-7241", + "@type": "Person", + "name": "Christina Chatzipantsiou", + "url": "https://github.com/cgpu" + }, + { + "@id": "https://orcid.org/0000-0003-3996-0909", + "@type": "Person", + "email": "chela.james@icr.ac.uk", + "name": "Chela James", + "url": "https://github.com/chelauk" }, { "@id": "https://orcid.org/0000-0001-7409-305X", "@type": "Person", "email": "david.mas.p@gmail.com", - "name": "David Mas-Ponte" + "name": "David Mas-Ponte", + "url": "https://github.com/davidmasp" }, { - "@id": "#malin.larsson@liu.se", + "@id": "#6f59c36f-bca8-4c87-82ad-c9092227118d", "@type": "Person", - "email": "malin.larsson@liu.se", - "name": "Malin Larsson" + "affiliation": "Seqera", + "email": "20095261+edmundmiller@users.noreply.github.com", + "name": "Edmund Miller", + "url": "https://github.com/edmundmiller" + }, + { + "@id": "https://orcid.org/0000-0003-1387-0251", + "@type": "Person", + "affiliation": "Quantitative Biology Center (QBiC) Tübingen, University of Tübingen, Germany", + "email": "45968370+famosab@users.noreply.github.com", + "name": "Famke Bäuerle", + "url": "https://github.com/famosab" + }, + { + "@id": "https://orcid.org/0000-0002-6399-9101", + "@type": "Person", + "email": "53608000+lescai@users.noreply.github.com", + "name": "Francesco Lescai", + "url": "https://github.com/lescai" + }, + { + "@id": "#7e30bf1a-cca3-460b-b647-c765bd5cb29a", + "@type": "Person", + "email": "f.martinezpico@gmail.com", + "name": "Francisco Martínez", + "url": "https://github.com/nevinwu" + }, + { + "@id": "#70e64dde-3c79-45ed-9877-19625cfb5d01", + "@type": "Person", + "name": "Gavin Mackenzie", + "url": "https://github.com/GCJMackenzie" + }, + { + "@id": "#e29c293c-19df-4bf0-ae54-0ff9a4ec1497", + "@type": "Person", + "email": "gisela.gabernet@gmail.com", + "name": "Gisela Gabernet", + "url": "https://github.com/ggabernet" + }, + { + "@id": "#f2dc6677-dfb3-46e1-b26f-289cee5115be", + "@type": "Person", + "email": "127763095+grantn5@users.noreply.github.com", + "name": "Grant Neilson", + "url": "https://github.com/grantn5" + }, + { + "@id": "https://orcid.org/0000-0001-6813-3051", + "@type": "Person", + "name": "Max Käller", + "url": "https://github.com/gulfshores" + }, + { + "@id": "#97d0e55f-7192-42b9-ac51-0512e426e7de", + "@type": "Person", + "affiliation": "Seqera", + "email": "drpatelh@users.noreply.github.com", + "name": "Harshil Patel", + "url": "https://github.com/drpatelh" + }, + { + "@id": "#c993a226-ea9c-49c1-9d91-eb18659cb722", + "@type": "Person", + "email": "yehwhey@gmail.com", + "name": "Hongwei Ye", + "url": "https://github.com/YeHW" + }, + { + "@id": "#5e39fb6a-58a7-406b-9d6a-c5c4f281fd89", + "@type": "Person", + "name": "James A. Fellows Yates", + "url": "https://github.com/jfy133" + }, + { + "@id": "https://orcid.org/0000-0003-3716-4917", + "@type": "Person", + "name": "Jesper Eisfeldt", + "url": "https://github.com/J35P312" + }, + { + "@id": "https://orcid.org/0000-0002-2467-008X", + "@type": "Person", + "email": "johannes.alneberg@scilifelab.se", + "name": "Johannes Alneberg", + "url": "https://github.com/alneberg" + }, + { + "@id": "https://orcid.org/0000-0002-3830-7046", + "@type": "Person", + "affiliation": "National Genomics Infrastructure (NGI), Uppsala University, Sweden", + "email": "jonas.kjellin@gmail.com", + "name": "Jonas Kjellin", + "url": "https://github.com/kjellinjonas" + }, + { + "@id": "#692a3ff8-8e27-4140-aee2-141037e8888d", + "@type": "Person", + "email": "jc.fernandez.navarro@gmail.com", + "name": "José Fernández Navarro", + "url": "https://github.com/jfnavarro" }, { "@id": "https://orcid.org/0000-0001-6104-9260", "@type": "Person", "email": "mirp.julia@gmail.com", - "name": "Júlia Mir Pedrol" + "name": "Júlia Mir Pedrol", + "url": "https://github.com/mirpedrol" }, { - "@id": "#l.conde@ucl.ac.uk", + "@id": "#6f14922a-b41f-4dd3-8661-3eaf0b99f70a", + "@type": "Person", + "affiliation": "Seqera", + "email": "kenibrewer@users.noreply.github.com", + "name": "Ken Brewer", + "url": "https://github.com/kenibrewer" + }, + { + "@id": "https://orcid.org/0000-0003-0708-9530", + "@type": "Person", + "name": "Lasse Westergaard Folkersen", + "url": "https://github.com/lassefolkersen" + }, + { + "@id": "#74c1ff6a-fa5f-4a4a-84c5-f4eefa1d3d09", "@type": "Person", "email": "l.conde@ucl.ac.uk", - "name": "Lucia Conde" + "name": "Lucia Conde", + "url": "https://github.com/lconde-ucl" }, { - "@id": "https://orcid.org/0000-0003-3996-0909", + "@id": "https://orcid.org/0009-0000-0202-2703", "@type": "Person", - "email": "chela.james@icr.ac.uk", - "name": "chela james" + "name": "Louis Le Nézet", + "url": "https://github.com/LouisLeNezet" }, { - "@id": "#yehwhey@gmail.com", + "@id": "#ba7614f8-0190-4209-a2f4-a8a8dd8f96bf", "@type": "Person", - "email": "yehwhey@gmail.com", - "name": "Hongwei Ye" + "email": "malin.larsson@liu.se", + "name": "Malin Larsson", + "url": "https://github.com/malinlarsson" }, { - "@id": "#famke.baeuerle@gmail.com", + "@id": "#e9bfeffd-dc8a-42f6-a3e0-5ebcb00c3097", "@type": "Person", - "email": "famke.baeuerle@gmail.com", - "name": "Famke Bäuerle" + "name": "Marcel Martin", + "url": "https://github.com/marcelm" }, { - "@id": "#jc.fernandez.navarro@gmail.com", + "@id": "#093c6988-c462-4474-b731-a9a085033797", "@type": "Person", - "email": "jc.fernandez.navarro@gmail.com", - "name": "José Fernández Navarro" + "name": "Nick Smith", + "url": "https://github.com/nickhsmith" }, { - "@id": "https://orcid.org/0000-0003-3966-8481", + "@id": "#b9b9b14b-4d16-4cc2-8689-c2abac06db13", "@type": "Person", - "email": "pcantalupo@gmail.com", - "name": "Paul Cantalupo" + "email": "90359308+nschcolnicov@users.noreply.github.com", + "name": "Nicolas Schcolnicov", + "url": "https://github.com/nschcolnicov" }, { - "@id": "#24893913+SPPearce@users.noreply.github.com", + "@id": "https://orcid.org/0000-0002-1127-0765", "@type": "Person", - "email": "24893913+SPPearce@users.noreply.github.com", - "name": "Simon Pearce" + "name": "Nilesh Tawari", + "url": "https://github.com/nilesh-tawari" }, { - "@id": "#heuermh@acm.org", + "@id": "https://orcid.org/0009-0007-7860-1155", "@type": "Person", - "email": "heuermh@acm.org", - "name": "Michael L Heuer" + "email": "nh13@users.noreply.github.com", + "name": "Nils Homer", + "url": "https://github.com/nh13" }, { - "@id": "https://orcid.org/0000-0003-1387-0251", + "@id": "https://orcid.org/0000-0003-4412-7970", "@type": "Person", - "email": "45968370+famosab@users.noreply.github.com", - "name": "Famke Bäuerle" + "email": "olga.botvinnik@gmail.com", + "name": "Olga Botvinnik", + "url": "https://github.com/olgabot" }, { - "@id": "https://orcid.org/0000-0001-6280-4643", + "@id": "https://orcid.org/0009-0003-2041-610X", "@type": "Person", - "email": "szilveszter.juhos@scilifelab.se", - "name": "Szilveszter Juhos" + "name": "Oskar Wacker", + "url": "https://github.com/WackerO" + }, + { + "@id": "https://orcid.org/0000-0002-3350-3443", + "@type": "Person", + "name": "Pall Olason", + "url": "https://github.com/pallolason" + }, + { + "@id": "https://orcid.org/0000-0003-3966-8481", + "@type": "Person", + "email": "pcantalupo@gmail.com", + "name": "Paul Cantalupo", + "url": "https://github.com/pcantalupo" + }, + { + "@id": "#14924136-a73b-406c-91eb-5f10620ea097", + "@type": "Person", + "affiliation": "Seqera", + "email": "phil.ewels@scilifelab.se", + "name": "Phil Ewels", + "url": "https://github.com/ewels" + }, + { + "@id": "https://orcid.org/0000-0003-0148-9787", + "@type": "Person", + "email": "33838+lindenb@users.noreply.github.com", + "name": "Pierre Lindenbaum", + "url": "https://github.com/lindenb" }, { "@id": "https://orcid.org/0000-0003-0603-7907", "@type": "Person", "email": "sabrina.krakau.qbic@gmail.com", - "name": "Sabrina Krakau" + "name": "Sabrina Krakau", + "url": "https://github.com/skrakau" }, { - "@id": "#53608000+lescai@users.noreply.github.com", + "@id": "#1724fe39-c41b-49b9-8525-d7df86b20b98", "@type": "Person", - "email": "53608000+lescai@users.noreply.github.com", - "name": "Francesco L" + "email": "sminot@gmail.com", + "name": "Sam Minot", + "url": "https://github.com/sminot" }, { - "@id": "https://orcid.org/0000-0002-6503-2180", + "@id": "https://orcid.org/0000-0002-9759-2211", "@type": "Person", - "email": "apeltzer@users.noreply.github.com", - "name": "Alexander Peltzer" + "name": "Sebastian DiLorenzo", + "url": "https://github.com/Sebastian-D" }, { - "@id": "#adr.lar@me.com", + "@id": "https://orcid.org/0000-0002-2798-9870", "@type": "Person", - "email": "adr.lar@me.com", - "name": "Adrian Larkeryd" + "name": "Silvia Morini", + "url": "https://github.com/silviamorins" }, { - "@id": "https://orcid.org/0009-0001-9875-5262", + "@id": "https://orcid.org/0000-0002-1680-5538", "@type": "Person", - "email": "friederike.hanssen@seqera.io", - "name": "Friederike Hanssen" + "affiliation": "NeoGenomics Laboratories", + "email": "24893913+SPPearce@users.noreply.github.com", + "name": "Simon Pearce", + "url": "https://github.com/SPPearce" }, { - "@id": "https://orcid.org/0009-0007-7860-1155", + "@id": "https://orcid.org/0000-0002-0554-5443", "@type": "Person", - "email": "nh13@users.noreply.github.com", - "name": "Nils Homer" + "name": "Solenne Correard", + "url": "https://github.com/scorreard" + }, + { + "@id": "https://orcid.org/0009-0001-9152-7291", + "@type": "Person", + "name": "Susanne Jodoin", + "url": "https://github.com/SusiJo" + }, + { + "@id": "#08187f11-d51b-40f0-b09d-a1ff8bf52d45", + "@type": "Person", + "name": "Tobias Koch", + "url": "https://github.com/KochTobi" + }, + { + "@id": "#30622e12-b2e6-43e8-99ed-b07a5cf40165", + "@type": "Person", + "name": "Winni Kretzschmar", + "url": "https://github.com/winni2k" }, { - "@id": "https://orcid.org/0000-0002-5762-6253", + "@id": "https://orcid.org/0009-0009-0647-7639", "@type": "Person", - "email": "bounlu@gmail.com", - "name": "Ömer An" + "email": "158295213+Patricie34@users.noreply.github.com", + "name": "Patricie Skaláková", + "url": "https://github.com/Patricie34" } ] } \ No newline at end of file From e219d7bcd6357ea811997b33222fe00b7ddea0b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Famke=20B=C3=A4uerle?= <45968370+famosab@users.noreply.github.com> Date: Mon, 6 Jul 2026 10:39:47 +0200 Subject: [PATCH 02/27] Add varlociraptor/filterfdr, update varlociraptor (#2208) ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [x] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [x] `CHANGELOG.md` is updated. - [ ] `README.md` is updated (including new tool citations and authors/contributors). --- CHANGELOG.md | 17 ++++- conf/modules/freebayes.config | 3 +- conf/modules/varlociraptor.config | 27 ++++++- docs/usage.md | 4 +- main.nf | 5 ++ modules.json | 11 ++- .../callvariants/environment.yml | 2 +- .../varlociraptor/callvariants/main.nf | 6 +- .../environment.yml | 2 +- .../estimatealignmentproperties/main.nf | 6 +- .../varlociraptor/filterfdr/environment.yml | 8 ++ .../nf-core/varlociraptor/filterfdr/main.nf | 40 ++++++++++ .../nf-core/varlociraptor/filterfdr/meta.yml | 76 +++++++++++++++++++ .../varlociraptor/preprocess/environment.yml | 2 +- .../nf-core/varlociraptor/preprocess/main.nf | 6 +- nextflow.config | 4 + nextflow_schema.json | 20 +++++ .../local/post_variantcalling/main.nf | 26 ++++--- .../local/vcf_varlociraptor_single/main.nf | 9 ++- .../local/vcf_varlociraptor_somatic/main.nf | 9 ++- tests/postprocess_varlociraptor.nf.test.snap | 57 ++++++++------ tests/variant_calling_all.nf.test.snap | 20 ++--- tests/variant_calling_freebayes.nf.test.snap | 34 ++++----- workflows/sarek/main.nf | 11 ++- 24 files changed, 315 insertions(+), 90 deletions(-) create mode 100644 modules/nf-core/varlociraptor/filterfdr/environment.yml create mode 100644 modules/nf-core/varlociraptor/filterfdr/main.nf create mode 100644 modules/nf-core/varlociraptor/filterfdr/meta.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 88b429de3f..37b5bdc04d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [#2208](https://github.com/nf-core/sarek/pull/2208) - Add varlociraptor/filterfdr + ### Changed ### Fixed @@ -17,8 +19,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Dependencies - modules -| Dependency | Old version | New version | -| ---------- | ----------- | ----------- | +| Dependency | Old version | New version | +| ------------- | ----------- | ----------- | +| varlociraptor | 8.9.3 | 8.9.5 | ### Dependencies - plugins @@ -27,8 +30,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameters -| Params | status | -| ------ | ------ | +| Params | status | +| ----------------------------------- | ------ | +| `--varlociraptor_events_germline` | New | +| `--varlociraptor_events_somatic,` | New | +| `--varlociraptor_events_tumor_only` | New | +| `--varlociraptor_fdr` | New | ### Developer section @@ -42,6 +49,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Fixed +- [#2208](https://github.com/nf-core/sarek/pull/2208) - Update freebayes params (remove `--pooled-discrete` and change `--min-alternate-fraction` from 0.03 to 0.01), move chunk_size param + #### Removed ## [3.9.0](https://github.com/nf-core/sarek/releases/tag/3.9.0) - Sarvesjåhkå diff --git a/conf/modules/freebayes.config b/conf/modules/freebayes.config index 1fcfc7de9b..7a1ec2a1c5 100644 --- a/conf/modules/freebayes.config +++ b/conf/modules/freebayes.config @@ -73,11 +73,10 @@ process { // PAIR_VARIANT_CALLING withName: '.*:BAM_VARIANT_CALLING_SOMATIC_ALL:BAM_VARIANT_CALLING_FREEBAYES:FREEBAYES' { ext.args = { "--pooled-continuous \ - --pooled-discrete \ --genotype-qualities \ --report-genotype-likelihood-max \ --allele-balance-priors-off \ - --min-alternate-fraction 0.03 \ + --min-alternate-fraction 0.01 \ --min-repeat-entropy 1 \ --min-alternate-count 2 " } } diff --git a/conf/modules/varlociraptor.config b/conf/modules/varlociraptor.config index 029fb40fde..575a2bf336 100644 --- a/conf/modules/varlociraptor.config +++ b/conf/modules/varlociraptor.config @@ -76,7 +76,14 @@ process { withName: '.*:VCF_VARLOCIRAPTOR_GERMLINE:CONCAT_CALLED_CHUNKS' { ext.prefix = { "${meta.id}.${meta.variantcaller}.germline.varlociraptor.concat" } - ext.args = { '--allow-overlaps --output-type z' } + ext.args = { '--allow-overlaps --output-type b' } + publishDir = [ + enabled: false + ] + } + + withName: '.*:VCF_VARLOCIRAPTOR_GERMLINE:VARLOCIRAPTOR_FILTERFDR' { + ext.prefix = { "${meta.id}.${meta.variantcaller}.germline.varlociraptor.filtered" } publishDir = [ enabled: false ] @@ -94,7 +101,14 @@ process { withName: '.*:VCF_VARLOCIRAPTOR_TUMOR_ONLY:CONCAT_CALLED_CHUNKS' { ext.prefix = { "${meta.id}.${meta.variantcaller}.tumor_only.varlociraptor.concat" } - ext.args = { '--allow-overlaps --output-type z' } + ext.args = { '--allow-overlaps --output-type b' } + publishDir = [ + enabled: false + ] + } + + withName: '.*:VCF_VARLOCIRAPTOR_TUMOR_ONLY:VARLOCIRAPTOR_FILTERFDR' { + ext.prefix = { "${meta.id}.${meta.variantcaller}.tumor_only.varlociraptor.filtered" } publishDir = [ enabled: false ] @@ -189,7 +203,14 @@ process { withName: '.*:VCF_VARLOCIRAPTOR_SOMATIC:CONCAT_CALLED_CHUNKS' { ext.prefix = { "${meta.id}.${meta.variantcaller}.somatic.varlociraptor.concat" } - ext.args = { '--allow-overlaps --output-type z' } + ext.args = { '--allow-overlaps --output-type b' } + publishDir = [ + enabled: false + ] + } + + withName: '.*:VCF_VARLOCIRAPTOR_SOMATIC:VARLOCIRAPTOR_FILTERFDR' { + ext.prefix = { "${meta.id}.${meta.variantcaller}.somatic.varlociraptor.filtered" } publishDir = [ enabled: false ] diff --git a/docs/usage.md b/docs/usage.md index cab540e8b5..3748327f43 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -652,7 +652,7 @@ This list is by no means exhaustive and it will depend on the specific analysis | [ASCAT](https://github.com/VanLoo-lab/ascat) | x | x | - | - | - | x | | [CNVKit](https://cnvkit.readthedocs.io/en/stable/) | x | x | - | x | x | x | | [Control-FREEC](https://github.com/BoevaLab/FREEC) | x | x | x | - | x | x | -| [MSIsensor2](https://github.com/niu-lab/msisensor2) | x | x | x | - | X | - | +| [MSIsensor2](https://github.com/niu-lab/msisensor2) | x | x | x | - | x | - | | [MSIsensorPro](https://github.com/xjtu-omics/msisensor-pro) | x | x | x | - | - | x | | [Varlociraptor](https://varlociraptor.github.io/landing/) | x | x | x | x | x | x | @@ -904,6 +904,8 @@ Varlociraptor allows the usage of different scenario files, a few examples can b You can control the number of chunks that the candidate VCF file is split into by `--varlociraptor_chunk_size `, it is set to reasonable default (15) but more chunks might aid in accelerating your workflow run if you can run more processes in parallel. +Varlociraptor by default just returns all candidate variants annotated with probabilities. The variants need to be filtered to yield a representativ result, see the [docs](https://varlociraptor.github.io/docs/filtering/) for more info. In sarek this is implemented with default set events related to the scenario files which used by default. If you use your own scenario file please adapt the events accordingly by using the flags `--varlociraptor_events_tumor_only`, `--varlociraptor_events_somatic` and `--varlociraptor_events_germline`. The events need to be supplied as a list with spaces between the events. Filtering also depends on the False Discovery Rate (FDR) in sarek we opted for a default of filtering in `--mode local-smart` to a FDR of 5% with `--fdr 0.05`. The FDR can be controlled by `--varlociraptor_fdr`. + ## Spark related issues If you have problems running processes that make use of Spark such as `MarkDuplicates`. diff --git a/main.nf b/main.nf index 679b530688..7506eec94a 100755 --- a/main.nf +++ b/main.nf @@ -322,6 +322,11 @@ workflow NFCORE_SAREK { PREPARE_GENOME.out.pon, PREPARE_GENOME.out.pon_tbi, params.sentieon_dnascope_model ? channel.fromPath(params.sentieon_dnascope_model).collect() : channel.value([]), + params.varlociraptor_chunk_size, + params.varlociraptor_events_germline, + params.varlociraptor_events_somatic, + params.varlociraptor_events_tumor_only, + params.varlociraptor_fdr, params.varlociraptor_scenario_germline ? channel.fromPath(params.varlociraptor_scenario_germline).map { it -> [[id: it.baseName - '.yte'], it] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect(), params.varlociraptor_scenario_somatic ? channel.fromPath(params.varlociraptor_scenario_somatic).map { it -> [[id: it.baseName - '.yte'], it] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect(), params.varlociraptor_scenario_tumor_only ? channel.fromPath(params.varlociraptor_scenario_tumor_only).map { it -> [[id: it.baseName - '.yte'], it] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect(), diff --git a/modules.json b/modules.json index 9571d81942..ca3721a53e 100644 --- a/modules.json +++ b/modules.json @@ -573,17 +573,22 @@ }, "varlociraptor/callvariants": { "branch": "master", - "git_sha": "5ae3c74e09c529c5c768aa89397e490ba4728219", + "git_sha": "289374af2f576e1040db10c42759c4a4804ffeb5", "installed_by": ["modules"] }, "varlociraptor/estimatealignmentproperties": { "branch": "master", - "git_sha": "5ae3c74e09c529c5c768aa89397e490ba4728219", + "git_sha": "289374af2f576e1040db10c42759c4a4804ffeb5", + "installed_by": ["modules"] + }, + "varlociraptor/filterfdr": { + "branch": "master", + "git_sha": "289374af2f576e1040db10c42759c4a4804ffeb5", "installed_by": ["modules"] }, "varlociraptor/preprocess": { "branch": "master", - "git_sha": "5ae3c74e09c529c5c768aa89397e490ba4728219", + "git_sha": "289374af2f576e1040db10c42759c4a4804ffeb5", "installed_by": ["modules"] }, "vcflib/vcffilter": { diff --git a/modules/nf-core/varlociraptor/callvariants/environment.yml b/modules/nf-core/varlociraptor/callvariants/environment.yml index 4cfd4a7d5a..107e4ae225 100644 --- a/modules/nf-core/varlociraptor/callvariants/environment.yml +++ b/modules/nf-core/varlociraptor/callvariants/environment.yml @@ -5,4 +5,4 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/varlociraptor - - bioconda::varlociraptor=8.9.3 + - bioconda::varlociraptor=8.9.5 diff --git a/modules/nf-core/varlociraptor/callvariants/main.nf b/modules/nf-core/varlociraptor/callvariants/main.nf index fc24cb5ab4..0799717231 100644 --- a/modules/nf-core/varlociraptor/callvariants/main.nf +++ b/modules/nf-core/varlociraptor/callvariants/main.nf @@ -3,9 +3,9 @@ process VARLOCIRAPTOR_CALLVARIANTS { 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/9a/9ac0825c21b2cbaf9535ffe443e53a0bb4d61596cafcb5a5b444dfb31b945ab2/data' - : 'community.wave.seqera.io/library/varlociraptor:8.9.3--fa2ce5da2782669c'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/varlociraptor%3A8.9.5--h24073b4_0' + : 'quay.io/biocontainers/varlociraptor:8.9.5--h24073b4_0'}" input: tuple val(meta), path(vcfs), path(scenario), val(scenario_aliases) diff --git a/modules/nf-core/varlociraptor/estimatealignmentproperties/environment.yml b/modules/nf-core/varlociraptor/estimatealignmentproperties/environment.yml index 4cfd4a7d5a..107e4ae225 100644 --- a/modules/nf-core/varlociraptor/estimatealignmentproperties/environment.yml +++ b/modules/nf-core/varlociraptor/estimatealignmentproperties/environment.yml @@ -5,4 +5,4 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/varlociraptor - - bioconda::varlociraptor=8.9.3 + - bioconda::varlociraptor=8.9.5 diff --git a/modules/nf-core/varlociraptor/estimatealignmentproperties/main.nf b/modules/nf-core/varlociraptor/estimatealignmentproperties/main.nf index ea786c54b9..3a52b178ee 100644 --- a/modules/nf-core/varlociraptor/estimatealignmentproperties/main.nf +++ b/modules/nf-core/varlociraptor/estimatealignmentproperties/main.nf @@ -3,9 +3,9 @@ process VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES { 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/9a/9ac0825c21b2cbaf9535ffe443e53a0bb4d61596cafcb5a5b444dfb31b945ab2/data' - : 'community.wave.seqera.io/library/varlociraptor:8.9.3--fa2ce5da2782669c'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/varlociraptor%3A8.9.5--h24073b4_0' + : 'quay.io/biocontainers/varlociraptor:8.9.5--h24073b4_0'}" input: tuple val(meta), path(bam), path(bai), path(fasta), path(fai) diff --git a/modules/nf-core/varlociraptor/filterfdr/environment.yml b/modules/nf-core/varlociraptor/filterfdr/environment.yml new file mode 100644 index 0000000000..107e4ae225 --- /dev/null +++ b/modules/nf-core/varlociraptor/filterfdr/environment.yml @@ -0,0 +1,8 @@ +--- +# 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/varlociraptor + - bioconda::varlociraptor=8.9.5 diff --git a/modules/nf-core/varlociraptor/filterfdr/main.nf b/modules/nf-core/varlociraptor/filterfdr/main.nf new file mode 100644 index 0000000000..0f8359511a --- /dev/null +++ b/modules/nf-core/varlociraptor/filterfdr/main.nf @@ -0,0 +1,40 @@ +process VARLOCIRAPTOR_FILTERFDR { + tag "${meta.id}" + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/varlociraptor%3A8.9.5--h24073b4_0' + : 'quay.io/biocontainers/varlociraptor:8.9.5--h24073b4_0'}" + + input: + tuple val(meta), path(vcf), val(events), val(fdr) + + output: + tuple val(meta), path("*.bcf"), emit: bcf + tuple val("${task.process}"), val('varlociraptor'), eval("varlociraptor --version | sed 's/^varlociraptor //'"), topic: versions, emit: versions_varlociraptor + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}.fdr-controlled" + def mode = args.contains("--mode global-smart") ? "global-smart" : "local-smart" + def args_corrected = args.replace('--mode global-smart', '').replace('--mode local-smart', '').trim() + """ + varlociraptor filter-calls control-fdr \\ + --mode ${mode} \\ + ${vcf} \\ + --events ${events} \\ + --fdr ${fdr} \\ + ${args_corrected} \\ + > ${prefix}.bcf + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}.fdr-controlled" + """ + touch ${prefix}.bcf + """ +} diff --git a/modules/nf-core/varlociraptor/filterfdr/meta.yml b/modules/nf-core/varlociraptor/filterfdr/meta.yml new file mode 100644 index 0000000000..51d59c1431 --- /dev/null +++ b/modules/nf-core/varlociraptor/filterfdr/meta.yml @@ -0,0 +1,76 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "varlociraptor_filterfdr" +description: Filter Varlociraptor variant calls using FDR control. +keywords: + - varlociraptor + - vcf + - bcf + - fdr + - variant filtering +tools: + - "varlociraptor": + description: "Flexible, uncertainty-aware variant calling with parameter free + filtration via FDR control." + homepage: "https://varlociraptor.github.io/docs/estimating/" + documentation: "https://varlociraptor.github.io/docs/estimating/" + tool_dev_url: "https://github.com/varlociraptor/varlociraptor" + doi: "10.1186/s13059-020-01993-6" + licence: ["GPL v3"] + identifier: biotools:varlociraptor +input: + - - meta: + type: map + description: | + Groovy Map containing sample information. + e.g. `[ id:'sample1' ]` + - vcf: + type: file + description: Variant calls to be filtered. + pattern: "*.{vcf,vcf.gz,bcf}" + ontologies: + - edam: "http://edamontology.org/format_3016" # VCF + - edam: "http://edamontology.org/format_2572" # BCF + - events: + type: string + description: Event(s) of interest passed to `--events`. + - fdr: + type: float + description: False discovery rate threshold passed to `--fdr`. +output: + bcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bcf": + type: file + description: BCF file containing fdr-controlled calls + pattern: "*.bcf" + ontologies: + - edam: http://edamontology.org/format_3020 # BCF + versions_varlociraptor: + - - ${task.process}: + type: string + description: The process the versions were collected from + - varlociraptor: + type: string + description: The tool name + - "varlociraptor --version | sed 's/^varlociraptor //'": + type: eval + 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 + - varlociraptor: + type: string + description: The tool name + - "varlociraptor --version | sed 's/^varlociraptor //'": + type: eval + description: The command used to generate the version of the tool +authors: + - "@famosab" +maintainers: + - "@famosab" diff --git a/modules/nf-core/varlociraptor/preprocess/environment.yml b/modules/nf-core/varlociraptor/preprocess/environment.yml index 4cfd4a7d5a..107e4ae225 100644 --- a/modules/nf-core/varlociraptor/preprocess/environment.yml +++ b/modules/nf-core/varlociraptor/preprocess/environment.yml @@ -5,4 +5,4 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/varlociraptor - - bioconda::varlociraptor=8.9.3 + - bioconda::varlociraptor=8.9.5 diff --git a/modules/nf-core/varlociraptor/preprocess/main.nf b/modules/nf-core/varlociraptor/preprocess/main.nf index 4fabdbfdf1..5d71b94b86 100644 --- a/modules/nf-core/varlociraptor/preprocess/main.nf +++ b/modules/nf-core/varlociraptor/preprocess/main.nf @@ -3,9 +3,9 @@ process VARLOCIRAPTOR_PREPROCESS { 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/9a/9ac0825c21b2cbaf9535ffe443e53a0bb4d61596cafcb5a5b444dfb31b945ab2/data' - : 'community.wave.seqera.io/library/varlociraptor:8.9.3--fa2ce5da2782669c'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/varlociraptor%3A8.9.5--h24073b4_0' + : 'quay.io/biocontainers/varlociraptor:8.9.5--h24073b4_0'}" input: tuple val(meta), path(bam), path(bai), path(candidates), path(alignment_json), path(fasta), path(fai) diff --git a/nextflow.config b/nextflow.config index f778ed037b..d8e204796f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -94,6 +94,10 @@ params { // Post variant calling varlociraptor_chunk_size = 15 // default chunk size for Varlociraptor + varlociraptor_events_tumor_only = "somatic_tumor_high somatic_tumor_low" // uses default events defined in used scenario file + varlociraptor_events_somatic = "somatic_tumor_high somatic_tumor_low" // uses default events defined in used scenario file + varlociraptor_events_germline = "germline" // uses default events defined in used scenario file + varlociraptor_fdr = 0.05 // default fdr for post-calling filtering varlociraptor_scenario_tumor_only = null // uses default scenario in assets/varlociraptor_tumor_only.yte.yaml varlociraptor_scenario_somatic = null // uses default scenario in assets/varlociraptor_somatic.yte.yaml varlociraptor_scenario_germline = null // uses default scenario in assets/varlociraptor_germline.yte.yaml diff --git a/nextflow_schema.json b/nextflow_schema.json index ea943adb92..f50d769634 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -554,6 +554,26 @@ "description": "Number of chunks to split the vcf-files for varlociraptor. Minimum 1, indicates no splitting", "hidden": true }, + "varlociraptor_events_tumor_only": { + "type": "string", + "default": "somatic_tumor_high somatic_tumor_low", + "description": "Events to consider for FDR filtering for tumor only samples, must match events described in scenario file." + }, + "varlociraptor_events_somatic": { + "type": "string", + "default": "somatic_tumor_high somatic_tumor_low", + "description": "Events to consider for FDR filtering for somatic samples, must match events described in scenario file." + }, + "varlociraptor_events_germline": { + "type": "string", + "default": "germline", + "description": "Events to consider for FDR filtering for germline samples, must match events described in scenario file." + }, + "varlociraptor_fdr": { + "type": "number", + "default": 0.05, + "description": "The probability to be a false discovery may not exceed the given threshold." + }, "varlociraptor_scenario_tumor_only": { "type": "string", "description": "Yte compatible scenario file for tumor only samples. Defaults to assets/varlociraptor_tumor_only.yte.yaml" diff --git a/subworkflows/local/post_variantcalling/main.nf b/subworkflows/local/post_variantcalling/main.nf index 63e6a251d4..4afd0b576e 100644 --- a/subworkflows/local/post_variantcalling/main.nf +++ b/subworkflows/local/post_variantcalling/main.nf @@ -28,35 +28,39 @@ workflow POST_VARIANTCALLING { snv_consensus_calling normalize_vcfs varlociraptor_chunk_size // integer: [mandatory] [default: 15] number of chunks to split BCF files when preprocessing and calling variants + varlociraptor_events_germline + varlociraptor_events_somatic + varlociraptor_events_tumor_only + varlociraptor_fdr varlociraptor_scenario_germline varlociraptor_scenario_somatic varlociraptor_scenario_tumor_only main: - versions = Channel.empty() - vcfs = Channel.empty() - tbis = Channel.empty() + versions = channel.empty() + vcfs = channel.empty() + tbis = channel.empty() // // VARLOCIRAPTOR // if (tools && tools.split(',').contains('varlociraptor')) { // GERMLINE - VCF_VARLOCIRAPTOR_GERMLINE(cram_germline, fasta, fai, varlociraptor_scenario_germline, germline_vcfs, varlociraptor_chunk_size, 'normal') + VCF_VARLOCIRAPTOR_GERMLINE(cram_germline, fasta, fai, varlociraptor_scenario_germline, germline_vcfs, varlociraptor_chunk_size, 'normal', varlociraptor_events_germline, varlociraptor_fdr) vcfs = vcfs.mix(VCF_VARLOCIRAPTOR_GERMLINE.out.vcf) tbis = tbis.mix(VCF_VARLOCIRAPTOR_GERMLINE.out.tbi) versions = versions.mix(VCF_VARLOCIRAPTOR_GERMLINE.out.versions) // SOMATIC - VCF_VARLOCIRAPTOR_SOMATIC(cram_somatic, fasta, fai, varlociraptor_scenario_somatic, somatic_vcfs, germline_vcfs, varlociraptor_chunk_size) + VCF_VARLOCIRAPTOR_SOMATIC(cram_somatic, fasta, fai, varlociraptor_scenario_somatic, somatic_vcfs, germline_vcfs, varlociraptor_chunk_size, varlociraptor_events_somatic, varlociraptor_fdr) vcfs = vcfs.mix(VCF_VARLOCIRAPTOR_SOMATIC.out.vcf) tbis = tbis.mix(VCF_VARLOCIRAPTOR_SOMATIC.out.tbi) versions = versions.mix(VCF_VARLOCIRAPTOR_SOMATIC.out.versions) // TUMOR ONLY - VCF_VARLOCIRAPTOR_TUMOR_ONLY(cram_tumor_only, fasta, fai, varlociraptor_scenario_tumor_only, tumor_only_vcfs, varlociraptor_chunk_size, 'tumor') + VCF_VARLOCIRAPTOR_TUMOR_ONLY(cram_tumor_only, fasta, fai, varlociraptor_scenario_tumor_only, tumor_only_vcfs, varlociraptor_chunk_size, 'tumor', varlociraptor_events_tumor_only, varlociraptor_fdr) vcfs = vcfs.mix(VCF_VARLOCIRAPTOR_TUMOR_ONLY.out.vcf) tbis = tbis.mix(VCF_VARLOCIRAPTOR_TUMOR_ONLY.out.tbi) @@ -81,20 +85,20 @@ workflow POST_VARIANTCALLING { def excluded_variantcallers = ['manta', 'tiddit', 'samtools'] - all_vcfs = Channel.empty().mix(germline_vcfs, tumor_only_vcfs, somatic_vcfs) - .branch{ meta, vcf -> + all_vcfs = channel.empty().mix(germline_vcfs, tumor_only_vcfs, somatic_vcfs) + .branch{ meta, _vcf -> small: small_variantcallers.contains(meta.variantcaller) other: true } - all_tbis = Channel.empty().mix(germline_tbis, tumor_only_tbis, somatic_tbis) - .branch{ meta, tbi -> + all_tbis = channel.empty().mix(germline_tbis, tumor_only_tbis, somatic_tbis) + .branch{ meta, _tbi -> small: small_variantcallers.contains(meta.variantcaller) other: true } // Validate that we're not silently excluding unknown variant callers - all_vcfs.other.subscribe { meta, vcf -> + all_vcfs.other.subscribe { meta, _vcf -> if (!excluded_variantcallers.contains(meta.variantcaller)) { error("Variant caller '${meta.variantcaller}' is not in the small_variantcallers list and will be excluded from normalization/filtering/consensus. If this is a new SNV caller, please add it to the list in subworkflows/local/post_variantcalling/main.nf:78-80") } diff --git a/subworkflows/local/vcf_varlociraptor_single/main.nf b/subworkflows/local/vcf_varlociraptor_single/main.nf index 35d5efc228..2ba55d4af2 100644 --- a/subworkflows/local/vcf_varlociraptor_single/main.nf +++ b/subworkflows/local/vcf_varlociraptor_single/main.nf @@ -4,6 +4,7 @@ include { BCFTOOLS_SORT as SORT_FINAL_VCF } from '../../../modules/nf- include { RBT_VCFSPLIT } from '../../../modules/nf-core/rbt/vcfsplit' include { VARLOCIRAPTOR_CALLVARIANTS } from '../../../modules/nf-core/varlociraptor/callvariants' include { VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES } from '../../../modules/nf-core/varlociraptor/estimatealignmentproperties' +include { VARLOCIRAPTOR_FILTERFDR } from '../../../modules/nf-core/varlociraptor/filterfdr' include { VARLOCIRAPTOR_PREPROCESS } from '../../../modules/nf-core/varlociraptor/preprocess' include { YTE as FILL_SCENARIO_FILE } from '../../../modules/nf-core/yte' @@ -16,6 +17,8 @@ workflow VCF_VARLOCIRAPTOR_SINGLE { ch_vcf val_num_chunks val_sampletype + val_events + val_fdr main: ch_versions = channel.empty() @@ -132,7 +135,11 @@ workflow VCF_VARLOCIRAPTOR_SINGLE { ch_final_vcf = ch_sort_called_chunks_vcf.single.mix(CONCAT_CALLED_CHUNKS.out.vcf) - SORT_FINAL_VCF(ch_final_vcf) + VARLOCIRAPTOR_FILTERFDR( + ch_final_vcf.map { meta, vcf -> [ meta, vcf, val_events, val_fdr ] } + ) + + SORT_FINAL_VCF(VARLOCIRAPTOR_FILTERFDR.out.bcf) ch_versions = ch_versions.mix(SORT_FINAL_VCF.out.versions) diff --git a/subworkflows/local/vcf_varlociraptor_somatic/main.nf b/subworkflows/local/vcf_varlociraptor_somatic/main.nf index dafba72787..4ad4c80cf5 100644 --- a/subworkflows/local/vcf_varlociraptor_somatic/main.nf +++ b/subworkflows/local/vcf_varlociraptor_somatic/main.nf @@ -9,6 +9,7 @@ include { RBT_VCFSPLIT include { VARLOCIRAPTOR_CALLVARIANTS } from '../../../modules/nf-core/varlociraptor/callvariants' include { VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES as ALIGNMENTPROPERTIES_NORMAL } from '../../../modules/nf-core/varlociraptor/estimatealignmentproperties' include { VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES as ALIGNMENTPROPERTIES_TUMOR } from '../../../modules/nf-core/varlociraptor/estimatealignmentproperties' +include { VARLOCIRAPTOR_FILTERFDR } from '../../../modules/nf-core/varlociraptor/filterfdr' include { VARLOCIRAPTOR_PREPROCESS as PREPROCESS_NORMAL } from '../../../modules/nf-core/varlociraptor/preprocess' include { VARLOCIRAPTOR_PREPROCESS as PREPROCESS_TUMOR } from '../../../modules/nf-core/varlociraptor/preprocess' include { YTE as FILL_SCENARIO_FILE } from '../../../modules/nf-core/yte' @@ -22,6 +23,8 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { ch_somatic_vcf ch_germline_vcf val_num_chunks + val_events + val_fdr main: ch_versions = channel.empty() @@ -283,7 +286,11 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { ch_final_vcf = ch_sort_called_chunks_vcf.single.mix(CONCAT_CALLED_CHUNKS.out.vcf) - SORT_FINAL_VCF(ch_final_vcf) + VARLOCIRAPTOR_FILTERFDR( + ch_final_vcf.map { meta, vcf -> [ meta, vcf, val_events, val_fdr ] } + ) + + SORT_FINAL_VCF(VARLOCIRAPTOR_FILTERFDR.out.bcf) ch_versions = ch_versions.mix(SORT_FINAL_VCF.out.versions) diff --git a/tests/postprocess_varlociraptor.nf.test.snap b/tests/postprocess_varlociraptor.nf.test.snap index 53e38e3d29..c52c6f785f 100644 --- a/tests/postprocess_varlociraptor.nf.test.snap +++ b/tests/postprocess_varlociraptor.nf.test.snap @@ -1,13 +1,13 @@ { "-profile test --tools strelka,varlociraptor --input recalibrated_somatic.csv": { "content": [ - 151, + 153, { "ALIGNMENTPROPERTIES_NORMAL": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "ALIGNMENTPROPERTIES_TUMOR": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "BCFTOOLS_STATS": { "bcftools": 1.21 @@ -43,10 +43,10 @@ "mosdepth": "0.3.10" }, "PREPROCESS_NORMAL": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "PREPROCESS_TUMOR": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "RBT_VCFSPLIT": { "rbt": "0.42.2" @@ -81,13 +81,16 @@ "tabix": 1.21 }, "VARLOCIRAPTOR_CALLVARIANTS": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" + }, + "VARLOCIRAPTOR_FILTERFDR": { + "varlociraptor": "8.9.5" }, "VARLOCIRAPTOR_PREPROCESS": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -305,8 +308,8 @@ "sample4_vs_sample3.strelka.merged.vcf.gz:md5,ecbb04bc2a4f802cac75f232d263ebe8" ], [ - "sample3.strelka.germline.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=53245, phased=true, phasedAutodetect=false]", - "sample4_vs_sample3.strelka.somatic.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[chr21], sampleCount=2, variantCount=54634, phased=true, phasedAutodetect=false]" + "sample3.strelka.germline.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=65, phased=true, phasedAutodetect=false]", + "sample4_vs_sample3.strelka.somatic.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[chr21], sampleCount=2, variantCount=122, phased=true, phasedAutodetect=false]" ], "No warnings" ], @@ -314,11 +317,11 @@ "nf-test": "0.9.3", "nextflow": "25.10.4" }, - "timestamp": "2025-11-02T16:48:49.54626" + "timestamp": "2026-06-12T14:56:17.705455093" }, "-profile test --tools mutect2,varlociraptor --input recalibrated_tumoronly.csv": { "content": [ - 72, + 73, { "BCFTOOLS_STATS": { "bcftools": 1.21 @@ -383,13 +386,16 @@ "tabix": "1.21" }, "VARLOCIRAPTOR_CALLVARIANTS": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" + }, + "VARLOCIRAPTOR_FILTERFDR": { + "varlociraptor": "8.9.5" }, "VARLOCIRAPTOR_PREPROCESS": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -563,7 +569,7 @@ "sample2.mutect2.vcf.gz:md5,a53450657afc33f2a7b87fd75bf24267" ], [ - "sample2.mutect2.tumor_only.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[chr21], sampleCount=2, variantCount=1258, phased=true, phasedAutodetect=false]" + "sample2.mutect2.tumor_only.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[], sampleCount=2, variantCount=0, phased=true, phasedAutodetect=true]" ], "No warnings" ], @@ -571,11 +577,11 @@ "nf-test": "0.9.3", "nextflow": "25.10.4" }, - "timestamp": "2025-11-04T11:46:27.501146" + "timestamp": "2026-06-12T15:01:23.802458652" }, "-profile test --tools strelka,varlociraptor --input recalibrated_germline.csv": { "content": [ - 67, + 68, { "BCFTOOLS_STATS": { "bcftools": 1.21 @@ -628,13 +634,16 @@ "tabix": 1.21 }, "VARLOCIRAPTOR_CALLVARIANTS": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" + }, + "VARLOCIRAPTOR_FILTERFDR": { + "varlociraptor": "8.9.5" }, "VARLOCIRAPTOR_PREPROCESS": { - "varlociraptor": "8.9.3" + "varlociraptor": "8.9.5" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -796,7 +805,7 @@ "sample1.strelka.variants.vcf.gz:md5,5af34e7b632f604dc7a224f977fc2898" ], [ - "sample1.strelka.germline.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=53245, phased=true, phasedAutodetect=false]" + "sample1.strelka.germline.varlociraptor.vcf.gz:summary,VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=65, phased=true, phasedAutodetect=false]" ], "No warnings" ], @@ -804,6 +813,6 @@ "nf-test": "0.9.3", "nextflow": "25.10.4" }, - "timestamp": "2025-11-01T23:04:58.277878" + "timestamp": "2026-06-12T14:45:50.699233572" } -} +} \ No newline at end of file diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index e8538b2abf..4962e9e856 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -527,7 +527,7 @@ "test.bcftools.bcftools_stats.txt:md5,4b2997064fb500f090639edca1ccaa6e", "test.deepvariant.bcftools_stats.txt:md5,61ab450ed778088b9c879b8dcbbb9db8", "test.freebayes.filtered.bcftools_stats.txt:md5,dde124ceaf6f109cd274b837b950096b", - "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,6f942caec2f4f02c69e1216226fa44a9", + "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,189bc07d38c2a9ae34b141cff402bda6", "test.strelka.variants.bcftools_stats.txt:md5,2613827870dd789fe602a8a3b739b7f2", "test2_vs_test.strelka.somatic_indels.bcftools_stats.txt:md5,5e8f9a8fdbc765ced736d0c8c7dd3a52", "test2_vs_test.strelka.somatic_snvs.bcftools_stats.txt:md5,edb7763fad7b6f825e47e01ffa70adbc", @@ -559,7 +559,7 @@ "test.deepvariant.TsTv.count:md5,d3c138521fd95eb45f6e495f39d47404", "test.freebayes.filtered.FILTER.summary:md5,87e753ba2ad969475fb55661852f75e0", "test.freebayes.filtered.TsTv.count:md5,845f64e5bb4224af98f3a47294cd5483", - "test2_vs_test.freebayes.filtered.FILTER.summary:md5,126e83dcd37b82420f7c5d7b235479f1", + "test2_vs_test.freebayes.filtered.FILTER.summary:md5,1f06f857e3576c6a98c32d1e7f51f456", "test2_vs_test.freebayes.filtered.TsTv.count:md5,28919c7d29c998681391d2027af3e0f9", "test.strelka.variants.FILTER.summary:md5,dd87f507da7de20d5318841af312493b", "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", @@ -612,7 +612,7 @@ ], [ "test2_vs_test.freebayes.vcf.gz", - "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1447, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1453, phased=false, phasedAutodetect=false]" ] ], [ @@ -637,9 +637,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" }, - "timestamp": "2026-01-08T16:27:17.419740053" + "timestamp": "2026-06-12T16:20:15.694178204" }, "-profile test --input tests/csv/3.0/fastq_single.csv --tools cnvkit,deepvariant,freebayes,mpileup,strelka,tiddit": { "content": [ @@ -1132,9 +1132,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" }, - "timestamp": "2026-01-08T12:49:19.475669979" + "timestamp": "2026-06-12T16:23:41.706393706" }, "-profile test --input tests/csv/3.0/fastq_tumor_only.csv --tools cnvkit,freebayes,mpileup,mutect2,tiddit": { "content": [ @@ -1590,8 +1590,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" }, - "timestamp": "2026-01-08T14:32:16.644778218" + "timestamp": "2026-06-12T16:16:13.675589663" } -} +} \ No newline at end of file diff --git a/tests/variant_calling_freebayes.nf.test.snap b/tests/variant_calling_freebayes.nf.test.snap index 63fb88199e..79e58083b4 100644 --- a/tests/variant_calling_freebayes.nf.test.snap +++ b/tests/variant_calling_freebayes.nf.test.snap @@ -555,7 +555,7 @@ "samtools_alignment_plot.txt:md5,8e6178a26fe2a4fc4f45fac3175ba6c6", "samtools_insert_size.txt:md5,c4b5c78eeb30a8c926d1bd9506882516", "test.freebayes.filtered.bcftools_stats.txt:md5,dde124ceaf6f109cd274b837b950096b", - "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,6f942caec2f4f02c69e1216226fa44a9", + "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,189bc07d38c2a9ae34b141cff402bda6", "test.md.mosdepth.global.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.md.mosdepth.summary.txt:md5,0010c2396a3173c7cf4983abe2eb6a4c", "test.md.per-base.bed.gz:md5,34dfe443c0a0767562dd65272e3310ef", @@ -574,7 +574,7 @@ "test2.recal.per-base.bed.gz.csi:md5,4205a09ede17cdbdaad45e3553f73105", "test.freebayes.filtered.FILTER.summary:md5,87e753ba2ad969475fb55661852f75e0", "test.freebayes.filtered.TsTv.count:md5,845f64e5bb4224af98f3a47294cd5483", - "test2_vs_test.freebayes.filtered.FILTER.summary:md5,126e83dcd37b82420f7c5d7b235479f1", + "test2_vs_test.freebayes.filtered.FILTER.summary:md5,1f06f857e3576c6a98c32d1e7f51f456", "test2_vs_test.freebayes.filtered.TsTv.count:md5,28919c7d29c998681391d2027af3e0f9" ], "No BAM files", @@ -591,7 +591,7 @@ ], [ "test2_vs_test.freebayes.vcf.gz", - "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1447, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=1453, phased=false, phasedAutodetect=false]" ] ], [ @@ -601,7 +601,7 @@ ], [ "test2_vs_test.freebayes.filtered.vcf.gz", - "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=137, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=125, phased=false, phasedAutodetect=false]" ] ], [ @@ -611,9 +611,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" }, - "timestamp": "2025-12-15T22:43:02.382544129" + "timestamp": "2026-06-12T11:36:14.240620697" }, "-profile test --tools freebayes --wes --nucleotides_per_second 20": { "content": [ @@ -980,9 +980,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" }, - "timestamp": "2025-12-15T22:35:44.029764132" + "timestamp": "2026-06-12T11:27:28.609439333" }, "-profile test --tools freebayes --no_intervals": { "content": [ @@ -1331,9 +1331,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" }, - "timestamp": "2025-12-15T22:38:03.564960868" + "timestamp": "2026-06-12T11:30:11.341607202" }, "-profile test --tools freebayes --no_intervals --input recalibrated_tumoronly.csv": { "content": [ @@ -1903,7 +1903,7 @@ "samtools_alignment_plot.txt:md5,89d0a6e7076223e9feadbecd794948d5", "samtools_insert_size.txt:md5,ca54b785b1d63edd61cef58cd5558aa2", "test.freebayes.filtered.bcftools_stats.txt:md5,b313075b3e9854e0b561dd8d754bf097", - "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,17df64b64f9235afa93aae6bbe08e283", + "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,42d0644fc84df43b26e8de1ad427b446", "test.md.mosdepth.global.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.md.mosdepth.region.dist.txt:md5,835fdc6fa52cc33e6fb76c0c20a8a6c3", "test.md.mosdepth.summary.txt:md5,dcc9ab2bf3248903e02d8da87e678977", @@ -1934,7 +1934,7 @@ "test2.recal.regions.bed.gz.csi:md5,c6d1ac97ef4dfe43731c8368d8391cab", "test.freebayes.filtered.FILTER.summary:md5,449597c35ada505b4cb2530d5260e9d5", "test.freebayes.filtered.TsTv.count:md5,162253eb6c406300678985b3ac7dc868", - "test2_vs_test.freebayes.filtered.FILTER.summary:md5,0ae7467f2311c1382173d70d8d7efb0b", + "test2_vs_test.freebayes.filtered.FILTER.summary:md5,b3cdcab0fb3a666b40ef76c4193ff7f8", "test2_vs_test.freebayes.filtered.TsTv.count:md5,9dc940f98dae9c0b49c9468a491836d4" ], "No BAM files", @@ -1951,12 +1951,12 @@ ], [ "test2_vs_test.freebayes.vcf.gz", - "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=966, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr22], sampleCount=2, variantCount=988, phased=false, phasedAutodetect=false]" ] ], [ "test.freebayes.filtered.vcf.gz:md5,c4793897a38d6781dc512a52d9046be5", - "test2_vs_test.freebayes.filtered.vcf.gz:md5,d1d0916fc56a666bd7637792047b82f8" + "test2_vs_test.freebayes.filtered.vcf.gz:md5,6da8e1304355fedec62419d5ae1a402c" ], [ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998513#1/1", @@ -1965,8 +1965,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.4" }, - "timestamp": "2025-12-15T22:40:36.195304962" + "timestamp": "2026-06-12T11:33:20.327931788" } -} +} \ No newline at end of file diff --git a/workflows/sarek/main.nf b/workflows/sarek/main.nf index 29bffe1f24..06bb7d9ff8 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek/main.nf @@ -107,6 +107,11 @@ workflow SAREK { pon pon_tbi sentieon_dnascope_model + varlociraptor_chunk_size + varlociraptor_events_germline + varlociraptor_events_somatic + varlociraptor_events_tumor_only + varlociraptor_fdr varlociraptor_scenario_germline varlociraptor_scenario_somatic varlociraptor_scenario_tumor_only @@ -531,7 +536,11 @@ workflow SAREK { params.filter_vcfs, params.snv_consensus_calling, params.normalize_vcfs, - params.varlociraptor_chunk_size, + varlociraptor_chunk_size, + varlociraptor_events_germline, + varlociraptor_events_somatic, + varlociraptor_events_tumor_only, + varlociraptor_fdr, varlociraptor_scenario_germline, varlociraptor_scenario_somatic, varlociraptor_scenario_tumor_only, From bd02bf289d768167a399807fcfc15e5e2582f4b9 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Wed, 8 Jul 2026 15:25:38 +0200 Subject: [PATCH 03/27] Update EnsemblVEP to 116.0 (#2229) --- CHANGELOG.md | 9 +++++ conf/igenomes.config | 6 +-- docs/DEVELOPER_GUIDELINES.md | 6 +++ modules.json | 4 +- .../ensemblvep/download/environment.yml | 2 +- modules/nf-core/ensemblvep/download/main.nf | 4 +- .../nf-core/ensemblvep/vep/environment.yml | 2 +- modules/nf-core/ensemblvep/vep/main.nf | 4 +- nextflow.config | 2 +- nextflow_schema.json | 2 +- nf-test.config | 2 +- tests/annotation_merge.nf.test.snap | 20 +++++----- tests/annotation_vep.nf.test | 1 + tests/annotation_vep.nf.test.snap | 9 +++-- tests/lib/UTILS.groovy | 40 +++++++++++-------- tests/samplesheets.nf.test.snap | 3 +- 16 files changed, 71 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37b5bdc04d..517dfd8eab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [#2229](https://github.com/nf-core/sarek/pull/2229) - Update EnsemblVEP to 116.0 + ### Fixed ### Removed @@ -22,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | Dependency | Old version | New version | | ------------- | ----------- | ----------- | | varlociraptor | 8.9.3 | 8.9.5 | +| ensembl-vep | 115.2 | 116.0 | ### Dependencies - plugins @@ -37,6 +40,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `--varlociraptor_events_tumor_only` | New | | `--varlociraptor_fdr` | New | +| Parameter | Old default | New default | +| ----------- | ----------- | ----------- | +| vep_version | 115.2-1 | 116.0-0 | + ### Developer section #### Added @@ -46,10 +53,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Changed - [#2225](https://github.com/nf-core/sarek/pull/2225) - Back to dev (3.9.1dev) +- [#2229](https://github.com/nf-core/sarek/pull/2229) - Update nft-utils to 1.0.0, migrate `getAllFilesFromDir` to `getAllFilesFromPath` in test utilities #### Fixed - [#2208](https://github.com/nf-core/sarek/pull/2208) - Update freebayes params (remove `--pooled-discrete` and change `--min-alternate-fraction` from 0.03 to 0.01), move chunk_size param +- [#2229](https://github.com/nf-core/sarek/pull/2229) - Fix LoFTEE test to validate CSQ fields instead of asserting nothing #### Removed diff --git a/conf/igenomes.config b/conf/igenomes.config index b665518af5..e47fef8c2e 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -77,7 +77,7 @@ params { pon_tbi = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/GATKBundle/1000g_pon.hg38.vcf.gz.tbi" sentieon_dnascope_model = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/Sentieon/SentieonDNAscopeModel1.1.model" snpeff_db = 'GRCh38.99' - vep_cache_version = '115' + vep_cache_version = '116' vep_genome = 'GRCh38' vep_species = 'homo_sapiens' } @@ -96,7 +96,7 @@ params { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" ngscheckmate_bed ="${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/NGSCheckMate/SNP_GRCh38_hg38_wChr.bed" snpeff_db = 'GRCh38.99' - vep_cache_version = '115' + vep_cache_version = '116' vep_genome = 'GRCh38' vep_species = 'homo_sapiens' } @@ -239,7 +239,7 @@ params { bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" snpeff_db = 'GRCh38.99' - vep_cache_version = '115' + vep_cache_version = '116' vep_genome = 'GRCh38' vep_species = 'homo_sapiens' } diff --git a/docs/DEVELOPER_GUIDELINES.md b/docs/DEVELOPER_GUIDELINES.md index eac5205ee6..9710248b23 100644 --- a/docs/DEVELOPER_GUIDELINES.md +++ b/docs/DEVELOPER_GUIDELINES.md @@ -489,6 +489,12 @@ nf-core modules update / nf-core modules list local ``` +### Updating VEP modules + +When updating `ensemblvep/vep` module, always update the `vep_version` parameter to match the new VEP version. This parameter is used by the LoFTEE plugin to locate the VEP installation path (e.g. `/opt/conda/share/ensembl-vep-${vep_version}`). + +Also update `vep_cache_version` in `conf/igenomes.config` for available genomes, based on what's available on [annotation-cache](https://annotation-cache.github.io/ensemblvep/). Not all genomes may have a cache for the new version — only update those that do. + --- ## Subworkflows diff --git a/modules.json b/modules.json index ca3721a53e..c77387364e 100644 --- a/modules.json +++ b/modules.json @@ -163,12 +163,12 @@ }, "ensemblvep/download": { "branch": "master", - "git_sha": "251885fdb29eca03523d326aca5c827d1f6bdfeb", + "git_sha": "db055f5f8c726a924bf51dadce3978da3bbdad7e", "installed_by": ["cache_download_ensemblvep_snpeff", "modules"] }, "ensemblvep/vep": { "branch": "master", - "git_sha": "251885fdb29eca03523d326aca5c827d1f6bdfeb", + "git_sha": "db055f5f8c726a924bf51dadce3978da3bbdad7e", "installed_by": ["modules"] }, "fastp": { diff --git a/modules/nf-core/ensemblvep/download/environment.yml b/modules/nf-core/ensemblvep/download/environment.yml index 48fc515c72..3d904beca0 100644 --- a/modules/nf-core/ensemblvep/download/environment.yml +++ b/modules/nf-core/ensemblvep/download/environment.yml @@ -5,7 +5,7 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/ensembl-vep - - bioconda::ensembl-vep=115.2 + - bioconda::ensembl-vep=116.0 # renovate: datasource=conda depName=bioconda/perl-math-cdf - bioconda::perl-math-cdf=0.1 # renovate: datasource=conda depName=bioconda/htslib diff --git a/modules/nf-core/ensemblvep/download/main.nf b/modules/nf-core/ensemblvep/download/main.nf index 199acfdf32..1f7c19a3f3 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 in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container - ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ed/edd02dfaf968d06c808e3c208d5b3e86afb4259590bfa6e5499965ef3bc81881/data' - : 'community.wave.seqera.io/library/ensembl-vep_perl-math-cdf_htslib:efd9a6d1c5f218a9'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/11/112b7b57f93b053ccd3f8b2f2207a5faa629fd4ea181af8e1a41a1fbd007e657/data' + : 'community.wave.seqera.io/library/ensembl-vep_perl-math-cdf_htslib:c4edd3fb4a233ae6'}" input: tuple val(meta), val(assembly), val(species), val(cache_version) diff --git a/modules/nf-core/ensemblvep/vep/environment.yml b/modules/nf-core/ensemblvep/vep/environment.yml index 48fc515c72..3d904beca0 100644 --- a/modules/nf-core/ensemblvep/vep/environment.yml +++ b/modules/nf-core/ensemblvep/vep/environment.yml @@ -5,7 +5,7 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/ensembl-vep - - bioconda::ensembl-vep=115.2 + - bioconda::ensembl-vep=116.0 # renovate: datasource=conda depName=bioconda/perl-math-cdf - bioconda::perl-math-cdf=0.1 # renovate: datasource=conda depName=bioconda/htslib diff --git a/modules/nf-core/ensemblvep/vep/main.nf b/modules/nf-core/ensemblvep/vep/main.nf index 4433eda936..914bc92932 100644 --- a/modules/nf-core/ensemblvep/vep/main.nf +++ b/modules/nf-core/ensemblvep/vep/main.nf @@ -4,8 +4,8 @@ process ENSEMBLVEP_VEP { conda "${moduleDir}/environment.yml" container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container - ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ed/edd02dfaf968d06c808e3c208d5b3e86afb4259590bfa6e5499965ef3bc81881/data' - : 'community.wave.seqera.io/library/ensembl-vep_perl-math-cdf_htslib:efd9a6d1c5f218a9'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/11/112b7b57f93b053ccd3f8b2f2207a5faa629fd4ea181af8e1a41a1fbd007e657/data' + : 'community.wave.seqera.io/library/ensembl-vep_perl-math-cdf_htslib:c4edd3fb4a233ae6'}" input: tuple val(meta), path(vcf), path(custom_extra_files) diff --git a/nextflow.config b/nextflow.config index d8e204796f..92652de02d 100644 --- a/nextflow.config +++ b/nextflow.config @@ -142,7 +142,7 @@ params { vep_cache_preflight_check = false // No preflight check by default vep_spliceai = null // spliceai plugin disabled within VEP vep_spliceregion = null // spliceregion plugin disabled within VEP - vep_version = "115.2-1" // Should be updated when we update VEP, needs this to get full path to some plugins + vep_version = "116.0-0" // Should be updated when we update VEP, needs this to get full path to some plugins // MultiQC options multiqc_config = null diff --git a/nextflow_schema.json b/nextflow_schema.json index f50d769634..19ef1af732 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -777,7 +777,7 @@ }, "vep_version": { "type": "string", - "default": "115.2-1", + "default": "116.0-0", "fa_icon": "fas fa-toolbox", "description": "Should reflect the VEP version used in the container.", "help_text": "Used by the loftee plugin which needs the full path to the VEP installation (e.g. `/opt/conda/share/ensembl-vep-${vep_version}`). Update this when the VEP container version changes." diff --git a/nf-test.config b/nf-test.config index 0676bf9351..c9c6b63ae2 100644 --- a/nf-test.config +++ b/nf-test.config @@ -20,7 +20,7 @@ config { // load the necessary plugins plugins { load "nft-bam@0.6.1" - load "nft-utils@0.0.9" + load "nft-utils@1.0.0" load "nft-vcf@1.0.7" } } diff --git a/tests/annotation_merge.nf.test.snap b/tests/annotation_merge.nf.test.snap index d0302c0e3a..1c23b195ce 100644 --- a/tests/annotation_merge.nf.test.snap +++ b/tests/annotation_merge.nf.test.snap @@ -4,7 +4,7 @@ 5, { "ENSEMBLVEP_VEP": { - "ensemblvep": "115.2", + "ensemblvep": "116.0", "perl-math-cdf": "0.1", "tabix": "1.23.1" }, @@ -16,7 +16,7 @@ "tabix": "1.21" }, "VCF_ANNOTATE_MERGE": { - "ensemblvep": "115.2", + "ensemblvep": "116.0", "perl-math-cdf": "0.1", "tabix": "1.23.1" } @@ -109,10 +109,10 @@ ], "No warnings" ], - "timestamp": "2026-05-27T10:13:01.036308477", + "timestamp": "2026-07-08T10:14:04.788318141", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.2" + "nextflow": "26.04.4" } }, "-profile test --tools merge,snpsift": { @@ -133,7 +133,7 @@ "tabix": "1.21" }, "VCF_ANNOTATE_MERGE": { - "ensemblvep": "115.2", + "ensemblvep": "116.0", "perl-math-cdf": "0.1", "tabix": "1.23.1" } @@ -220,10 +220,10 @@ ], "No warnings" ], - "timestamp": "2026-05-27T10:14:01.977520509", + "timestamp": "2026-07-08T10:15:44.567611717", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.2" + "nextflow": "26.04.4" } }, "-profile test --tools merge": { @@ -238,7 +238,7 @@ "tabix": "1.21" }, "VCF_ANNOTATE_MERGE": { - "ensemblvep": "115.2", + "ensemblvep": "116.0", "perl-math-cdf": "0.1", "tabix": "1.23.1" } @@ -320,10 +320,10 @@ ], "No warnings" ], - "timestamp": "2026-05-27T10:12:05.371914045", + "timestamp": "2026-07-08T10:12:53.660022078", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.2" + "nextflow": "26.04.4" } } } \ No newline at end of file diff --git a/tests/annotation_vep.nf.test b/tests/annotation_vep.nf.test index 82adf86763..0f7c12add7 100644 --- a/tests/annotation_vep.nf.test +++ b/tests/annotation_vep.nf.test @@ -41,6 +41,7 @@ nextflow_pipeline { tools: 'vep', vep_loftee: true, ], + vcf_header_check: '|LoF|', ], ] diff --git a/tests/annotation_vep.nf.test.snap b/tests/annotation_vep.nf.test.snap index e77e69ae4d..4365a3d7a3 100644 --- a/tests/annotation_vep.nf.test.snap +++ b/tests/annotation_vep.nf.test.snap @@ -4,7 +4,7 @@ 2, { "ENSEMBLVEP_VEP": { - "ensemblvep": "115.2", + "ensemblvep": "116.0", "perl-math-cdf": "0.1", "tabix": "1.23.1" } @@ -52,12 +52,15 @@ [ "test_VEP.ann.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e" ], + [ + "test_VEP.ann.vcf.gz:header.contains(|LoF|),true" + ], "No warnings" ], - "timestamp": "2026-05-27T13:40:41.25343459", + "timestamp": "2026-07-08T10:26:06.53157943", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.2" + "nextflow": "26.04.4" } }, "Fails with profile test --dbnsfp and no dbnsfp_tbi": { diff --git a/tests/lib/UTILS.groovy b/tests/lib/UTILS.groovy index faa76e26ef..445c1c092f 100644 --- a/tests/lib/UTILS.groovy +++ b/tests/lib/UTILS.groovy @@ -14,6 +14,7 @@ class UTILS { // These strings are not stable and should be ignored def snapshot_ignore_list = [ + "Check script", "Creating env using", "Downloading plugin", "Got an interrupted exception while taking agent result", @@ -24,26 +25,28 @@ class UTILS { ] // stable_name: All files + folders in ${outdir}/ with a stable name - def stable_name = getAllFilesFromDir(outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) + def stable_name = getAllFilesFromPath(outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}']) // stable_content: All files in ${outdir}/ with stable content - def stable_content = getAllFilesFromDir(outdir, ignoreFile: 'tests/.nftignore', ignore: [scenario.ignoreFiles ]) + def stable_content = getAllFilesFromPath(outdir, ignoreFile: 'tests/.nftignore', ignore: [scenario.ignoreFiles]) // bam_files: All bam files - def bam_files = getAllFilesFromDir(outdir, include: ['**/*.bam'], ignore: [scenario.ignoreFiles ]) + def bam_files = getAllFilesFromPath(outdir, include: ['**/*.bam'], ignore: [scenario.ignoreFiles]) // cram_files: All cram files - def cram_files = getAllFilesFromDir(outdir, include: ['**/*.cram'], ignore: [scenario.ignoreFiles ]) + def cram_files = getAllFilesFromPath(outdir, include: ['**/*.cram'], ignore: [scenario.ignoreFiles]) // Fasta file for cram verification with nft-bam def fasta_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/' def fasta = fasta_base + 'genomics/homo_sapiens/genome/genome.fasta' // txt_files: MuSE txt files - def txt_files = getAllFilesFromDir(outdir, include: ['**/*.MuSE.txt']) + def txt_files = getAllFilesFromPath(outdir, include: ['**/*.MuSE.txt']) // vcf_files: All vcf files - def vcf_files = getAllFilesFromDir(outdir, include: ['**/*.vcf{,.gz}'], ignore: [scenario.ignoreFiles ]) + def vcf_files = getAllFilesFromPath(outdir, include: ['**/*.vcf{,.gz}'], ignore: [scenario.ignoreFiles]) // freebayes_unfiltered: vcf files from freebayes without quality filtering - def freebayes_unfiltered = getAllFilesFromDir(outdir, include: ['**/*.freebayes.vcf.gz']) + def freebayes_unfiltered = getAllFilesFromPath(outdir, include: ['**/*.freebayes.vcf.gz']) // varlociraptor vcf - def varlociraptor_vcf = getAllFilesFromDir(outdir, include: ['**/*.varlociraptor.{vcf}{,.gz}']) + def varlociraptor_vcf = getAllFilesFromPath(outdir, include: ['**/*.varlociraptor.{vcf}{,.gz}']) def assertion = [] + // getAllFilesFromPath returns relative paths (strings), so this resolves to an absolute path + def absolutePath = { file -> file.toString().startsWith('/') ? file.toString() : "${outdir}/${file}" } if (!scenario.failure) { assertion.add(workflow.trace.succeeded().size()) @@ -54,27 +57,32 @@ class UTILS { assertion.add(stable_name) if (!scenario.stub) { - assertion.add(stable_content.isEmpty() ? 'No stable content' : stable_content) - assertion.add(bam_files.isEmpty() ? 'No BAM files' : bam_files.collect { file -> file.getName() + ":md5," + bam(file.toString()).readsMD5 }) - assertion.add(cram_files.isEmpty() ? 'No CRAM files' : cram_files.collect { file -> file.getName() + ":md5," + cram(file.toString(), fasta).readsMD5 }) + assertion.add(stable_content.isEmpty() ? 'No stable content' : stable_content.collect { file -> path(absolutePath(file)) }) + assertion.add(bam_files.isEmpty() ? 'No BAM files' : bam_files.collect { file -> file.tokenize('/').last() + ":md5," + bam(absolutePath(file)).readsMD5 }) + assertion.add(cram_files.isEmpty() ? 'No CRAM files' : cram_files.collect { file -> file.tokenize('/').last() + ":md5," + cram(absolutePath(file), fasta).readsMD5 }) if (scenario.include_muse_txt) { // It will skip the first line of the txt file - assertion.add(txt_files.isEmpty() ? 'No TXT files' : txt_files.collect{ file -> file.getName() + ":md5," + file.readLines()[2..-1].join('\n').md5() }) + assertion.add(txt_files.isEmpty() ? 'No TXT files' : txt_files.collect { file -> file.tokenize('/').last() + ":md5," + path(absolutePath(file)).readLines().drop(2).join('\n').md5() }) } if (scenario.include_freebayes_unfiltered) { // It will only print the vcf summary to avoid differing md5sums because of small differences in QUAL score - assertion.add(freebayes_unfiltered.isEmpty() ? 'No Freebayes unfiltered VCF files' : freebayes_unfiltered.collect { file -> [ file.getName(), path(file.toString()).vcf.summary ] }) + assertion.add(freebayes_unfiltered.isEmpty() ? 'No Freebayes unfiltered VCF files' : freebayes_unfiltered.collect { file -> [ file.tokenize('/').last(), path(absolutePath(file)).vcf.summary ] }) } if (scenario.no_vcf_md5sum) { // Will print the summary instead of the md5sum for vcf files - assertion.add(vcf_files.isEmpty() ? 'No VCF files' : vcf_files.collect { file -> [ file.getName(), path(file.toString()).vcf.summary ] }) + assertion.add(vcf_files.isEmpty() ? 'No VCF files' : vcf_files.collect { file -> [ file.tokenize('/').last(), path(absolutePath(file)).vcf.summary ] }) } else { - assertion.add(vcf_files.isEmpty() ? 'No VCF files' : vcf_files.collect { file -> file.getName() + ":md5," + path(file.toString()).vcf.variantsMD5 }) + assertion.add(vcf_files.isEmpty() ? 'No VCF files' : vcf_files.collect { file -> file.tokenize('/').last() + ":md5," + path(absolutePath(file)).vcf.variantsMD5 }) if (scenario.include_varlociraptor_vcf) { // It will use the summary method to extract the vcf file content - assertion.add(varlociraptor_vcf.isEmpty() ? 'No Varlociraptor VCF files' : varlociraptor_vcf.collect { file -> file.getName() + ":summary," + path(file.toString()).vcf.summary }) + assertion.add(varlociraptor_vcf.isEmpty() ? 'No Varlociraptor VCF files' : varlociraptor_vcf.collect { file -> file.tokenize('/').last() + ":summary," + path(absolutePath(file)).vcf.summary }) } } + + // Check for specific VCF header fields if requested + if (scenario.vcf_header_check) { + assertion.add(vcf_files.isEmpty() ? 'No VCF files' : vcf_files.collect { file -> file.tokenize('/').last() + ":header.contains(${scenario.vcf_header_check})," + path(absolutePath(file)).vcf.header.toString().contains(scenario.vcf_header_check) }) + } } // If we have a snapshot options in scenario then we allow to capture either stderr, stdout or both diff --git a/tests/samplesheets.nf.test.snap b/tests/samplesheets.nf.test.snap index 3f2ff5acb7..a36cd61047 100644 --- a/tests/samplesheets.nf.test.snap +++ b/tests/samplesheets.nf.test.snap @@ -29,8 +29,7 @@ [ "The following invalid input values have been detected:", "* --input ([PATH]/./tests/csv/3.0/fastq_sample_with_space.csv): Validation of file failed:", - "\t-> Entry 2: Error for field 'sample' (test 2): \"test 2\" does not match regular expression [^\\S+$] (Sample ID must be provided, cannot contain spaces and must be a string value)", - " -- Check script '[PATH]/subworkflows/nf-core/utils_nfschema_plugin/main.nf' at line: 72 or see '[PATH]/tests/[NFT_HASH]/meta/nextflow.log' file for more details" + "\t-> Entry 2: Error for field 'sample' (test 2): \"test 2\" does not match regular expression [^\\S+$] (Sample ID must be provided, cannot contain spaces and must be a string value)" ] ], "meta": { From 2d44030d286f2308eae5d5af85eef738e3bb5e1e Mon Sep 17 00:00:00 2001 From: nf-core bot Date: Mon, 13 Jul 2026 15:27:57 +0200 Subject: [PATCH 04/27] Important! Template update for nf-core/tools v4.0.2 (#2178) Co-authored-by: Maxime U. Garcia --- .devcontainer/devcontainer.json | 1 + .github/CONTRIBUTING.md | 128 --- .github/PULL_REQUEST_TEMPLATE.md | 4 +- .github/actions/get-shards/action.yml | 2 +- .../{cloudtest.yml => awsfulltest.yml} | 16 +- .github/workflows/awstest.yml | 33 + .github/workflows/branch.yml | 2 +- .github/workflows/clean-up.yml | 2 +- .github/workflows/download_pipeline.yml | 16 +- .github/workflows/fix_linting.yml | 22 +- .github/workflows/linting.yml | 34 +- .github/workflows/linting_comment.yml | 4 +- .github/workflows/nf-test-gpu.yml | 11 +- .github/workflows/nf-test-sentieon.yml | 11 +- .github/workflows/nf-test.yml | 19 +- .github/workflows/release-announcements.yml | 4 +- .../workflows/template-version-comment.yml | 6 +- .nf-core.yml | 6 +- CHANGELOG.md | 1 + README.md | 6 +- conf/containers_conda_lock_files_amd64.config | 3 +- conf/containers_conda_lock_files_arm64.config | 3 +- conf/containers_docker_amd64.config | 3 +- conf/containers_docker_arm64.config | 3 +- .../containers_singularity_https_amd64.config | 3 +- .../containers_singularity_https_arm64.config | 3 +- conf/containers_singularity_oras_amd64.config | 3 +- conf/containers_singularity_oras_arm64.config | 3 +- docs/CONTRIBUTING.md | 201 +++++ modules.json | 4 +- .../linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt | 822 ++++++++++++++++++ .../linux_arm64-bd-e455e32f745abe68_1.txt | 769 ++++++++++++++++ modules/nf-core/fastqc/main.nf | 43 +- modules/nf-core/fastqc/meta.yml | 51 +- ... => linux_amd64-bd-c17fb751507e9dfc_1.txt} | 225 ++--- ... => linux_arm64-bd-5c84a5000a226ab5_1.txt} | 226 ++--- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 28 +- nextflow.config | 2 +- nf-test.config | 26 +- ro-crate-metadata.json | 112 +-- tests/samplesheets.nf.test | 5 - tests/samplesheets.nf.test.snap | 59 +- tests/variant_calling_muse.nf.test | 2 +- workflows/{sarek/main.nf => sarek.nf} | 39 +- 45 files changed, 2381 insertions(+), 589 deletions(-) delete mode 100644 .github/CONTRIBUTING.md rename .github/workflows/{cloudtest.yml => awsfulltest.yml} (91%) create mode 100644 .github/workflows/awstest.yml create mode 100644 docs/CONTRIBUTING.md create mode 100644 modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt create mode 100644 modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt rename modules/nf-core/multiqc/.conda-lock/{linux_amd64-bd-839587b417d23042_1.txt => linux_amd64-bd-c17fb751507e9dfc_1.txt} (92%) rename modules/nf-core/multiqc/.conda-lock/{linux_arm64-bd-3e45d17b40a576b4_1.txt => linux_arm64-bd-5c84a5000a226ab5_1.txt} (92%) rename workflows/{sarek/main.nf => sarek.nf} (96%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 97c8c97fe3..237c9ed083 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,4 +1,5 @@ { + "$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.schema.json", "name": "nfcore", "image": "nfcore/devcontainer:latest", diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index 6e9b1635e6..0000000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,128 +0,0 @@ -# `nf-core/sarek`: Contributing Guidelines - -Hi there! -Many thanks for taking an interest in improving nf-core/sarek. - -We try to manage the required tasks for nf-core/sarek using GitHub issues, you probably came to this page when creating one. -Please use the pre-filled template to save time. - -However, don't be put off by this template - other more general issues and suggestions are welcome! -Contributions to the code are even more welcome ;) - -> [!NOTE] -> If you need help using or modifying nf-core/sarek then the best place to ask is on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). - -## Contribution workflow - -If you'd like to write some code for nf-core/sarek, the standard workflow is as follows: - -1. Check that there isn't already an issue about your idea in the [nf-core/sarek issues](https://github.com/nf-core/sarek/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this -2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/sarek repository](https://github.com/nf-core/sarek) to your GitHub account -3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core pipelines schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). -5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged - -If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). - -## Tests - -You have the option to test your changes locally by running the pipeline. For receiving warnings about process selectors and other `debug` information, it is recommended to use the debug profile. Execute all the tests with the following command: - -```bash -nf-test test --profile debug,test,docker --verbose -``` - -When you create a pull request with changes, [GitHub Actions](https://github.com/features/actions) will run automatic tests. -Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. - -There are typically two types of tests that run: - -### Lint tests - -`nf-core` has a [set of guidelines](https://nf-co.re/developers/guidelines) which all pipelines must adhere to. -To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core pipelines lint ` command. - -If any failures or warnings are encountered, please follow the listed URL for more documentation. - -### Pipeline tests - -Each `nf-core` pipeline should be set up with a minimal set of test-data. -`GitHub Actions` then runs the pipeline on this data to ensure that it exits successfully. -If there are any failures then the automated tests fail. -These tests are run both with the latest available version of `Nextflow` and also the minimum required version that is stated in the pipeline code. - -## Patch - -:warning: Only in the unlikely and regretful event of a release happening with a bug. - -- On your own fork, make a new branch `patch` based on `upstream/main` or `upstream/master`. -- Fix the bug, and bump version (X.Y.Z+1). -- Open a pull-request from `patch` to `main`/`master` with the changes. - -## Getting help - -For further information/help, please consult the [nf-core/sarek documentation](https://nf-co.re/sarek/usage) and don't hesitate to get in touch on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). - -## Pipeline contribution conventions - -To make the `nf-core/sarek` code and processing logic more understandable for new contributors and to ensure quality, we semi-standardise the way the code and other contributions are written. - -> [!NOTE] -> For comprehensive, sarek-specific guidance (codebase architecture, channel operations and gotchas, meta map handling, module/subworkflow conventions, and more) see the [Developer Guidelines](../docs/DEVELOPER_GUIDELINES.md). These guidelines are written for both human developers and AI agents. - -### Adding a new step - -If you wish to contribute a new step, please use the following coding standards: - -1. Define the corresponding input channel into your new process from the expected previous process channel. -2. Write the process block (see below). -3. Define the output channel if needed (see below). -4. Add any new parameters to `nextflow.config` with a default (see below). -5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). -6. Add sanity checks and validation for all relevant parameters. -7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test in the `tests` directory. -9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. -10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. - -### Default values - -Parameters should be initialised / defined with default values within the `params` scope in `nextflow.config`. - -Once there, use `nf-core pipelines schema build` to add to `nextflow_schema.json`. - -### Default processes resource requirements - -Sensible defaults for process resource requirements (CPUs / memory / time) for a process should be defined in `conf/base.config`. These should generally be specified generic with `withLabel:` selectors so they can be shared across multiple processes/steps of the pipeline. A nf-core standard set of labels that should be followed where possible can be seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config), which has the default process as a single core-process, and then different levels of multi-core configurations for increasingly large memory requirements defined with standardised labels. - -The process resources can be passed on to the tool dynamically within the process with the `${task.cpus}` and `${task.memory}` variables in the `script:` block. - -### Naming schemes - -Please use the following naming schemes, to make it easy to understand what is going where. - -- initial process channel: `ch_output_from_` -- intermediate and terminal channels: `ch__for_` - -### Nextflow version bumping - -If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core pipelines bump-version --nextflow . [min-nf-version]` - -### Images and figures - -For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). - -## GitHub Codespaces - -This repo includes a devcontainer configuration which will create a GitHub Codespaces for Nextflow development! This is an online developer environment that runs in your browser, complete with VSCode and a terminal. - -To get started: - -- Open the repo in [Codespaces](https://github.com/nf-core/sarek/codespaces) -- Tools installed - - nf-core - - Nextflow - -Devcontainer specs: - -- [DevContainer config](.devcontainer/devcontainer.json) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a52619f09f..8af2911fb4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,14 +8,14 @@ These are the most common things requested on pull requests (PRs). Remember that PRs should be made against the dev branch, unless you're preparing a pipeline release. -Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) +Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/sarek/tree/master/docs/CONTRIBUTING.md) --> ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! -- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) +- [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/docs/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml index 34085279f8..e2833ee979 100644 --- a/.github/actions/get-shards/action.yml +++ b/.github/actions/get-shards/action.yml @@ -21,7 +21,7 @@ runs: using: "composite" steps: - name: Install nf-test - uses: nf-core/setup-nf-test@v1 + uses: nf-core/setup-nf-test@4069fbbaabe94c08faba4ad261bfa88225ba133f # v2 with: version: ${{ env.NFT_VER }} - name: Get number of shards diff --git a/.github/workflows/cloudtest.yml b/.github/workflows/awsfulltest.yml similarity index 91% rename from .github/workflows/cloudtest.yml rename to .github/workflows/awsfulltest.yml index 53d6e5e295..fb4ff59bc6 100644 --- a/.github/workflows/cloudtest.yml +++ b/.github/workflows/awsfulltest.yml @@ -1,8 +1,7 @@ -name: nf-core cloud tests (both full size and smaller) +name: nf-core AWS full size tests # This workflow is triggered on PRs opened against the main/master branch. # It can be additionally triggered manually with GitHub actions workflow dispatch button. -# It runs the -profile 'test_full' on cloud -# or the -profile 'test' on cloud (smaller tests) +# It runs the -profile 'test_full' on AWS batch on: pull_request_review: @@ -11,10 +10,6 @@ on: types: [published] workflow_dispatch: inputs: - test: - description: "-profile test (smaller)" - type: boolean - default: true somatic: description: "Somatic full test" type: boolean @@ -41,12 +36,6 @@ jobs: run: | # All available profiles all='[ - { - "profile": "test_aws", - "test": "test", - "compute_env": "TOWER_COMPUTE_ENV", - "workdir": "TOWER_BUCKET_AWS" - }, { "profile": "test_full_aws", "test": "somatic", @@ -70,7 +59,6 @@ jobs: if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then # Filter to only selected profiles matrix=$(echo "$all" | jq -c '[.[] | select( - (.test == "test" and ${{ inputs.test }}) or (.test == "somatic" and ${{ inputs.somatic }}) or (.test == "germline" and ${{ inputs.germline }}) or (.test == "germline_ncbench_agilent" and ${{ inputs.germline_ncbench_agilent }}) diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml new file mode 100644 index 0000000000..33d3bb0aaf --- /dev/null +++ b/.github/workflows/awstest.yml @@ -0,0 +1,33 @@ +name: nf-core AWS test +# This workflow can be triggered manually with the GitHub actions workflow dispatch button. +# It runs the -profile 'test' on AWS batch + +on: + workflow_dispatch: +jobs: + run-platform: + name: Run AWS tests + if: github.repository == 'nf-core/sarek' + runs-on: ubuntu-latest + steps: + # Launch workflow using Seqera Platform CLI tool action + - name: Launch workflow via Seqera Platform + uses: seqeralabs/action-tower-launch@51565b514bff1827cf34620de25d0055759f1fc9 # v2 + with: + workspace_id: ${{ vars.TOWER_WORKSPACE_ID }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} + compute_env: ${{ vars.TOWER_COMPUTE_ENV }} + revision: ${{ github.sha }} + workdir: s3://${{ vars.AWS_S3_BUCKET }}/work/sarek/work-${{ github.sha }} + parameters: | + { + "outdir": "s3://${{ vars.AWS_S3_BUCKET }}/sarek/results-test-${{ github.sha }}" + } + profiles: test + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: Seqera Platform debug log file + path: | + tower_action_*.log + tower_action_*.json diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 0bb9eb5738..ce61ff29f5 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -21,7 +21,7 @@ jobs: # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets - name: Post PR comment if: failure() - uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 + uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3 with: message: | ## This PR is against the `${{github.event.pull_request.base.ref}}` branch :x: diff --git a/.github/workflows/clean-up.yml b/.github/workflows/clean-up.yml index 6adb0fff4b..172de6f373 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@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10 + - uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # 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 45884ff900..a7bf4fc21f 100644 --- a/.github/workflows/download_pipeline.yml +++ b/.github/workflows/download_pipeline.yml @@ -38,13 +38,16 @@ jobs: runs-on: ubuntu-latest needs: configure steps: + - name: Check out pipeline code + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - name: Install Nextflow - uses: nf-core/setup-nextflow@v2 + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - name: Disk space cleanup uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # v1.3.1 - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: "3.14" architecture: "x64" @@ -54,10 +57,15 @@ jobs: with: apptainer-version: 1.3.4 + - name: Read .nf-core.yml + id: read_yml + run: | + echo "nf_core_version=$(yq '.nf_core_version' ${{ github.workspace }}/.nf-core.yml)" >> "$GITHUB_OUTPUT" + - name: Install dependencies run: | python -m pip install --upgrade pip - pip install git+https://github.com/nf-core/tools.git + pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - name: Make a cache directory for the container images run: | @@ -127,7 +135,7 @@ jobs: fi - name: Upload Nextflow logfile for debugging purposes - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: nextflow_logfile.txt path: .nextflow.log* diff --git a/.github/workflows/fix_linting.yml b/.github/workflows/fix_linting.yml index 8957338b18..ea83774c5d 100644 --- a/.github/workflows/fix_linting.yml +++ b/.github/workflows/fix_linting.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: # Use the @nf-core-bot token to check out so we can push later - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: token: ${{ secrets.nf_core_bot_auth_token }} @@ -31,22 +31,18 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} - # Install and run pre-commit - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 - with: - python-version: "3.14" - - - name: Install pre-commit - run: pip install pre-commit + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - name: Run pre-commit - id: pre-commit - run: pre-commit run --all-files + # Install and run prek + - name: Run prek + id: prek + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 continue-on-error: true # indication that the linting has finished - name: react if linting finished succesfully - if: steps.pre-commit.outcome == 'success' + if: steps.prek.outcome == 'success' uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5 with: comment-id: ${{ github.event.comment.id }} @@ -54,7 +50,7 @@ jobs: - name: Commit & push changes id: commit-and-push - if: steps.pre-commit.outcome == 'failure' + if: steps.prek.outcome == 'failure' run: | git config user.email "core@nf-co.re" git config user.name "nf-core-bot" diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 7a527a3464..8738ffc990 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,33 +11,31 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - - name: Set up Python 3.14 - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 - with: - python-version: "3.14" - - - name: Install pre-commit - run: pip install pre-commit + - name: Install Nextflow + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - name: Run pre-commit - run: pre-commit run --all-files + - name: Run prek + uses: j178/prek-action@6ad80277337ad479fe43bd70701c3f7f8aa74db3 # v2 nf-core: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Install Nextflow - uses: nf-core/setup-nextflow@v2 + uses: nf-core/setup-nextflow@b4ec1bc7c16a94435159de94a05253542fddf6ef # v3 - - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: "3.14" architecture: "x64" + - name: Setup uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: read .nf-core.yml uses: pietrobolcato/action-read-yaml@9f13718d61111b69f30ab4ac683e67a56d254e1d # 1.1.0 id: read_yml @@ -45,12 +43,10 @@ jobs: config: ${{ github.workspace }}/.nf-core.yml - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} + run: uv tool install nf-core==${{ steps.read_yml.outputs['nf_core_version'] }} - name: Run nf-core pipelines lint - if: ${{ github.base_ref != 'master' }} + if: ${{ github.base_ref != 'master' || github.base_ref != 'main' }} env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -58,7 +54,7 @@ jobs: run: nf-core -l lint_log.txt pipelines lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Run nf-core pipelines lint --release - if: ${{ github.base_ref == 'master' }} + if: ${{ github.base_ref == 'master' || github.base_ref == 'main' }} env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -71,7 +67,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: name: linting-logs path: | diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index e6e9bc269c..5b0c24f751 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Download lint results - uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 + uses: dawidd6/action-download-artifact@b6e2e70617bc3265edd6dab6c906732b2f1ae151 # v21 with: workflow: linting.yml workflow_conclusion: completed @@ -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@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2 + uses: marocchino/sticky-pull-request-comment@70d2764d1a7d5d9560b100cbea0077fc8f633987 # v3 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} diff --git a/.github/workflows/nf-test-gpu.yml b/.github/workflows/nf-test-gpu.yml index 493b61bbf3..e6ee69ddea 100644 --- a/.github/workflows/nf-test-gpu.yml +++ b/.github/workflows/nf-test-gpu.yml @@ -18,7 +18,8 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.3" + NFT_VER: "0.9.5" + NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity @@ -38,7 +39,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 @@ -77,14 +78,14 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - 25.10.2 - - latest-everything + - "25.10.4" + - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-gpu-changes.outputs.total_shards }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 diff --git a/.github/workflows/nf-test-sentieon.yml b/.github/workflows/nf-test-sentieon.yml index d67114a1ee..6b7d5de27c 100644 --- a/.github/workflows/nf-test-sentieon.yml +++ b/.github/workflows/nf-test-sentieon.yml @@ -18,7 +18,8 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.3" + NFT_VER: "0.9.5" + NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity @@ -38,7 +39,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 @@ -78,14 +79,14 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - 25.10.2 - - latest-everything + - "25.10.4" + - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-sentieon-changes.outputs.total_shards }} steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index b3c8f95059..88ddc03266 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -18,10 +18,12 @@ concurrency: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NFT_VER: "0.9.3" + NFT_VER: "0.9.5" + NFT_WORKDIR: "~" NXF_ANSI_LOG: false NXF_SINGULARITY_CACHEDIR: ${{ github.workspace }}/.singularity NXF_SINGULARITY_LIBRARYDIR: ${{ github.workspace }}/.singularity + jobs: nf-test-changes: name: nf-test-changes @@ -38,7 +40,7 @@ jobs: rm -rf ./* || true rm -rf ./.??* || true ls -la ./ - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 @@ -48,8 +50,8 @@ jobs: env: NFT_VER: ${{ env.NFT_VER }} with: - tags: "cpu,cpu_conda" max_shards: 15 + tags: "cpu,cpu_conda" - name: debug run: | @@ -78,20 +80,17 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - 25.10.2 - - latest-everything + - "25.10.4" + - "latest-everything" env: NXF_ANSI_LOG: false TOTAL_SHARDS: ${{ needs.nf-test-changes.outputs.total_shards }} steps: - - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: fetch-depth: 0 - - name: Set NFT_WORKDIR dynamically - run: echo "NFT_WORKDIR=$HOME" >> $GITHUB_ENV - - name: Run nf-test id: run_nf_test uses: ./.github/actions/nf-test @@ -104,6 +103,7 @@ jobs: shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} tags: ${{ matrix.profile == 'conda' && 'cpu_conda' || 'cpu,cpu_conda' }} + - name: Report test status if: ${{ always() }} run: | @@ -118,6 +118,7 @@ jobs: exit 1 fi fi + confirm-pass: needs: [nf-test] if: always() diff --git a/.github/workflows/release-announcements.yml b/.github/workflows/release-announcements.yml index 431d3d4457..78d5dbe056 100644 --- a/.github/workflows/release-announcements.yml +++ b/.github/workflows/release-announcements.yml @@ -18,7 +18,7 @@ jobs: id: get_description run: | echo "description=$(curl -s https://nf-co.re/pipelines.json | jq -r '.remote_workflows[] | select(.full_name == "${{ github.repository }}") | .description')" >> $GITHUB_OUTPUT - - uses: rzr/fediverse-action@master + - uses: rzr/fediverse-action@563159eb8d45f70ab6aaba36ed55cd037e51f441 # master with: access-token: ${{ secrets.MASTODON_ACCESS_TOKEN }} host: "mstdn.science" # custom host if not "mastodon.social" (default) @@ -34,7 +34,7 @@ jobs: bsky-post: runs-on: ubuntu-latest steps: - - uses: zentered/bluesky-post-action@6461056ea355ea43b977e149f7bf76aaa572e5e8 # v0.3.0 + - uses: zentered/bluesky-post-action@5a91cc2ad10a304a4e96c16182dbe4918710bcf6 # v0.4.0 with: post: | Pipeline release! ${{ github.repository }} v${{ github.event.release.tag_name }} - ${{ github.event.release.name }}! diff --git a/.github/workflows/template-version-comment.yml b/.github/workflows/template-version-comment.yml index e8560fc7c9..ea30827ec8 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@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: ref: ${{ github.event.pull_request.head.sha }} @@ -29,7 +29,7 @@ jobs: run: echo "OUTPUT=$(pip list --outdated | grep nf-core)" >> ${GITHUB_ENV} - name: Post nf-core template version comment - uses: mshick/add-pr-comment@b8f338c590a895d50bcbfa6c5859251edc8952fc # v2 + uses: mshick/add-pr-comment@8e4927817251f1ff60c001f04568532b38e0b4a0 # v3 if: | contains(env.OUTPUT, 'nf-core') with: @@ -42,5 +42,5 @@ jobs: > Your pipeline is using an old version of the nf-core template: ${{ steps.read_yml.outputs['nf_core_version'] }}. > Please update your pipeline to the latest version. > - > For more documentation on how to update your pipeline, please see the [nf-core documentation](https://github.com/nf-core/tools?tab=readme-ov-file#sync-a-pipeline-with-the-template) and [Synchronisation documentation](https://nf-co.re/docs/contributing/sync). + > For more documentation on how to update your pipeline, please see the [Synchronisation documentation](https://nf-co.re/docs/developing/template-syncs/overview). # diff --git a/.nf-core.yml b/.nf-core.yml index 8431730ebe..cd09c125f6 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,7 +5,6 @@ lint: - .github/workflows/ci.yml - conf/modules.config files_unchanged: - - .github/CONTRIBUTING.md - .gitignore - assets/nf-core-sarek_logo_light.png - docs/images/nf-core-sarek_logo_dark.png @@ -14,11 +13,12 @@ lint: nf_test_content: false schema_params: false template_strings: false -nf_core_version: 3.5.1 +nf_core_version: 4.0.2 repository_type: pipeline template: author: Maxime Garcia, Szilveszter Juhos, Friederike Hanssen - description: An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing + description: An open-source analysis pipeline to detect germline or somatic variants + from whole genome or targeted sequencing force: false is_nfcore: true name: sarek diff --git a/CHANGELOG.md b/CHANGELOG.md index 517dfd8eab..8b5b7e9436 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Changed +- [#2178](https://github.com/nf-core/sarek/pull/2178) - Template update for nf-core/tools v4.0.2 - [#2225](https://github.com/nf-core/sarek/pull/2225) - Back to dev (3.9.1dev) - [#2229](https://github.com/nf-core/sarek/pull/2229) - Update nft-utils to 1.0.0, migrate `getAllFilesFromDir` to `getAllFilesFromPath` in test utilities diff --git a/README.md b/README.md index dd54dedd38..f73c761058 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3476425-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3476425) [![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.10.2-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/version-%E2%89%A525.10.4-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/) @@ -128,7 +128,7 @@ Friederike Hanssen and Gisela Gabernet at [QBiC](https://www.qbic.uni-tuebingen. The Nextflow DSL2 conversion of the pipeline was lead by Friederike Hanssen and Maxime U Garcia. -Maintenance is now lead by Friederike Hanssen and Maxime U Garcia (now at [Seqera](https://seqera.io)) +Maintenance is now lead by Friederike Hanssen (now at [Seqera](https://seqera.io)) and Maxime U Garcia. Main developers: @@ -207,7 +207,7 @@ We thank the following people for their extensive assistance in the development If you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md). -For further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek) (you can join with [this invite](https://nf-co.re/join/slack)), or contact us: [Maxime U Garcia](mailto:maxime.garcia@seqera.io?subject=[GitHub]%20nf-core/sarek), [Friederike Hanssen](mailto:friederike.hanssen@qbic.uni-tuebingen.de?subject=[GitHub]%20nf-core/sarek) +For further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek), or contact the dev team on the [Slack `#sarek_dev` channel](https://nfcore.slack.com/channels/sarek_dev). (you can join with [this invite](https://nf-co.re/join/slack)). ## Citations diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config index a05393e6dd..41e234d506 100644 --- a/conf/containers_conda_lock_files_amd64.config +++ b/conf/containers_conda_lock_files_amd64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-839587b417d23042_1.txt' } } +process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' } } diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config index 7b7f2b66fc..5b5b9aadf1 100644 --- a/conf/containers_conda_lock_files_arm64.config +++ b/conf/containers_conda_lock_files_arm64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-3e45d17b40a576b4_1.txt' } } +process { withName: 'FASTQC' { container = 'modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' } } diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config index 66a4c027d8..a66e3d1f63 100644 --- a/conf/containers_docker_amd64.config +++ b/conf/containers_docker_amd64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--839587b417d23042' } } +process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc' } } diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config index 209188f0d1..215f6865ab 100644 --- a/conf/containers_docker_arm64.config +++ b/conf/containers_docker_arm64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--3e45d17b40a576b4' } } +process { withName: 'FASTQC' { container = 'community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5' } } diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config index 2465ec54e7..2fb11a3525 100644 --- a/conf/containers_singularity_https_amd64.config +++ b/conf/containers_singularity_https_amd64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/12/1297c0f5075c19486da167ebf1b6136907d6b5339697b87b29fda335221785b3/data' } } +process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' } } diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config index 80ca27ed96..5fa5b4f90a 100644 --- a/conf/containers_singularity_https_arm64.config +++ b/conf/containers_singularity_https_arm64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c0/c007304153702edc622f1a76b41505e7fca65c7145e5b8b2ddce62a5c59af207/data' } } +process { withName: 'FASTQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data' } } diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config index 19753cfe95..b334375722 100644 --- a/conf/containers_singularity_oras_amd64.config +++ b/conf/containers_singularity_oras_amd64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--cb7458fda84d6393' } } +process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2' } } diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config index e5439f67e5..661c6568e5 100644 --- a/conf/containers_singularity_oras_arm64.config +++ b/conf/containers_singularity_oras_arm64.config @@ -1 +1,2 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--f79e87603d312ac0' } } +process { withName: 'FASTQC' { container = 'oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81' } } diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000000..6440b8ffc0 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,201 @@ +--- +title: Contributing +markdownPlugin: checklist +--- + +# `nf-core/sarek`: Contributing guidelines + +Hi there! +Thanks for taking an interest in improving nf-core/sarek. + +This page describes the recommended nf-core way to contribute to both nf-core/sarek and nf-core pipelines in general, including: + +- [General contribution guidelines](#general-contribution-guidelines): common procedures or guides across all nf-core pipelines. +- [Pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): procedures or guides specific to the development conventions of nf-core/sarek. + +> [!NOTE] +> If you need help using or modifying nf-core/sarek, ask on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). + +## General contribution guidelines + +### Contribution quick start + +To contribute code to any nf-core pipeline: + +- [ ] Ensure you have Nextflow, nf-core tools, and nf-test installed. See the [nf-core/tools repository](https://github.com/nf-core/tools) for instructions. +- [ ] Check whether a GitHub [issue](https://github.com/nf-core/sarek/issues) about your idea already exists. If an issue does not exist, create one so that others are aware you are working on it. +- [ ] [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/sarek repository](https://github.com/nf-core/sarek) to your GitHub account. +- [ ] Create a branch on your forked repository and make your changes following [pipeline conventions](#pipeline-contribution-conventions) (if applicable). +- [ ] To fix major bugs, name your branch `patch` and follow the [patch release](#patch-release) process. +- [ ] Update relevant documentation within the `docs/` folder, use nf-core/tools to update `nextflow_schema.json`, and update `CITATIONS.md`. +- [ ] Run and/or update tests. See [Testing](#testing) for more information. +- [ ] [Lint](#lint-tests) your code with nf-core/tools. +- [ ] Submit a pull request (PR) against the `dev` branch and request a review. + +If you are not used to this workflow with Git, see the [GitHub documentation](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or [Git resources](https://try.github.io/) for more information. + +## Use of AI and LLMs + +The nf-core stance on the use of AI and LLMs is that humans are still ultimately responsible for their submitted code, regardless of the tools they use. + +If you’re using AI tools, try to stick by these guidelines: + +- Keep PRs as small and focussed as possible +- Avoid any unnecessary changes, such as moving or refactoring code (unless that is the explicit intention of the PR) +- Review all generated code yourself before opening a PR, and ensure that you understand it +- Engage with the community review process and expect to make revisions + +For more detail, see the the [blog post](https://nf-co.re/blog/2026/statement-on-ai) for a statement from the nf-core/core team. + +### Getting help + +For further information and help, see the [nf-core/sarek documentation](https://nf-co.re/sarek/usage) or ask on the nf-core [#sarek](https://nfcore.slack.com/channels/sarek) Slack channel ([join our Slack here](https://nf-co.re/join/slack)). + +### GitHub Codespaces + +You can contribute to nf-core/sarek without installing a local development environment on your machine by using [GitHub Codespaces](https://github.com/codespaces). + +[GitHub Codespaces](https://github.com/codespaces) is an online developer environment that runs in your browser, complete with VS Code and a terminal. +Most nf-core repositories include a devcontainer configuration, which creates a GitHub Codespaces environment specifically for Nextflow development. +The environment includes pre-installed nf-core tools, Nextflow, and a few other helpful utilities via a Docker container. + +To get started, open the repository in [Codespaces](https://github.com/nf-core/sarek/codespaces). + +### Testing + +Once you have made your changes, run the pipeline with nf-test to test them locally. +For additional information, use the `--verbose` flag to view the Nextflow console log output. + +```bash +nf-test test --tag test --profile +docker --verbose +``` + +If you have added new functionality, ensure you update the test assertions in the `.nf.test` files in the `tests/` directory. +Update the snapshots with the following command: + +```bash +nf-test test --tag test --profile +docker --verbose --update-snapshots +``` + +When you create a pull request with changes, GitHub Actions will run automatic tests. +Pull requests are typically reviewed when these tests are passing. + +Two types of tests are typically run: + +#### Lint tests + +nf-core has a [set of guidelines](https://nf-co.re/docs/specifications/overview) which all pipelines must follow. +To enforce these, run linting with nf-core/tools: + +```bash +nf-core pipelines lint +``` + +If you encounter failures or warnings, follow the linked documentation printed to screen. +For more information about linting tests, see [nf-core/tools API documentation](https://nf-co.re/docs/nf-core-tools/api_reference/latest/pipeline_lint_tests/actions_awsfulltest). + +#### Pipeline tests + +Each nf-core pipeline should be set up with a minimal set of test data. +GitHub Actions runs the pipeline on this data to ensure it runs through and exits successfully. +If there are any failures then the automated tests fail. +These tests are run with the latest available version of Nextflow and the minimum required version specified in the pipeline code. + +### Patch release + +> [!WARNING] +> Only in the unlikely event of a release that contains a critical bug. + +- [ ] Create a new branch `patch` on your fork based on `upstream/main` or `upstream/master`. +- [ ] Fix the bug and use nf-core/tools to bump the version to the next semantic version, for example, `1.2.3` → `1.2.4`. +- [ ] Open a Pull Request from `patch` directly to `main`/`master` with the changes. + +### Pipeline contribution conventions + +nf-core semi-standardises how you write code and other contributions to make the nf-core/sarek code and processing logic more understandable for new contributors and to ensure quality. + +#### Add a new pipeline step + +To contribute a new step to the pipeline, follow the general nf-core coding procedure. +Please also refer to the [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines): + +- [ ] Define the corresponding [input channel](#channel-naming-schemes) into your new process from the expected previous process channel. +- [ ] Install a module with nf-core/tools, or write a local module (see [default processes resource requirements](#default-processes-resource-requirements)), and add it to the target `.nf`. +- [ ] Define the output channel if needed. Mix the version output channel into `ch_versions` and relevant files into `ch_multiqc`. +- [ ] Add new or updated parameters to `nextflow.config` with a [default value](#default-parameter-values). +- [ ] Add new or updated parameters and relevant help text to `nextflow_schema.json` with [nf-core/tools](#default-parameter-values). +- [ ] Add validation for relevant parameters to the pipeline utilisation section of `utils_nfcore_\_pipeline/main.nf` subworkflow. +- [ ] Perform local tests to validate that the new code works as expected. + - [ ] If applicable, add a new test in the `tests` directory. +- [ ] Update `usage.md`, `output.md`, and `citation.md` as appropriate. +- [ ] [Lint](lint) the code with nf-core/tools. +- [ ] Update any diagrams or pipeline images as necessary. +- [ ] Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name cleanup, and module plots are in the appropriate order. +- [ ] If applicable, create a [MultiQC](https://seqera.io/multiqc/) module. +- [ ] Add a description of the output files and, if relevant, images from the MultiQC report to `docs/output.md`. + +To update the minimum required Nextflow version, see the [Nextflow version bumping](#nextflow-version-bumping) section below. For more information about pipeline contributions, see [pipeline-specific contribution guidelines](#pipeline-specific-contribution-guidelines). + +#### Channel naming schemes + +Use the following naming schemes for channels to make the channel flow easier to understand: + +- Initial process channel: `ch_output_from_` +- Intermediate and terminal channels: `ch__for_` + +#### Default parameter values + +Parameters should be initialised and defined with default values within the `params` scope in `nextflow.config`. +They should also be documented in the pipeline JSON schema. + +To update `nextflow_schema.json`, run: + +```bash +nf-core pipelines schema build +``` + +The schema builder interface that loads in your browser should automatically update the defaults in the parameter documentation. + +#### Default processes resource requirements + +If you write a local module, specify a default set of resource requirements for the process. + +Sensible defaults for process resource requirements (CPUs, memory, time) should be defined in `conf/base.config`. +Specify these with generic `withLabel:` selectors, so they can be shared across multiple processes and steps of the pipeline. + +nf-core provides a set of standard labels that you should follow where possible, as seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config). +These labels define resource defaults for single-core processes, modules that require a GPU, and different levels of multi-core configurations with increasing memory requirements. + +Values assigned within these labels can be dynamically passed to a tool using the the `${task.cpus}` and `${task.memory}` Nextflow variables in the `script:` block of a module (see an example in the [modules repository](https://github.com/nf-core/modules/blob/bd1b6a40f55933d94b8c9ca94ec8c1ea0eaf4b82/modules/nf-core/samtools/bam2fq/main.nf#L30)). + +#### Nextflow version bumping + +If you use a new feature from core Nextflow, bump the minimum required Nextflow version in the pipeline with: + +```bash +nf-core pipelines bump-version --nextflow . +``` + +#### Images and figures guidelines + +If you update images or graphics, follow the nf-core [style guidelines](https://nf-co.re/docs/community/brand/workflow-schematics). + +## Pipeline specific contribution guidelines + +> [!NOTE] +> For comprehensive, sarek-specific guidance (codebase architecture, channel operations and gotchas, meta map handling, module/subworkflow conventions, and more) see the [Developer Guidelines](../docs/DEVELOPER_GUIDELINES.md). These guidelines are written for both human developers and AI agents. + +### Adding a new step + +If you wish to contribute a new step, please use the following coding standards: + +1. Define the corresponding input channel into your new process from the expected previous process channel. +2. Write the process block (see below). +3. Define the output channel if needed (see below). +4. Add any new parameters to `nextflow.config` with a default (see below). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). +6. Add sanity checks and validation for all relevant parameters. +7. Perform local tests to validate that the new code works as expected. +8. If applicable, add a new test in the `tests` directory. +9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://multiqc.info/) module. +10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. diff --git a/modules.json b/modules.json index c77387364e..d2272c9181 100644 --- a/modules.json +++ b/modules.json @@ -178,7 +178,7 @@ }, "fastqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "fgbio/callmolecularconsensusreads": { @@ -388,7 +388,7 @@ }, "multiqc": { "branch": "master", - "git_sha": "cd0ad387832473916b1f1c80c2ca673a7883bf94", + "git_sha": "98403d15b0e50edae1f3fec5eae5e24982f1fade", "installed_by": ["modules"] }, "muse/call": { diff --git a/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt new file mode 100644 index 0000000000..7770ccd5fc --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt @@ -0,0 +1,822 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-64: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 +md5: a9f577daf3de00bca7c3c76c0ecbd1de +depends: +- __glibc >=2.17,<3.0.a0 +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda +sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 +md5: dcdc58c15961dbf17a0621312b01f5cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 584660 +timestamp: 1768327524772 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda +sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 +md5: d2ffd7602c02f2b316fd921d39876885 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda +sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a +md5: bb6c4808bfa69d6f7f6b07e5846ced37 +depends: +- __glibc >=2.17,<3.0.a0 +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 989514 +timestamp: 1766415934926 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c +md5: 867127763fbe935bab59815b6e0b7b5c +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 270705 +timestamp: 1771382710863 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda +sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff +md5: 3bf7b9fd5a7136126e0234db4b87c8b6 +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 77248 +timestamp: 1712692454246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda +sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c +md5: 2cd94587f3a401ae05e03a6caf09539d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 99596 +timestamp: 1755102025473 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda +sha256: 477f2c553f72165020d3c56740ba354be916c2f0b76fd9f535e83d698277d5ec +md5: 14470902326beee192e33719a2e8bb7f +depends: +- __glibc >=2.17,<3.0.a0 +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2384060 +timestamp: 1774276284520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda +sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a +md5: c80d8a3b84358cb967fa81e7075fbc8a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12723451 +timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda +sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 +md5: b38117a3c920364aff79f870c984b4a3 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: LGPL-2.1-or-later +size: 134088 +timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda +sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 +md5: fb53fb07ce46a575c5d004bbc96032c2 +depends: +- __glibc >=2.17,<3.0.a0 +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1386730 +timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda +sha256: 836ec4b895352110335b9fdcfa83a8dcdbe6c5fb7c06c4929130600caea91c0a +md5: 6f2e2c8f58160147c4d1c6f4c14cbac4 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 249959 +timestamp: 1768184673131 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda +sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 +md5: a752488c68f2e7c456bcbd8f16eec275 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda +sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c +md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 +depends: +- __glibc >=2.17,<3.0.a0 +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4518030 +timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda +sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 +md5: 6c77a605a7a689d17d4819c0f8ac9a00 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 73490 +timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda +sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 +md5: c277e0a4d549b03ac1e9d6cbbe3d017b +depends: +- ncurses +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 134676 +timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda +sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 +md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76798 +timestamp: 1771259418166 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda +sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 +md5: a360c33a5abe61c07959e449fa1453eb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 58592 +timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda +sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 +md5: e289f3d17880e44b633ba911d57a321b +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8049 +timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda +sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d +md5: fb16b4b69e3f1dcfe79d80db8fd0c55d +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda +sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 +md5: 0aa00f03f9e39fb9876085dee11a85d4 +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041788 +timestamp: 1771378212382 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda +sha256: e318a711400f536c81123e753d4c797a821021fb38970cebfb3f454126016893 +md5: d5e96b1ed75ca01906b3d2469b4ce493 +depends: +- libgcc 15.2.0 he0feb66_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27526 +timestamp: 1771378224552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda +sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce +md5: bb26456332b07f68bf3b7622ed71c0da +depends: +- __glibc >=2.17,<3.0.a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4398701 +timestamp: 1771863239578 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda +sha256: 21337ab58e5e0649d869ab168d4e609b033509de22521de1bfed0c031bfc5110 +md5: 239c5e9546c38a1e884d69effcf4c882 +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603262 +timestamp: 1771378117851 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda +sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f +md5: 915f5995e94f60e9a4826e0b0920ee88 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: LGPL-2.1-only +size: 790176 +timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda +sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 +md5: 8397539e3a0bbd1695584fb4f927485a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633710 +timestamp: 1762094827865 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda +sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb +md5: c7c83eecbb72d88b940c249af56c8b17 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 113207 +timestamp: 1768752626120 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda +sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c +md5: 5f13ffc7d30ffec87864e678df9957b4 +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 317669 +timestamp: 1770691470744 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda +sha256: 78668020064fdaa27e9ab65cd2997e2c837b564ab26ce3bf0e58a2ce1a525c6e +md5: 1b08cd684f34175e4514474793d44bcb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852330 +timestamp: 1771378262446 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda +sha256: e5f8c38625aa6d567809733ae04bb71c161a42e44a9fa8227abe61fa5c60ebe0 +md5: cd5a90476766d53e901500df9215e927 +depends: +- __glibc >=2.17,<3.0.a0 +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda +sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee +md5: db409b7c1720428638e7c0d509d3e1b5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 40311 +timestamp: 1766271528534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda +sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b +md5: aea31d2e5b1091feca96fcfe945c3cf9 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 429011 +timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda +sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa +md5: 92ed62436b625154323d40d5f2f11dd7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 395888 +timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda +sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c +md5: 5aa797f8787fe7a17d1b0821485b5adc +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 100393 +timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda +sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 +md5: d87ff7921124eccd67248aa483c23fec +depends: +- __glibc >=2.17,<3.0.a0 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda +sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 +md5: 47e340acb35de30501a76c7c799c41d7 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 891641 +timestamp: 1738195959188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-25.0.2-ha668962_0.conda +sha256: 3825a4c84676a8a5cc23b397a2911e4efa4a805daf2af764153bd904e142ec41 +md5: a41092b0177362dbe5eb2a18501e86c0 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- harfbuzz >=12.3.2 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +- xorg-libxtst >=1.2.5,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- libpng >=1.6.55,<1.7.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxext >=1.3.7,<2.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- libcups >=2.3.3,<2.4.0a0 +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 122465031 +timestamp: 1771443671180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda +sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c +md5: f61eb8cd60ff9057122a3d338b99c00f +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3164551 +timestamp: 1769555830639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda +sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff +md5: 7a3bff861a6583f1889021facefc08b1 +depends: +- __glibc >=2.17,<3.0.a0 +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1222481 +timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda +build_number: 7 +sha256: 9ec32b6936b0e37bcb0ed34f22ec3116e75b3c0964f9f50ecea5f58734ed6ce9 +md5: f2cfec9406850991f4e3d960cc9e3321 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13344463 +timestamp: 1703310653947 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda +sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a +md5: c01af13bdc553d1a8fbfff6e8db075f0 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 450960 +timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda +sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d +md5: f2c23a77b25efcad57d377b34bd84941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 593603 +timestamp: 1769710381284 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda +sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 +md5: b3c17d95b5a10c6e64a21fa17573e70e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda +sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b +md5: fb901ff28063514abb6046c9ec2c4a45 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +license: MIT +license_family: MIT +size: 58628 +timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda +sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 +md5: 1c74ff8c35dcadf952a16f752ca5aa49 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 27590 +timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda +sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 +md5: 861fb6ccbc677bb9a9fb2468430b9c6a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 839652 +timestamp: 1770819209719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda +sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b +md5: b2895afaf55bf96a8c8282a2e47a5de0 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 15321 +timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda +sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 +md5: 1dafce8548e38671bea82e3f5c6ce22f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: MIT +license_family: MIT +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda +sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f +md5: 34e54f03dfea3e7a2dcf1453a85f1085 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 50326 +timestamp: 1769445253162 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda +sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 +md5: ba231da7fccf9ea1e768caf5c7099b84 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20071 +timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda +sha256: 1a724b47d98d7880f26da40e45f01728e7638e6ec69f35a3e11f92acd05f9e7a +md5: 17dcc85db3c7886650b8908b183d6876 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 47179 +timestamp: 1727799254088 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda +sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 +md5: e192019153591938acf7322b6459d36e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 30456 +timestamp: 1769445263457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda +sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 +md5: 96d57aba173e878a2089d5638016dc5e +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33005 +timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda +sha256: a8afba4a55b7b530eb5c8ad89737d60d60bc151a03fbef7a2182461256953f0e +md5: 279b0de5f6ba95457190a1c459a64e31 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 379686 +timestamp: 1731860547604 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda +sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a +md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 32808 +timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 +md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 +depends: +- __glibc >=2.17,<3.0.a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt new file mode 100644 index 0000000000..cdc434cad3 --- /dev/null +++ b/modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt @@ -0,0 +1,769 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +options: +pypi-prerelease-mode: if-necessary-or-explicit +packages: +linux-aarch64: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda +build_number: 20 +sha256: a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068 +md5: 468fd3bb9e1f671d36c2cbc677e56f1d +depends: +- libgomp >=7.5.0 +constrains: +- openmp_impl <0.0a0 +license: BSD-3-Clause +license_family: BSD +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda +sha256: ea2233e2db9908c2e5f29d3ca420a546b4583253f4f70abb5494cdd676866d42 +md5: 4a98cbc4ade694520227402ff8880630 +depends: +- libgcc >=14 +license: LGPL-2.1-or-later +license_family: GPL +size: 615729 +timestamp: 1768327548407 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda +sha256: b3495077889dde6bb370938e7db82be545c73e8589696ad0843a32221520ad4c +md5: 840d8fc0d7b3209be93080bc20e07f2d +depends: +- libgcc >=14 +license: bzip2-1.0.6 +license_family: BSD +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda +sha256: 67cc7101b36421c5913a1687ef1b99f85b5d6868da3abbf6ec1a4181e79782fc +md5: 4492fd26db29495f0ba23f146cd5638d +depends: +- __unix +license: ISC +size: 147413 +timestamp: 1772006283803 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cairo-1.18.4-h0b6afd8_1.conda +sha256: 675db823f3d6fb6bf747fab3b0170ba99b269a07cf6df1e49fff2f9972be9cd1 +md5: 043c13ed3a18396994be9b4fab6572ad +depends: +- fontconfig >=2.15.0,<3.0a0 +- fonts-conda-ecosystem +- icu >=78.1,<79.0a0 +- libexpat >=2.7.3,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libglib >=2.86.3,<3.0a0 +- libpng >=1.6.53,<1.7.0a0 +- libstdcxx >=14 +- libxcb >=1.17.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pixman >=0.46.4,<1.0a0 +- xorg-libice >=1.1.2,<2.0a0 +- xorg-libsm >=1.2.6,<2.0a0 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: LGPL-2.1-only or MPL-1.1 +size: 927045 +timestamp: 1766416003626 +- conda: https://conda.anaconda.org/bioconda/noarch/fastqc-0.12.1-hdfd78af_0.tar.bz2 +sha256: 7cc26225d590540ae95cd24940ff42f2da7479dd4cd22ae9ab9298665d06790c +md5: c9f6a4b12229f7331f79c9a00dd6e240 +depends: +- font-ttf-dejavu-sans-mono +- fontconfig +- openjdk >=8.0.144 +- perl +license: GPL >=3 +size: 11664291 +timestamp: 1677946722445 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 +sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b +md5: 0c96522c6bdaed4b1566d11387caaf45 +license: BSD-3-Clause +license_family: BSD +size: 397370 +timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 +sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c +md5: 34893075a5c9e55cdafac56607368fc6 +license: OFL-1.1 +license_family: Other +size: 96530 +timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 +sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 +md5: 4d59c254e01d9cde7957100457e2d5fb +license: OFL-1.1 +license_family: Other +size: 700814 +timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda +sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 +md5: 49023d73832ef61042f6a237cb2687e7 +license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 +license_family: Other +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c +md5: 0fed1ff55f4938a65907f3ecf62609db +depends: +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- libgcc >=14 +- libuuid >=2.41.3,<3.0a0 +- libzlib >=1.3.1,<2.0a0 +license: MIT +license_family: MIT +size: 279044 +timestamp: 1771382728182 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 +sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 +md5: fee5683a3f04bd15cbd8318b096a27ab +depends: +- fonts-conda-forge +license: BSD-3-Clause +license_family: BSD +size: 3667 +timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda +sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 +md5: a7970cd949a077b7cb9696379d338681 +depends: +- font-ttf-ubuntu +- font-ttf-inconsolata +- font-ttf-dejavu-sans-mono +- font-ttf-source-code-pro +license: BSD-3-Clause +license_family: BSD +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/giflib-5.2.2-h31becfc_0.conda +sha256: a79dc3bd54c4fb1f249942ee2d5b601a76ecf9614774a4cff9af49adfa458db2 +md5: 2f809afaf0ba1ea4135dce158169efac +depends: +- libgcc-ng >=12 +license: MIT +license_family: MIT +size: 82124 +timestamp: 1712692444545 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphite2-1.3.14-hfae3067_2.conda +sha256: c9b1781fe329e0b77c5addd741e58600f50bef39321cae75eba72f2f381374b7 +md5: 4aa540e9541cc9d6581ab23ff2043f13 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: LGPL-2.0-or-later +license_family: LGPL +size: 102400 +timestamp: 1755102000043 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda +sha256: e22f485fddaaea3ff4b6cae98e0197b9dccd2ed2770337ad6ff38a92afe04e59 +md5: 05d65a2cf410adc331c9ea61f59f1013 +depends: +- cairo >=1.18.4,<2.0a0 +- graphite2 >=1.3.14,<2.0a0 +- icu >=78.3,<79.0a0 +- libexpat >=2.7.4,<3.0a0 +- libfreetype >=2.14.2 +- libfreetype6 >=2.14.2 +- libgcc >=14 +- libglib >=2.86.4,<3.0a0 +- libstdcxx >=14 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 2345732 +timestamp: 1774281448329 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda +sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 +md5: 546da38c2fa9efacf203e2ad3f987c59 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MIT +license_family: MIT +size: 12837286 +timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda +sha256: 5ce830ca274b67de11a7075430a72020c1fb7d486161a82839be15c2b84e9988 +md5: e7df0aab10b9cbb73ab2a467ebfaf8c7 +depends: +- libgcc >=13 +license: LGPL-2.1-or-later +size: 129048 +timestamp: 1754906002667 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda +sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba +md5: d9ca108bd680ea86a963104b6b3e95ca +depends: +- keyutils >=1.6.3,<2.0a0 +- libedit >=3.1.20250104,<3.2.0a0 +- libedit >=3.1.20250104,<4.0a0 +- libgcc >=14 +- libstdcxx >=14 +- openssl >=3.5.5,<4.0a0 +license: MIT +license_family: MIT +size: 1517436 +timestamp: 1769773395215 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda +sha256: 379ef5e91a587137391a6149755d0e929f1a007d2dcb211318ac670a46c8596f +md5: bb960f01525b5e001608afef9d47b79c +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 293039 +timestamp: 1768184778398 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda +sha256: 8957fd460c1c132c8031f65fd5f56ec3807fd71b7cab2c5e2b0937b13404ab36 +md5: d13423b06447113a90b5b1366d4da171 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Apache-2.0 +license_family: Apache +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda +sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 +md5: 67828c963b17db7dc989fe5d509ef04a +depends: +- krb5 >=1.22.2,<1.23.0a0 +- libgcc >=14 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +license: Apache-2.0 +license_family: Apache +size: 4553739 +timestamp: 1770903929794 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda +sha256: 48814b73bd462da6eed2e697e30c060ae16af21e9fbed30d64feaf0aad9da392 +md5: a9138815598fe6b91a1d6782ca657b0c +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 71117 +timestamp: 1761979776756 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda +sha256: c0b27546aa3a23d47919226b3a1635fccdb4f24b94e72e206a751b33f46fd8d6 +md5: fb640d776fc92b682a14e001980825b1 +depends: +- ncurses +- libgcc >=13 +- ncurses >=6.5,<7.0a0 +license: BSD-2-Clause +license_family: BSD +size: 148125 +timestamp: 1738479808948 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda +sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 +md5: 57f3b3da02a50a1be2a6fe847515417d +depends: +- libgcc >=14 +constrains: +- expat 2.7.4.* +license: MIT +license_family: MIT +size: 76564 +timestamp: 1771259530958 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda +sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 +md5: 2f364feefb6a7c00423e80dcb12db62a +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 55952 +timestamp: 1769456078358 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda +sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a +md5: a229e22d4d8814a07702b0919d8e6701 +depends: +- libfreetype6 >=2.14.3 +license: GPL-2.0-only OR FTL +size: 8125 +timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda +sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c +md5: b99ed99e42dafb27889483b3098cace7 +depends: +- libgcc >=14 +- libpng >=1.6.55,<1.7.0a0 +- libzlib >=1.3.2,<2.0a0 +constrains: +- freetype >=2.14.3 +license: GPL-2.0-only OR FTL +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda +sha256: 43df385bedc1cab11993c4369e1f3b04b4ca5d0ea16cba6a0e7f18dbc129fcc9 +md5: 552567ea2b61e3a3035759b2fdb3f9a6 +depends: +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_18 +- libgomp 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622900 +timestamp: 1771378128706 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda +sha256: 83bb0415f59634dccfa8335d4163d1f6db00a27b36666736f9842b650b92cf2f +md5: 4feebd0fbf61075a1a9c2e9b3936c257 +depends: +- libgcc 15.2.0 h8acb6b2_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27568 +timestamp: 1771378136019 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libglib-2.86.4-hf53f6bf_1.conda +sha256: afc503dbd04a5bf2709aa9d8318a03a8c4edb389f661ff280c3494bfef4341ec +md5: 4ac4372fc4d7f20630a91314cdac8afd +depends: +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- libiconv >=1.18,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- pcre2 >=10.47,<10.48.0a0 +constrains: +- glib 2.86.4 *_1 +license: LGPL-2.1-or-later +size: 4512186 +timestamp: 1771863220969 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda +sha256: fc716f11a6a8525e27a5d332ef6a689210b0d2a4dd1133edc0f530659aa9faa6 +md5: 4faa39bf919939602e594253bd673958 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 588060 +timestamp: 1771378040807 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h90929bb_2.conda +sha256: 1473451cd282b48d24515795a595801c9b65b567fe399d7e12d50b2d6cdb04d9 +md5: 5a86bf847b9b926f3a4f203339748d78 +depends: +- libgcc >=14 +license: LGPL-2.1-only +size: 791226 +timestamp: 1754910975665 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda +sha256: 84064c7c53a64291a585d7215fe95ec42df74203a5bf7615d33d49a3b0f08bb6 +md5: 5109d7f837a3dfdf5c60f60e311b041f +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 691818 +timestamp: 1762094728337 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda +sha256: 843c46e20519651a3e357a8928352b16c5b94f4cd3d5481acc48be2e93e8f6a3 +md5: 96944e3c92386a12755b94619bae0b35 +depends: +- libgcc >=14 +constrains: +- xz 5.8.2.* +license: 0BSD +size: 125916 +timestamp: 1768754941722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda +sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 +md5: be4088903b94ea297975689b3c3aeb27 +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: zlib-acknowledgement +size: 340156 +timestamp: 1770691477245 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda +sha256: 31fdb9ffafad106a213192d8319b9f810e05abca9c5436b60e507afb35a6bc40 +md5: f56573d05e3b735cb03efeb64a15f388 +depends: +- libgcc 15.2.0 h8acb6b2_18 +constrains: +- libstdcxx-ng ==15.2.0=*_18 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5541411 +timestamp: 1771378162499 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda +sha256: 7ff79470db39e803e21b8185bc8f19c460666d5557b1378d1b1e857d929c6b39 +md5: 8c6fd84f9c87ac00636007c6131e457d +depends: +- lerc >=4.0.0,<5.0a0 +- libdeflate >=1.25,<1.26.0a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.0,<4.0a0 +- liblzma >=5.8.1,<6.0a0 +- libstdcxx >=14 +- libwebp-base >=1.6.0,<2.0a0 +- libzlib >=1.3.1,<2.0a0 +- zstd >=1.5.7,<1.6.0a0 +license: HPND +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda +sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 +md5: cf2861212053d05f27ec49c3784ff8bb +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +size: 43453 +timestamp: 1766271546875 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda +sha256: b03700a1f741554e8e5712f9b06dd67e76f5301292958cd3cb1ac8c6fdd9ed25 +md5: 24e92d0942c799db387f5c9d7b81f1af +depends: +- libgcc >=14 +constrains: +- libwebp 1.6.0 +license: BSD-3-Clause +license_family: BSD +size: 359496 +timestamp: 1752160685488 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda +sha256: 461cab3d5650ac6db73a367de5c8eca50363966e862dcf60181d693236b1ae7b +md5: cd14ee5cca2464a425b1dbfc24d90db2 +depends: +- libgcc >=13 +- pthread-stubs +- xorg-libxau >=1.0.11,<2.0a0 +- xorg-libxdmcp +license: MIT +license_family: MIT +size: 397493 +timestamp: 1727280745441 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda +sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f +md5: b4df5d7d4b63579d081fd3a4cf99740e +depends: +- libgcc-ng >=12 +license: LGPL-2.1-or-later +size: 114269 +timestamp: 1702724369203 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda +sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f +md5: 502006882cf5461adced436e410046d1 +constrains: +- zlib 1.3.2 *_2 +license: Zlib +license_family: Other +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda +sha256: 91cfb655a68b0353b2833521dc919188db3d8a7f4c64bea2c6a7557b24747468 +md5: 182afabe009dc78d8b73100255ee6868 +depends: +- libgcc >=13 +license: X11 AND BSD-3-Clause +size: 926034 +timestamp: 1738196018799 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjdk-25.0.2-h488f50d_0.conda +sha256: 6fd2c872b275fa5d42a61a4b6dc28a819cde29f9048adb547363597432e0720e +md5: 27fdd5d67e235c20d23b2d66406497d3 +depends: +- xorg-libx11 +- xorg-libxext +- xorg-libxi +- xorg-libxrender +- xorg-libxtst +- libstdcxx >=14 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +- xorg-libxtst >=1.2.5,<2.0a0 +- libpng >=1.6.55,<1.7.0a0 +- alsa-lib >=1.2.15.3,<1.3.0a0 +- xorg-libx11 >=1.8.13,<2.0a0 +- xorg-libxi >=1.8.2,<2.0a0 +- xorg-libxrandr >=1.5.5,<2.0a0 +- lcms2 >=2.18,<3.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +- libcups >=2.3.3,<2.4.0a0 +- libfreetype >=2.14.1 +- libfreetype6 >=2.14.1 +- harfbuzz >=12.3.2 +- xorg-libxext >=1.3.7,<2.0a0 +- giflib >=5.2.2,<5.3.0a0 +- xorg-libxt >=1.3.1,<2.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- fontconfig >=2.17.1,<3.0a0 +- fonts-conda-ecosystem +license: GPL-2.0-or-later WITH Classpath-exception-2.0 +license_family: GPL +size: 106988620 +timestamp: 1771443741031 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda +sha256: 7f8048c0e75b2620254218d72b4ae7f14136f1981c5eb555ef61645a9344505f +md5: 25f5885f11e8b1f075bccf4a2da91c60 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3692030 +timestamp: 1769557678657 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pcre2-10.47-hf841c20_0.conda +sha256: 04df2cee95feba440387f33f878e9f655521e69f4be33a0cd637f07d3d81f0f9 +md5: 1a30c42e32ca0ea216bd0bfe6f842f0b +depends: +- bzip2 >=1.0.8,<2.0a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 1166552 +timestamp: 1763655534263 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/perl-5.32.1-7_h31becfc_perl5.conda +build_number: 7 +sha256: d78296134263b5bf476cad838ded65451e7162db756f9997c5d06b08122572ed +md5: 17d019cb2a6c72073c344e98e40dfd61 +depends: +- libgcc-ng >=12 +- libxcrypt >=4.4.36 +license: GPL-1.0-or-later OR Artistic-1.0-Perl +size: 13338804 +timestamp: 1703310557094 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pixman-0.46.4-h7ac5ae9_1.conda +sha256: e6b0846a998f2263629cfeac7bca73565c35af13251969f45d385db537a514e4 +md5: 1587081d537bd4ae77d1c0635d465ba5 +depends: +- libgcc >=14 +- libstdcxx >=14 +- libgcc >=14 +license: MIT +license_family: MIT +size: 357913 +timestamp: 1754665583353 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda +sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 +md5: ab7288cc39545556d1bc5e71ab2df9a9 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +size: 636733 +timestamp: 1769712412683 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda +sha256: 977dfb0cb3935d748521dd80262fe7169ab82920afd38ed14b7fee2ea5ec01ba +md5: bb5a90c93e3bac3d5690acf76b4a6386 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libice-1.1.2-h86ecc28_0.conda +sha256: a2ba1864403c7eb4194dacbfe2777acf3d596feae43aada8d1b478617ce45031 +md5: c8d8ec3e00cd0fd8a231789b91a7c5b7 +depends: +- libgcc >=13 +license: MIT +license_family: MIT +size: 60433 +timestamp: 1734229908988 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libsm-1.2.6-h0808dbd_0.conda +sha256: b86a819cd16f90c01d9d81892155126d01555a20dabd5f3091da59d6309afd0a +md5: 2d1409c50882819cb1af2de82e2b7208 +depends: +- libgcc >=13 +- libuuid >=2.38.1,<3.0a0 +- xorg-libice >=1.1.2,<2.0a0 +license: MIT +license_family: MIT +size: 28701 +timestamp: 1741897678254 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libx11-1.8.13-h63a1b12_0.conda +sha256: cf886160e2ff580d77f7eb8ec1a77c41c2c5b05343e329bc35f0ddf40b8d92ab +md5: 22dd10425ef181e80e130db50675d615 +depends: +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +license: MIT +license_family: MIT +size: 869058 +timestamp: 1770819244991 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda +sha256: e9f6e931feeb2f40e1fdbafe41d3b665f1ab6cb39c5880a1fcf9f79a3f3c84a5 +md5: 1c246e1105000c3660558459e2fd6d43 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 16317 +timestamp: 1762977521691 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda +sha256: 128d72f36bcc8d2b4cdbec07507542e437c7d67f677b7d77b71ed9eeac7d6df1 +md5: bff06dcde4a707339d66d45d96ceb2e2 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxext-1.3.7-he30d5cf_0.conda +sha256: db2188bc0d844d4e9747bac7f6c1d067e390bd769c5ad897c93f1df759dc5dba +md5: fb42b683034619915863d68dd9df03a3 +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 52409 +timestamp: 1769446753771 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxfixes-6.0.2-he30d5cf_0.conda +sha256: 8cb9c88e25c57e47419e98f04f9ef3154ad96b9f858c88c570c7b91216a64d0e +md5: e8b4056544341daf1d415eaeae7a040c +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +license: MIT +license_family: MIT +size: 20704 +timestamp: 1759284028146 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxi-1.8.2-h57736b2_0.conda +sha256: 7b587407ecb9ccd2bbaf0fb94c5dbdde4d015346df063e9502dc0ce2b682fb5e +md5: eeee3bdb31c6acde2b81ad1b8c287087 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxfixes >=6.0.1,<7.0a0 +license: MIT +license_family: MIT +size: 48197 +timestamp: 1727801059062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrandr-1.5.5-he30d5cf_0.conda +sha256: 9f5196665a8d72f4f119c40dcc4bafeb0b540b102cc7b8b299c2abf599e7919f +md5: 1f64c613f0b8d67e9fb0e165d898fb6b +depends: +- libgcc >=14 +- xorg-libx11 >=1.8.12,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxrender >=0.9.12,<0.10.0a0 +license: MIT +license_family: MIT +size: 31122 +timestamp: 1769445286951 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxrender-0.9.12-h86ecc28_0.conda +sha256: ffd77ee860c9635a28cfda46163dcfe9224dc6248c62404c544ae6b564a0be1f +md5: ae2c2dd0e2d38d249887727db2af960e +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.10,<2.0a0 +license: MIT +license_family: MIT +size: 33649 +timestamp: 1734229123157 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxt-1.3.1-h57736b2_0.conda +sha256: 7c109792b60720809a580612aba7f8eb2a0bd425b9fc078748a9d6ffc97cbfa8 +md5: a9e4852c8e0b68ee783e7240030b696f +depends: +- libgcc >=13 +- xorg-libice >=1.1.1,<2.0a0 +- xorg-libsm >=1.2.4,<2.0a0 +- xorg-libx11 >=1.8.9,<2.0a0 +license: MIT +license_family: MIT +size: 384752 +timestamp: 1731860572314 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxtst-1.2.5-h57736b2_3.conda +sha256: 6eaffce5a34fc0a16a21ddeaefb597e792a263b1b0c387c1ce46b0a967d558e1 +md5: c05698071b5c8e0da82a282085845860 +depends: +- libgcc >=13 +- xorg-libx11 >=1.8.9,<2.0a0 +- xorg-libxext >=1.3.6,<2.0a0 +- xorg-libxi >=1.7.10,<2.0a0 +license: MIT +license_family: MIT +size: 33786 +timestamp: 1727964907993 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +sha256: 569990cf12e46f9df540275146da567d9c618c1e9c7a0bc9d9cfefadaed20b75 +md5: c3655f82dcea2aa179b291e7099c1fcc +depends: +- libzlib >=1.3.1,<2.0a0 +license: BSD-3-Clause +license_family: BSD +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 23e16634c3..10851264c1 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -1,37 +1,40 @@ process FASTQC { tag "${meta.id}" - label 'process_medium' + label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : - 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' + : 'quay.io/biocontainers/fastqc:0.12.1--hdfd78af_0'}" input: - tuple val(meta), path(reads) + tuple val(meta), path(reads, stageAs: '?/*') output: tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions + tuple val(meta), path("*.zip"), emit: zip + tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ _old_name, new_name -> new_name }.join(' ') + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[reads, "${prefix}.${reads.extension}"]] : reads.withIndex().collect { entry, index -> [entry, "${prefix}_${index + 1}.${entry.extension}"] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect { _old_name, new_name -> new_name }.join(' ') // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 - // Dividing the task.memory by task.cpu allows to stick to requested amount of RAM in the label - def memory_in_mb = task.memory ? task.memory.toUnit('MB') / task.cpus : null + // Dividing the task.memory by task.cpus allows to stick to requested amount of RAM in the label + def memory_in_mb = task.memory + ? (task.memory.toUnit('MB') / task.cpus).intValue() + : null // FastQC memory value allowed range (100 - 10000) def fastqc_memory = memory_in_mb > 10000 ? 10000 : (memory_in_mb < 100 ? 100 : memory_in_mb) + def fastqc_memory_arg = fastqc_memory ? "--memory ${fastqc_memory}" : '' """ printf "%s %s\\n" ${rename_to} | while read old_name new_name; do @@ -41,13 +44,8 @@ process FASTQC { fastqc \\ ${args} \\ --threads ${task.cpus} \\ - --memory ${fastqc_memory} \\ + ${fastqc_memory_arg} \\ ${renamed_files} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ stub: @@ -55,10 +53,5 @@ process FASTQC { """ touch ${prefix}.html touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ } diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index c8d9d025ac..2f6cfef6d0 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -53,13 +53,28 @@ output: description: FastQC report archive pattern: "*_{fastqc.zip}" ontologies: [] + versions_fastqc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + 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 + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@grst" @@ -70,3 +85,27 @@ maintainers: - "@grst" - "@ewels" - "@FelixKrueger" +containers: + docker: + linux/arm64: + name: community.wave.seqera.io/library/fastqc:0.12.1--e455e32f745abe68 + build_id: bd-e455e32f745abe68_1 + scan_id: sc-f102f736465af88c_1 + linux/amd64: + name: community.wave.seqera.io/library/fastqc:0.12.1--5cb1a2fa2f18c7c2 + build_id: bd-5cb1a2fa2f18c7c2_1 + scan_id: sc-0c0466326b6b77d2_1 + singularity: + linux/amd64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--5c4bd442468d75dd + build_id: bd-5c4bd442468d75dd_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f2/f20b021476d1d87658820f971ebecc1e8cdbde0f338eb0d9cea2b0a8fc54a54b/data + linux/arm64: + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--127a87fc06499035 + build_id: bd-127a87fc06499035_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/46/46daf2dad0169afd2ae047c3e50ed3776259f664bf07e5e06b045dc23449e994/data + conda: + linux/amd64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_amd64-bd-5cb1a2fa2f18c7c2_1.txt + linux/arm64: + lock_file: modules/nf-core/fastqc/.conda-lock/linux_arm64-bd-e455e32f745abe68_1.txt diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-839587b417d23042_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt similarity index 92% rename from modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-839587b417d23042_1.txt rename to modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt index 33a1c6925a..2a91c22d61 100644 --- a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-839587b417d23042_1.txt +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt @@ -17,27 +17,27 @@ linux-64: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.0-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.0-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda @@ -48,7 +48,7 @@ linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda @@ -75,21 +75,22 @@ linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_0.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.40.1-pyh58ad624_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.1-py310h49dadd8_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.41.0-py310h49dadd8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.41.0-py310hcbd6021_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda @@ -97,9 +98,9 @@ linux-64: - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda @@ -205,22 +206,22 @@ license: bzip2-1.0.6 license_family: BSD size: 260182 timestamp: 1771350215188 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda -sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d -md5: e18ad67cf881dcadee8b8d9e2f8e5f73 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f depends: - __unix license: ISC -size: 131039 -timestamp: 1776865545798 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda -sha256: 989db6e5957c4b44fa600c68c681ec2f36a55e48f7c7f1c073d5e91caa8cd878 -md5: 929471569c93acefb30282a22060dcd5 +size: 129868 +timestamp: 1779289852439 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +sha256: 645655a3510e38e625da136595f3f16f2130c3263630cc3bc8f60f619ddbe490 +md5: 9fefff2f745ea1cc2ef15211a20c054a depends: - python >=3.10 license: ISC -size: 135656 -timestamp: 1776866680878 +size: 134201 +timestamp: 1779285131141 - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 md5: a9167b9571f3baa9d448faa2139d1089 @@ -238,6 +239,7 @@ depends: - python - python >=3.10 license: BSD-3-Clause +license_family: BSD size: 104631 timestamp: 1779108494556 - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda @@ -261,27 +263,27 @@ license: BSD-3-Clause license_family: BSD size: 39326 timestamp: 1735759976140 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda noarch: generic -sha256: 40dc224f2b718e5f034efd2332bc315a719063235f63673468d26a24770094ee -md5: f111d4cfaf1fe9496f386bc98ae94452 +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab depends: - python >=3.14,<3.15.0a0 - python_abi * *_cp314 license: Python-2.0 -size: 49809 -timestamp: 1775614256655 -- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.0-hecca717_0.conda -sha256: ca4dc1da00a8aaa56c1088e7f45f1859ecea6f75874e67584f1af6e5cf8179f8 -md5: 992e529e407c9d67d50be1d7543fde4c +size: 50212 +timestamp: 1779236682725 +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.8.1-hecca717_0.conda +sha256: 29a10599d56d93bd750914888ebe6822d47722070762b4647b34d12df9f4476e +md5: d0757fd84af06f065eba49d39af6c546 depends: - __glibc >=2.17,<3.0.a0 -- libexpat 2.8.0 hecca717_0 +- libexpat 2.8.1 hecca717_0 - libgcc >=14 license: MIT license_family: MIT -size: 148114 -timestamp: 1777846120303 +size: 148238 +timestamp: 1779278694477 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 @@ -310,21 +312,21 @@ license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 license_family: Other size: 1620504 timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda -sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c -md5: 867127763fbe935bab59815b6e0b7b5c +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.0-h27c8c51_0.conda +sha256: e798086d8a65d55dc4c51f5746705639c9a5f2eeb0b8fc50e6152cfc0d69a4e8 +md5: 06965b2f9854d0b15e0443ee81fe83dc depends: - __glibc >=2.17,<3.0.a0 -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 - libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT -size: 270705 -timestamp: 1771382710863 +size: 280882 +timestamp: 1779421631622 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 md5: a7970cd949a077b7cb9696379d338681 @@ -386,27 +388,26 @@ license: MIT license_family: MIT size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda -sha256: 9ab620e6f64bb67737bd7bc1ad6f480770124e304c6710617aba7fe60b089f48 -md5: fb7130c190f9b4ec91219840a05ba3ac +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +sha256: 3d25f9f6f7ab3e1ce6429fc8c8aae0335cf446692e715068488536d220cc43de +md5: 1b9083b7f00609605d1483dbc6071a81 depends: - python >=3.10 - python license: BSD-3-Clause license_family: BSD -size: 59038 -timestamp: 1776947141407 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 -md5: 080594bf4493e6bae2607e65390c520a +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 +md5: ffc17e785d64e12fc311af9184221839 depends: - python >=3.10 - zipp >=3.20 - python license: Apache-2.0 -license_family: APACHE -size: 34387 -timestamp: 1773931568510 +size: 34766 +timestamp: 1779714582554 - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b md5: 04558c96691bed63104678757beb4f8d @@ -536,18 +537,18 @@ license: MIT license_family: MIT size: 73490 timestamp: 1761979956660 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.0-hecca717_0.conda -sha256: ea33c40977ea7a2c3658c522230058395bc2ee0d89d99f0711390b6a1ee80d12 -md5: a3b390520c563d78cc58974de95a03e5 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_0.conda +sha256: 363018b25fdb5534c79783d912bd4b685a3547f4fc5996357ad548899b0ee8e7 +md5: 93764a5ca80616e9c10106cdaec92f74 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: -- expat 2.8.0.* +- expat 2.8.1.* license: MIT license_family: MIT -size: 77241 -timestamp: 1777846112704 +size: 77294 +timestamp: 1779278686680 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -749,6 +750,7 @@ depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause +license_family: BSD size: 40163 timestamp: 1779118517630 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda @@ -838,9 +840,9 @@ license: MIT license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_0.conda -sha256: 5267ddcc9119b8bdfdddd83fa4713edf6e956443f7369ebd686dc6d9f921a428 -md5: d95457757ad503af93145630ec6e8965 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 depends: - click - coloredlogs @@ -855,6 +857,7 @@ depends: - pillow >=10.2.0 - plotly >=5.18 - polars >=1.34.0 +- polars-runtime-compat >=1.34.0 - pyaml-env - pydantic >=2.7.1 - python >=3.9,!=3.14.1 @@ -870,8 +873,8 @@ depends: - typeguard >=4 license: GPL-3.0-or-later license_family: GPL3 -size: 4229065 -timestamp: 1778635617929 +size: 4282188 +timestamp: 1779465338806 - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 md5: 6687827c332121727ce383919e1ec8c2 @@ -941,9 +944,9 @@ license: MPL-2.0 license_family: MOZILLA size: 2057773 timestamp: 1763485556350 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.5-py314h2b28147_0.conda -sha256: 8e796bac2558ff5f2d00a2d0bbe4821d518347a8f70afb53b5acf27adb135197 -md5: 64a8d5cd0553d51590a304a28c184785 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda +sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 +md5: f49b5f950379e0b97c35ca97682f7c6a depends: - python - libstdcxx >=14 @@ -957,8 +960,8 @@ constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD -size: 8930431 -timestamp: 1778894356567 +size: 8928909 +timestamp: 1779169198391 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d md5: 11b3379b191f63139e29c0d19dee24cd @@ -1028,11 +1031,11 @@ license: MIT license_family: MIT size: 5251872 timestamp: 1772628857717 -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.40.1-pyh58ad624_1.conda -sha256: 83e37ede46e8e57d4785e804604a88fa02d6eac9a774cee40d49018f9da9ead1 -md5: bdbac766376390889b74216b70206af4 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 depends: -- polars-runtime-32 ==1.40.1 +- polars-runtime-32 ==1.41.0 - python >=3.10 - python constrains: @@ -1046,30 +1049,44 @@ constrains: - pyiceberg >=0.7.1 - altair >=5.4.0 - great_tables >=0.8.0 -- polars-runtime-32 ==1.40.1 -- polars-runtime-64 ==1.40.1 -- polars-runtime-compat ==1.40.1 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 license: MIT -license_family: MIT -size: 539000 -timestamp: 1778779696741 -- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.1-py310h49dadd8_1.conda +size: 539656 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.41.0-py310h49dadd8_0.conda noarch: python -sha256: c163631030b3c53174019e577ffaa9c83dab3bbaa1e6336001c5ed2faae364ba -md5: 5072dd8db4336777a95a1dd12e24623a +sha256: e51ee3fe5259f2e115b2f78f8fbe3554e419c7c82b0c110878e12a5ff95ce3ab +md5: 7682765a1588e5ac887c99736d297c93 depends: - python +- __glibc >=2.17,<3.0.a0 +- libstdcxx >=14 - libgcc >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +size: 42578921 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.41.0-py310hcbd6021_0.conda +noarch: python +sha256: 29c3831c92394af11d9f7d04882dda9479ffbb76a3d36ba155d52159d67805fa +md5: cb0b620c9914a07a9022cb8b183ea9ee +depends: +- python - libstdcxx >=14 +- libgcc >=14 - __glibc >=2.17,<3.0.a0 - _python_abi3_support 1.* - cpython >=3.10 constrains: - __glibc >=2.17 license: MIT -license_family: MIT -size: 42001857 -timestamp: 1778779696741 +size: 41864944 +timestamp: 1779630722548 - conda: https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda sha256: 4ce2e1ee31a6217998f78c31ce7dc0a3e0557d9238b51d49dd20c52d467a126d md5: f2c23a77b25efcad57d377b34bd84941 @@ -1149,23 +1166,23 @@ license: BSD-3-Clause license_family: BSD size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda build_number: 100 -sha256: dec247c5badc811baa34d6085df9d0465535883cf745e22e8d79092ad54a3a7b -md5: a443f87920815d41bfe611296e507995 +sha256: 55eed9bf2a3f6e90311276f0834737fe7c2d9ec3e5e2e557507858df4c7521e6 +md5: da92e59ff92f2d5ede4f612af20f583f depends: - __glibc >=2.17,<3.0.a0 - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-64 >=2.36.1 -- libexpat >=2.7.5,<3.0a0 +- libexpat >=2.8.0,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 -- liblzma >=5.8.2,<6.0a0 +- liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 -- libsqlite >=3.52.0,<4.0a0 -- libuuid >=2.42,<3.0a0 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 - libzlib >=1.3.2,<2.0a0 -- ncurses >=6.5,<7.0a0 +- ncurses >=6.6,<7.0a0 - openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 @@ -1173,8 +1190,8 @@ depends: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 -size: 36705460 -timestamp: 1775614357822 +size: 36745188 +timestamp: 1779236923603 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 @@ -1185,15 +1202,15 @@ license: BSD-3-Clause license_family: BSD size: 27848 timestamp: 1772388605021 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda -sha256: 36ff7984e4565c85149e64f8206303d412a0652e55cf806dcb856903fa056314 -md5: e4e60721757979d01d3964122f674959 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff depends: -- cpython 3.14.4.* +- cpython 3.14.5.* - python_abi * *_cp314 license: Python-2.0 -size: 49806 -timestamp: 1775614307464 +size: 50212 +timestamp: 1779236703009 - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 md5: 310259a5b03ff02289d7705f39e2b1d2 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-3e45d17b40a576b4_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt similarity index 92% rename from modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-3e45d17b40a576b4_1.txt rename to modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt index 492ce48050..3d5b93db98 100644 --- a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-3e45d17b40a576b4_1.txt +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt @@ -17,27 +17,27 @@ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.0-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.1-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.0-hba86a56_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda @@ -48,7 +48,7 @@ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-7_haddc8a3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-7_hd72aa62_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda @@ -75,21 +75,22 @@ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_0.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.5-py314he1698a1_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py314he1698a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.40.1-pyh58ad624_1.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.40.1-py310h32c7c23_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.41.0-py310h32c7c23_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.41.0-py310hc0e61be_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda @@ -97,9 +98,9 @@ linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py314h451b6cc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.5-hfd9ac0a_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda @@ -203,22 +204,22 @@ license: bzip2-1.0.6 license_family: BSD size: 192412 timestamp: 1771350241232 -- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda -sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d -md5: e18ad67cf881dcadee8b8d9e2f8e5f73 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f depends: - __unix license: ISC -size: 131039 -timestamp: 1776865545798 -- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda -sha256: 989db6e5957c4b44fa600c68c681ec2f36a55e48f7c7f1c073d5e91caa8cd878 -md5: 929471569c93acefb30282a22060dcd5 +size: 129868 +timestamp: 1779289852439 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.5.20-pyhd8ed1ab_0.conda +sha256: 645655a3510e38e625da136595f3f16f2130c3263630cc3bc8f60f619ddbe490 +md5: 9fefff2f745ea1cc2ef15211a20c054a depends: - python >=3.10 license: ISC -size: 135656 -timestamp: 1776866680878 +size: 134201 +timestamp: 1779285131141 - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 md5: a9167b9571f3baa9d448faa2139d1089 @@ -236,6 +237,7 @@ depends: - python - python >=3.10 license: BSD-3-Clause +license_family: BSD size: 104631 timestamp: 1779108494556 - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda @@ -259,26 +261,26 @@ license: BSD-3-Clause license_family: BSD size: 39326 timestamp: 1735759976140 -- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda noarch: generic -sha256: 40dc224f2b718e5f034efd2332bc315a719063235f63673468d26a24770094ee -md5: f111d4cfaf1fe9496f386bc98ae94452 +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab depends: - python >=3.14,<3.15.0a0 - python_abi * *_cp314 license: Python-2.0 -size: 49809 -timestamp: 1775614256655 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.0-hfae3067_0.conda -sha256: f9eebe138dfa9693bfeab5fb7eac012474fa6dc8aaccd62d23b648b360db1bff -md5: 424b4cda90c1fa95f2d027f76d5ef97f +size: 50212 +timestamp: 1779236682725 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.1-hfae3067_0.conda +sha256: a9cd5eb1700e11cc39acc36630a2d72a4e317943bd7c5695cd8804419f04ff42 +md5: 89f0247b3cea528d8ad1a6664a313153 depends: -- libexpat 2.8.0 hfae3067_0 +- libexpat 2.8.1 hfae3067_0 - libgcc >=14 license: MIT license_family: MIT -size: 140559 -timestamp: 1777846104900 +size: 140114 +timestamp: 1779278679081 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b md5: 0c96522c6bdaed4b1566d11387caaf45 @@ -307,20 +309,20 @@ license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 license_family: Other size: 1620504 timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda -sha256: 835aff8615dd8d8fff377679710ce81b8a2c47b6404e21a92fb349fda193a15c -md5: 0fed1ff55f4938a65907f3ecf62609db +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.0-hba86a56_0.conda +sha256: 1805f4ab3d9e1734a5a17abccc2cb0fdade51d4d5f29bdc410600ea0115ec050 +md5: b660d59a9d0fb3297327418624acaec3 depends: -- libexpat >=2.7.4,<3.0a0 -- libfreetype >=2.14.1 -- libfreetype6 >=2.14.1 +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 - libgcc >=14 -- libuuid >=2.41.3,<3.0a0 -- libzlib >=1.3.1,<2.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 license: MIT license_family: MIT -size: 279044 -timestamp: 1771382728182 +size: 293348 +timestamp: 1779421661332 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 md5: a7970cd949a077b7cb9696379d338681 @@ -382,27 +384,26 @@ license: MIT license_family: MIT size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda -sha256: 9ab620e6f64bb67737bd7bc1ad6f480770124e304c6710617aba7fe60b089f48 -md5: fb7130c190f9b4ec91219840a05ba3ac +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.15-pyhcf101f3_0.conda +sha256: 3d25f9f6f7ab3e1ce6429fc8c8aae0335cf446692e715068488536d220cc43de +md5: 1b9083b7f00609605d1483dbc6071a81 depends: - python >=3.10 - python license: BSD-3-Clause license_family: BSD -size: 59038 -timestamp: 1776947141407 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda -sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 -md5: 080594bf4493e6bae2607e65390c520a +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda +sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 +md5: ffc17e785d64e12fc311af9184221839 depends: - python >=3.10 - zipp >=3.20 - python license: Apache-2.0 -license_family: APACHE -size: 34387 -timestamp: 1773931568510 +size: 34766 +timestamp: 1779714582554 - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b md5: 04558c96691bed63104678757beb4f8d @@ -528,17 +529,17 @@ license: MIT license_family: MIT size: 71117 timestamp: 1761979776756 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.0-hfae3067_0.conda -sha256: 206c422a7f4b462d1dc17d558f0299088d0992bd3309ae83f5440fcc4f130602 -md5: 3bacd6171f0a3f8fddd06c3d5ae01955 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.8.1-hfae3067_0.conda +sha256: 1fc392b997c6ee2bd3226a7cd870d0edbcbb367e25f9f18dd4a7025fced6efc0 +md5: 513dd884361dfb8a554298ed69b58823 depends: - libgcc >=14 constrains: -- expat 2.8.0.* +- expat 2.8.1.* license: MIT license_family: MIT -size: 76996 -timestamp: 1777846096032 +size: 77140 +timestamp: 1779278671302 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda sha256: 3df4c539449aabc3443bbe8c492c01d401eea894603087fca2917aa4e1c2dea9 md5: 2f364feefb6a7c00423e80dcb12db62a @@ -725,6 +726,7 @@ md5: 0f42f9fedd2a32d798de95a7f65c456f depends: - libgcc >=14 license: BSD-3-Clause +license_family: BSD size: 43453 timestamp: 1779118526838 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda @@ -809,9 +811,9 @@ license: MIT license_family: MIT size: 14465 timestamp: 1733255681319 -- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_0.conda -sha256: 5267ddcc9119b8bdfdddd83fa4713edf6e956443f7369ebd686dc6d9f921a428 -md5: d95457757ad503af93145630ec6e8965 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 depends: - click - coloredlogs @@ -826,6 +828,7 @@ depends: - pillow >=10.2.0 - plotly >=5.18 - polars >=1.34.0 +- polars-runtime-compat >=1.34.0 - pyaml-env - pydantic >=2.7.1 - python >=3.9,!=3.14.1 @@ -841,8 +844,8 @@ depends: - typeguard >=4 license: GPL-3.0-or-later license_family: GPL3 -size: 4229065 -timestamp: 1778635617929 +size: 4282188 +timestamp: 1779465338806 - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 md5: 6687827c332121727ce383919e1ec8c2 @@ -909,23 +912,23 @@ license: MPL-2.0 license_family: MOZILLA size: 2061869 timestamp: 1763490303490 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.5-py314he1698a1_0.conda -sha256: 84c4b05037cc1b73749c41977bc3e204b3f4a11cc750984b44d3462a6eb865a3 -md5: bdb49f3f231962d4bca98ed2c59ab92f +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py314he1698a1_0.conda +sha256: 04af718b911f8a3a0095481c7e283aa081a175fe626eccbc2c5644bcb2aba9a1 +md5: 8b173772deea177b45d2a133b509b3f7 depends: - python - libstdcxx >=14 - libgcc >=14 +- python_abi 3.14.* *_cp314 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 -- python_abi 3.14.* *_cp314 - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD -size: 8005231 -timestamp: 1778894364326 +size: 8002900 +timestamp: 1779169206742 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 md5: cea962410e327262346d48d01f05936c @@ -993,11 +996,11 @@ license: MIT license_family: MIT size: 5251872 timestamp: 1772628857717 -- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.40.1-pyh58ad624_1.conda -sha256: 83e37ede46e8e57d4785e804604a88fa02d6eac9a774cee40d49018f9da9ead1 -md5: bdbac766376390889b74216b70206af4 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 depends: -- polars-runtime-32 ==1.40.1 +- polars-runtime-32 ==1.41.0 - python >=3.10 - python constrains: @@ -1011,17 +1014,31 @@ constrains: - pyiceberg >=0.7.1 - altair >=5.4.0 - great_tables >=0.8.0 -- polars-runtime-32 ==1.40.1 -- polars-runtime-64 ==1.40.1 -- polars-runtime-compat ==1.40.1 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 license: MIT -license_family: MIT -size: 539000 -timestamp: 1778779696741 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.40.1-py310h32c7c23_1.conda +size: 539656 +timestamp: 1779630790562 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.41.0-py310h32c7c23_0.conda noarch: python -sha256: 2d7a84c62957f87ad4727d7c012ac6a14a45080565112b60232d13129d1ee5aa -md5: 3d94d946f9619f549a0a325120165745 +sha256: d903b774ec09189e164207328aac157eee82fed8cc5c9ace46aeb5d1c15cb5b3 +md5: 8c08c506ed1ea8ce0ca37af5e918c58d +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +size: 38704429 +timestamp: 1779630794932 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.41.0-py310hc0e61be_0.conda +noarch: python +sha256: 101696adff43a654146376c62ef9611bf7946b95fa46f604fe247d77eefc6267 +md5: 65b73e4260677ee5162bdbb252e28e06 depends: - python - libstdcxx >=14 @@ -1031,9 +1048,8 @@ depends: constrains: - __glibc >=2.17 license: MIT -license_family: MIT -size: 38145061 -timestamp: 1778779658728 +size: 38651498 +timestamp: 1779630714016 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda sha256: e9cbcbc94e151ada3d6dc365380aaaf591f65012c16d9a2abaea4b9b90adc402 md5: ab7288cc39545556d1bc5e71ab2df9a9 @@ -1111,22 +1127,22 @@ license: BSD-3-Clause license_family: BSD size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.5-hfd9ac0a_100_cp314.conda build_number: 100 -sha256: d29da77f75e8f9184cc9502d5c44be87397291a9e88819d5418322a173f76303 -md5: 3cfbe780f0f51cc8cba41db9f8a28bfe +sha256: d37bad5447365346166c72950ea8f49689aa49cecc1b0623d00458427627b8df +md5: d956e09feb806f5974675ce92ad81d45 depends: - bzip2 >=1.0.8,<2.0a0 - ld_impl_linux-aarch64 >=2.36.1 -- libexpat >=2.7.5,<3.0a0 +- libexpat >=2.8.0,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 -- liblzma >=5.8.2,<6.0a0 +- liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 -- libsqlite >=3.52.0,<4.0a0 -- libuuid >=2.42,<3.0a0 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 - libzlib >=1.3.2,<2.0a0 -- ncurses >=6.5,<7.0a0 +- ncurses >=6.6,<7.0a0 - openssl >=3.5.6,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 @@ -1134,8 +1150,8 @@ depends: - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 -size: 37409899 -timestamp: 1775613674766 +size: 37510439 +timestamp: 1779236267040 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 @@ -1146,15 +1162,15 @@ license: BSD-3-Clause license_family: BSD size: 27848 timestamp: 1772388605021 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda -sha256: 36ff7984e4565c85149e64f8206303d412a0652e55cf806dcb856903fa056314 -md5: e4e60721757979d01d3964122f674959 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff depends: -- cpython 3.14.4.* +- cpython 3.14.5.* - python_abi * *_cp314 license: Python-2.0 -size: 49806 -timestamp: 1775614307464 +size: 50212 +timestamp: 1779236703009 - conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 md5: 310259a5b03ff02289d7705f39e2b1d2 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 4c593a9714..c4bc715e22 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -4,8 +4,8 @@ process MULTIQC { conda "${moduleDir}/environment.yml" container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container - ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/12/1297c0f5075c19486da167ebf1b6136907d6b5339697b87b29fda335221785b3/data' - : 'community.wave.seqera.io/library/multiqc:1.35--839587b417d23042'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' + : 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc'}" input: tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index b85d0e356b..27ce18d8d8 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -110,24 +110,24 @@ maintainers: containers: conda: linux/amd64: - lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-839587b417d23042_1.txt + lock_file: modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt linux/arm64: - lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-3e45d17b40a576b4_1.txt + lock_file: modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt docker: linux/amd64: - name: community.wave.seqera.io/library/multiqc:1.35--839587b417d23042 - build_id: bd-839587b417d23042_1 - scan_id: sc-f87d7a31551c029f_1 + name: community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc + build_id: bd-c17fb751507e9dfc_1 + scan_id: sc-3b1b3932f9846892_1 linux/arm64: - name: community.wave.seqera.io/library/multiqc:1.35--3e45d17b40a576b4 - build_id: bd-3e45d17b40a576b4_1 - scan_id: sc-1d0cf4ed1a4b61e0_1 + name: community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5 + build_id: bd-5c84a5000a226ab5_1 + scan_id: sc-0d39df41e9737bbd_1 singularity: linux/amd64: - name: oras://community.wave.seqera.io/library/multiqc:1.35--cb7458fda84d6393 - build_id: bd-cb7458fda84d6393_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/12/1297c0f5075c19486da167ebf1b6136907d6b5339697b87b29fda335221785b3/data + name: oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2 + build_id: bd-c680f2aea25ccec2_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data linux/arm64: - name: oras://community.wave.seqera.io/library/multiqc:1.35--f79e87603d312ac0 - build_id: bd-f79e87603d312ac0_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c0/c007304153702edc622f1a76b41505e7fca65c7145e5b8b2ddce62a5c59af207/data + name: oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81 + build_id: bd-c0468833d65b2f81_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data diff --git a/nextflow.config b/nextflow.config index 92652de02d..4a9b5bcd74 100644 --- a/nextflow.config +++ b/nextflow.config @@ -765,7 +765,7 @@ manifest { description = """An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=25.10.2' + nextflowVersion = '!>=25.10.4' version = '3.9.1dev' doi = '10.12688/f1000research.16665.2, 10.1093/nargab/lqae031, 10.5281/zenodo.3476425' } diff --git a/nf-test.config b/nf-test.config index c9c6b63ae2..b5d473da72 100644 --- a/nf-test.config +++ b/nf-test.config @@ -1,21 +1,35 @@ config { // location for all nf-test tests - testsDir "." + testsDir = "." // nf-test directory including temporary files for each test - workDir System.getenv("NFT_WORKDIR") ?: ".nf-test" + workDir = System.getenv("NFT_WORKDIR") ?: ".nf-test" // location of an optional nextflow.config file specific for executing tests - configFile "tests/nextflow.config" + configFile = "tests/nextflow.config" // ignore tests coming from the nf-core/modules repo - ignore 'modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*' + ignore = [ + 'modules/nf-core/**/tests/*', + 'subworkflows/nf-core/**/tests/*', + ] // run all test with defined profile(s) from the main nextflow.config - profile "test" + profile = "test" // list of filenames or patterns that should be trigger a full test run - triggers 'assets/schema_input.json', 'conf/test.config', 'nextflow.config', 'nextflow_schema.json', 'nf-test.config', 'tests/.nftignore', 'tests/nextflow.config' + triggers = [ + '.github/actions/nf-test/action.yml', + '.github/workflows/nf-test.yml', + 'assets/schema_input.json', + 'bin/*', + 'conf/test.config', + 'nextflow.config', + 'nextflow_schema.json', + 'nf-test.config', + 'tests/.nftignore', + 'tests/nextflow.config', + ] // load the necessary plugins plugins { diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 1b96b6ccf1..e9a4db0dfb 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "InProgress", - "datePublished": "2026-06-30T11:52:57+00:00", - "description": "

\n \n \n \"nf-core/sarek\"\n \n

\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/nf-core/sarek)\n[![GitHub Actions CI Status](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/sarek/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/sarek/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3476425-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3476425)\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.10.2-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/nf-core/sarek)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/sarek)\n[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)\n[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)\n[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/sarek** is a workflow designed to detect variants on whole genome or targeted sequencing data. Initially designed for Human, and Mouse, it can work on any species with a reference genome. Sarek can also handle tumour / normal pairs and could include additional relapses.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/sarek/results).\n\nIt's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/nf-core-sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek).\n\n

\n \n

\n\n## Pipeline summary\n\nDepending on the options and samples provided, the pipeline can currently perform the following:\n\n- Form consensus reads from UMI sequences (`fgbio`)\n- Sequencing quality control and trimming (enabled by `--trim_fastq`) (`FastQC`, `fastp`)\n- Contamination removal (`BBSplit`, enabled by `--tools bbsplit`)\n- Map Reads to Reference (`BWA-mem`, `BWA-mem2`, `dragmap` or `Sentieon BWA-mem`)\n- Process BAM file (`GATK MarkDuplicates`, `GATK BaseRecalibrator` and `GATK ApplyBQSR` or `Sentieon LocusCollector` and `Sentieon Dedup`)\n- _Experimental Feature_: Use GPU-accelerated parabricks implementation as alternative to \"Map Reads to Reference\" + \"Process BAM file\" (`--aligner parabricks`)\n- Summarise alignment statistics (`samtools stats`, `mosdepth`)\n- Variant calling (enabled by `--tools`, see [compatibility](https://nf-co.re/sarek/latest/docs/usage#which-variant-calling-tool-is-implemented-for-which-data-type)):\n - `ASCAT`\n - `CNVkit`\n - `Control-FREEC`\n - `DeepVariant`\n - `freebayes`\n - `GATK HaplotypeCaller`\n - `GATK Mutect2`\n - `indexcov`\n - `Lofreq`\n - `Manta`\n - `mpileup`\n - `MSIsensor2`\n - `MSIsensor-pro`\n - `MuSE`\n - `Sentieon Haplotyper`\n - `Strelka`\n - `TIDDIT`\n- Post-variant calling options, one of:\n - Filtering (`bcftools view` (default: filter by `PASS,.`)), normalisation (`bcftools norm`) and consensus calling (`bcftools isec`, default: called by at least 2 tools `-n+2`) on all vcfs and/or `bcftools concat` for germline vcfs\n - `Varlociraptor` for all vcfs\n- Variant filtering and annotation (`SnpEff`, `Ensembl VEP`, `BCFtools annotate`, `SnpSift`)\n- Summarise and represent QC (`MultiQC`)\n\n

\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`samplesheet.csv`:\n\n```csv\npatient,sample,lane,fastq_1,fastq_2\nID1,S1,L002,ID1_S1_L002_R1_001.fastq.gz,ID1_S1_L002_R2_001.fastq.gz\n```\n\nEach row represents a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/sarek \\\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\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/sarek/usage) and the [parameter documentation](https://nf-co.re/sarek/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/sarek/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/sarek/output).\n\n## Benchmarking\n\nOn each release, the pipeline is run on 3 full size tests:\n\n- `test_full` runs tumor-normal data for one patient from the SEQ2C consortium\n- `test_full_germline` runs a WGS 30X Genome-in-a-Bottle(NA12878) dataset\n- `test_full_germline_ncbench_agilent` runs two WES samples with 75M and 200M reads (data available [here](https://github.com/ncbench/ncbench-workflow#contributing-callsets)). The results are uploaded to Zenodo, evaluated against a truth dataset, and results are made available via the [NCBench dashboard](https://ncbench.github.io/report/report.html#).\n\n## Credits\n\nSarek was originally written by Maxime U Garcia and Szilveszter Juhos at the [National Genomics Infastructure](https://ngisweden.scilifelab.se) and [National Bioinformatics Infastructure Sweden](https://nbis.se) which are both platforms at [SciLifeLab](https://scilifelab.se), with the support of [The Swedish Childhood Tumor Biobank (Barntumörbanken)](https://ki.se/forskning/barntumorbanken).\nFriederike Hanssen and Gisela Gabernet at [QBiC](https://www.qbic.uni-tuebingen.de/) later joined and helped with further development.\n\nThe Nextflow DSL2 conversion of the pipeline was lead by Friederike Hanssen and Maxime U Garcia.\n\nMaintenance is now lead by Friederike Hanssen and Maxime U Garcia (now at [Seqera](https://seqera.io))\n\nMain developers:\n\n- [Maxime U Garcia](https://github.com/maxulysse)\n- [Friederike Hanssen](https://github.com/FriederikeHanssen)\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Abhinav Sharma](https://github.com/abhi18av)\n- [Adam Talbot](https://github.com/adamrtalbot)\n- [Adrian Lärkeryd](https://github.com/adrlar)\n- [Àitor Olivares](https://github.com/AitorPeseta)\n- [Alexander Peltzer](https://github.com/apeltzer)\n- [Alison Meynert](https://github.com/ameynert)\n- [Anders Sune Pedersen](https://github.com/asp8200)\n- [arontommi](https://github.com/arontommi)\n- [BarryDigby](https://github.com/BarryDigby)\n- [Bekir Ergüner](https://github.com/berguner)\n- [bjornnystedt](https://github.com/bjornnystedt)\n- [cgpu](https://github.com/cgpu)\n- [Chela James](https://github.com/chelauk)\n- [David Mas-Ponte](https://github.com/davidmasp)\n- [Edmund Miller](https://github.com/edmundmiller)\n- [Famke Bäuerle](https://github.com/famosab)\n- [Francesco Lescai](https://github.com/lescai)\n- [Francisco Martínez](https://github.com/nevinwu)\n- [Gavin Mackenzie](https://github.com/GCJMackenzie)\n- [Gisela Gabernet](https://github.com/ggabernet)\n- [Grant Neilson](https://github.com/grantn5)\n- [gulfshores](https://github.com/gulfshores)\n- [Harshil Patel](https://github.com/drpatelh)\n- [Hongwei Ye](https://github.com/YeHW)\n- [James A. Fellows Yates](https://github.com/jfy133)\n- [Jesper Eisfeldt](https://github.com/J35P312)\n- [Johannes Alneberg](https://github.com/alneberg)\n- [Jonas Kjellin](https://github.com/kjellinjonas)\n- [José Fernández Navarro](https://github.com/jfnavarro)\n- [Júlia Mir Pedrol](https://github.com/mirpedrol)\n- [Ken Brewer](https://github.com/kenibrewer)\n- [Lasse Westergaard Folkersen](https://github.com/lassefolkersen)\n- [Lucia Conde](https://github.com/lconde-ucl)\n- [Louis Le Nézet](https://github.com/LouisLeNezet)\n- [Malin Larsson](https://github.com/malinlarsson)\n- [Marcel Martin](https://github.com/marcelm)\n- [Nick Smith](https://github.com/nickhsmith)\n- [Nicolas Schcolnicov](https://github.com/nschcolnicov)\n- [Nilesh Tawari](https://github.com/nilesh-tawari)\n- [Nils Homer](https://github.com/nh13)\n- [Olga Botvinnik](https://github.com/olgabot)\n- [Oskar Wacker](https://github.com/WackerO)\n- [pallolason](https://github.com/pallolason)\n- [Paul Cantalupo](https://github.com/pcantalupo)\n- [Phil Ewels](https://github.com/ewels)\n- [Pierre Lindenbaum](https://github.com/lindenb)\n- [Sabrina Krakau](https://github.com/skrakau)\n- [Sam Minot](https://github.com/sminot)\n- [Sebastian-D](https://github.com/Sebastian-D)\n- [Silvia Morini](https://github.com/silviamorins)\n- [Simon Pearce](https://github.com/SPPearce)\n- [Solenne Correard](https://github.com/scorreard)\n- [Susanne Jodoin](https://github.com/SusiJo)\n- [Szilveszter Juhos](https://github.com/szilvajuhos)\n- [Tobias Koch](https://github.com/KochTobi)\n- [Winni Kretzschmar](https://github.com/winni2k)\n- [Patricie Skaláková](https://github.com/Patricie34)\n\n## Acknowledgements\n\n| [![Barntumörbanken](docs/images/BTB_logo.png)](https://ki.se/forskning/barntumorbanken) | [![SciLifeLab](docs/images/SciLifeLab_logo.png)](https://scilifelab.se) |\n| :-----------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: |\n| [![National Genomics Infrastructure](docs/images/NGI_logo.png)](https://ngisweden.scilifelab.se/) | [![National Bioinformatics Infrastructure Sweden](docs/images/NBIS_logo.png)](https://nbis.se) |\n| [![QBiC](docs/images/QBiC_logo.png)](https://www.qbic.uni-tuebingen.de) | [![GHGA](docs/images/GHGA_logo.png)](https://www.ghga.de/) |\n| [![DNGC](docs/images/DNGC_logo.png)](https://eng.ngc.dk/) | |\n\n## Contributions & Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek) (you can join with [this invite](https://nf-co.re/join/slack)), or contact us: [Maxime U Garcia](mailto:maxime.garcia@seqera.io?subject=[GitHub]%20nf-core/sarek), [Friederike Hanssen](mailto:friederike.hanssen@qbic.uni-tuebingen.de?subject=[GitHub]%20nf-core/sarek)\n\n## Citations\n\nIf you use `nf-core/sarek` for your analysis, please cite the `Sarek` article as follows:\n\n> Friederike Hanssen, Maxime U Garcia, Lasse Folkersen, Anders Sune Pedersen, Francesco Lescai, Susanne Jodoin, Edmund Miller, Oskar Wacker, Nicholas Smith, nf-core community, Gisela Gabernet, Sven Nahnsen **Scalable and efficient DNA sequencing analysis on different compute infrastructures aiding variant discovery** _NAR Genomics and Bioinformatics_ Volume 6, Issue 2, June 2024, lqae031, [doi: 10.1093/nargab/lqae031](https://doi.org/10.1093/nargab/lqae031).\n\n> Garcia M, Juhos S, Larsson M et al. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants [version 2; peer review: 2 approved]** _F1000Research_ 2020, 9:63 [doi: 10.12688/f1000research.16665.2](http://dx.doi.org/10.12688/f1000research.16665.2).\n\nYou can cite the sarek zenodo record for a specific version using the following [doi: 10.5281/zenodo.3476425](https://doi.org/10.5281/zenodo.3476425)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\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\n## CHANGELOG\n\n- [CHANGELOG](CHANGELOG.md)\n", + "datePublished": "2026-07-03T08:36:13+00:00", + "description": "

\n \n \n \"nf-core/sarek\"\n \n

\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/nf-core/sarek)\n[![GitHub Actions CI Status](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-core/sarek/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-core/sarek/actions/workflows/linting.yml)\n[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/sarek/results)\n[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3476425-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3476425)\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.10.4-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/nf-core/sarek)\n\n[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23sarek-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/sarek)\n[![Follow on Bluesky](https://img.shields.io/badge/bluesky-%40nf__core-1185fe?labelColor=000000&logo=bluesky)](https://bsky.app/profile/nf-co.re)\n[![Follow on Mastodon](https://img.shields.io/badge/mastodon-nf__core-6364ff?labelColor=FFFFFF&logo=mastodon)](https://mstdn.science/@nf_core)\n[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core)\n\n## Introduction\n\n**nf-core/sarek** is a workflow designed to detect variants on whole genome or targeted sequencing data. Initially designed for Human, and Mouse, it can work on any species with a reference genome. Sarek can also handle tumour / normal pairs and could include additional relapses.\n\nThe pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community!\n\nOn release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/sarek/results).\n\nIt's listed on [Elixir - Tools and Data Services Registry](https://bio.tools/nf-core-sarek) and [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek).\n\n

\n \n

\n\n## Pipeline summary\n\nDepending on the options and samples provided, the pipeline can currently perform the following:\n\n- Form consensus reads from UMI sequences (`fgbio`)\n- Sequencing quality control and trimming (enabled by `--trim_fastq`) (`FastQC`, `fastp`)\n- Contamination removal (`BBSplit`, enabled by `--tools bbsplit`)\n- Map Reads to Reference (`BWA-mem`, `BWA-mem2`, `dragmap` or `Sentieon BWA-mem`)\n- Process BAM file (`GATK MarkDuplicates`, `GATK BaseRecalibrator` and `GATK ApplyBQSR` or `Sentieon LocusCollector` and `Sentieon Dedup`)\n- _Experimental Feature_: Use GPU-accelerated parabricks implementation as alternative to \"Map Reads to Reference\" + \"Process BAM file\" (`--aligner parabricks`)\n- Summarise alignment statistics (`samtools stats`, `mosdepth`)\n- Variant calling (enabled by `--tools`, see [compatibility](https://nf-co.re/sarek/latest/docs/usage#which-variant-calling-tool-is-implemented-for-which-data-type)):\n - `ASCAT`\n - `CNVkit`\n - `Control-FREEC`\n - `DeepVariant`\n - `freebayes`\n - `GATK HaplotypeCaller`\n - `GATK Mutect2`\n - `indexcov`\n - `Lofreq`\n - `Manta`\n - `mpileup`\n - `MSIsensor2`\n - `MSIsensor-pro`\n - `MuSE`\n - `Sentieon Haplotyper`\n - `Strelka`\n - `TIDDIT`\n- Post-variant calling options, one of:\n - Filtering (`bcftools view` (default: filter by `PASS,.`)), normalisation (`bcftools norm`) and consensus calling (`bcftools isec`, default: called by at least 2 tools `-n+2`) on all vcfs and/or `bcftools concat` for germline vcfs\n - `Varlociraptor` for all vcfs\n- Variant filtering and annotation (`SnpEff`, `Ensembl VEP`, `BCFtools annotate`, `SnpSift`)\n- Summarise and represent QC (`MultiQC`)\n\n

\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`samplesheet.csv`:\n\n```csv\npatient,sample,lane,fastq_1,fastq_2\nID1,S1,L002,ID1_S1_L002_R1_001.fastq.gz,ID1_S1_L002_R2_001.fastq.gz\n```\n\nEach row represents a pair of fastq files (paired end).\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-core/sarek \\\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\nFor more details and further functionality, please refer to the [usage documentation](https://nf-co.re/sarek/usage) and the [parameter documentation](https://nf-co.re/sarek/parameters).\n\n## Pipeline output\n\nTo see the results of an example test run with a full size dataset refer to the [results](https://nf-co.re/sarek/results) tab on the nf-core website pipeline page.\nFor more details about the output files and reports, please refer to the\n[output documentation](https://nf-co.re/sarek/output).\n\n## Benchmarking\n\nOn each release, the pipeline is run on 3 full size tests:\n\n- `test_full` runs tumor-normal data for one patient from the SEQ2C consortium\n- `test_full_germline` runs a WGS 30X Genome-in-a-Bottle(NA12878) dataset\n- `test_full_germline_ncbench_agilent` runs two WES samples with 75M and 200M reads (data available [here](https://github.com/ncbench/ncbench-workflow#contributing-callsets)). The results are uploaded to Zenodo, evaluated against a truth dataset, and results are made available via the [NCBench dashboard](https://ncbench.github.io/report/report.html#).\n\n## Credits\n\nSarek was originally written by Maxime U Garcia and Szilveszter Juhos at the [National Genomics Infastructure](https://ngisweden.scilifelab.se) and [National Bioinformatics Infastructure Sweden](https://nbis.se) which are both platforms at [SciLifeLab](https://scilifelab.se), with the support of [The Swedish Childhood Tumor Biobank (Barntumörbanken)](https://ki.se/forskning/barntumorbanken).\nFriederike Hanssen and Gisela Gabernet at [QBiC](https://www.qbic.uni-tuebingen.de/) later joined and helped with further development.\n\nThe Nextflow DSL2 conversion of the pipeline was lead by Friederike Hanssen and Maxime U Garcia.\n\nMaintenance is now lead by Friederike Hanssen (now at [Seqera](https://seqera.io)) and Maxime U Garcia.\n\nMain developers:\n\n- [Maxime U Garcia](https://github.com/maxulysse)\n- [Friederike Hanssen](https://github.com/FriederikeHanssen)\n\nWe thank the following people for their extensive assistance in the development of this pipeline:\n\n- [Abhinav Sharma](https://github.com/abhi18av)\n- [Adam Talbot](https://github.com/adamrtalbot)\n- [Adrian Lärkeryd](https://github.com/adrlar)\n- [Àitor Olivares](https://github.com/AitorPeseta)\n- [Alexander Peltzer](https://github.com/apeltzer)\n- [Alison Meynert](https://github.com/ameynert)\n- [Anders Sune Pedersen](https://github.com/asp8200)\n- [arontommi](https://github.com/arontommi)\n- [BarryDigby](https://github.com/BarryDigby)\n- [Bekir Ergüner](https://github.com/berguner)\n- [bjornnystedt](https://github.com/bjornnystedt)\n- [cgpu](https://github.com/cgpu)\n- [Chela James](https://github.com/chelauk)\n- [David Mas-Ponte](https://github.com/davidmasp)\n- [Edmund Miller](https://github.com/edmundmiller)\n- [Famke Bäuerle](https://github.com/famosab)\n- [Francesco Lescai](https://github.com/lescai)\n- [Francisco Martínez](https://github.com/nevinwu)\n- [Gavin Mackenzie](https://github.com/GCJMackenzie)\n- [Gisela Gabernet](https://github.com/ggabernet)\n- [Grant Neilson](https://github.com/grantn5)\n- [gulfshores](https://github.com/gulfshores)\n- [Harshil Patel](https://github.com/drpatelh)\n- [Hongwei Ye](https://github.com/YeHW)\n- [James A. Fellows Yates](https://github.com/jfy133)\n- [Jesper Eisfeldt](https://github.com/J35P312)\n- [Johannes Alneberg](https://github.com/alneberg)\n- [Jonas Kjellin](https://github.com/kjellinjonas)\n- [José Fernández Navarro](https://github.com/jfnavarro)\n- [Júlia Mir Pedrol](https://github.com/mirpedrol)\n- [Ken Brewer](https://github.com/kenibrewer)\n- [Lasse Westergaard Folkersen](https://github.com/lassefolkersen)\n- [Lucia Conde](https://github.com/lconde-ucl)\n- [Louis Le Nézet](https://github.com/LouisLeNezet)\n- [Malin Larsson](https://github.com/malinlarsson)\n- [Marcel Martin](https://github.com/marcelm)\n- [Nick Smith](https://github.com/nickhsmith)\n- [Nicolas Schcolnicov](https://github.com/nschcolnicov)\n- [Nilesh Tawari](https://github.com/nilesh-tawari)\n- [Nils Homer](https://github.com/nh13)\n- [Olga Botvinnik](https://github.com/olgabot)\n- [Oskar Wacker](https://github.com/WackerO)\n- [pallolason](https://github.com/pallolason)\n- [Paul Cantalupo](https://github.com/pcantalupo)\n- [Phil Ewels](https://github.com/ewels)\n- [Pierre Lindenbaum](https://github.com/lindenb)\n- [Sabrina Krakau](https://github.com/skrakau)\n- [Sam Minot](https://github.com/sminot)\n- [Sebastian-D](https://github.com/Sebastian-D)\n- [Silvia Morini](https://github.com/silviamorins)\n- [Simon Pearce](https://github.com/SPPearce)\n- [Solenne Correard](https://github.com/scorreard)\n- [Susanne Jodoin](https://github.com/SusiJo)\n- [Szilveszter Juhos](https://github.com/szilvajuhos)\n- [Tobias Koch](https://github.com/KochTobi)\n- [Winni Kretzschmar](https://github.com/winni2k)\n- [Patricie Skaláková](https://github.com/Patricie34)\n\n## Acknowledgements\n\n| [![Barntumörbanken](docs/images/BTB_logo.png)](https://ki.se/forskning/barntumorbanken) | [![SciLifeLab](docs/images/SciLifeLab_logo.png)](https://scilifelab.se) |\n| :-----------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: |\n| [![National Genomics Infrastructure](docs/images/NGI_logo.png)](https://ngisweden.scilifelab.se/) | [![National Bioinformatics Infrastructure Sweden](docs/images/NBIS_logo.png)](https://nbis.se) |\n| [![QBiC](docs/images/QBiC_logo.png)](https://www.qbic.uni-tuebingen.de) | [![GHGA](docs/images/GHGA_logo.png)](https://www.ghga.de/) |\n| [![DNGC](docs/images/DNGC_logo.png)](https://eng.ngc.dk/) | |\n\n## Contributions & Support\n\nIf you would like to contribute to this pipeline, please see the [contributing guidelines](.github/CONTRIBUTING.md).\n\nFor further information or help, don't hesitate to get in touch on the [Slack `#sarek` channel](https://nfcore.slack.com/channels/sarek), or contact the dev team on the [Slack `#sarek_dev` channel](https://nfcore.slack.com/channels/sarek_dev). (you can join with [this invite](https://nf-co.re/join/slack)).\n\n## Citations\n\nIf you use `nf-core/sarek` for your analysis, please cite the `Sarek` article as follows:\n\n> Friederike Hanssen, Maxime U Garcia, Lasse Folkersen, Anders Sune Pedersen, Francesco Lescai, Susanne Jodoin, Edmund Miller, Oskar Wacker, Nicholas Smith, nf-core community, Gisela Gabernet, Sven Nahnsen **Scalable and efficient DNA sequencing analysis on different compute infrastructures aiding variant discovery** _NAR Genomics and Bioinformatics_ Volume 6, Issue 2, June 2024, lqae031, [doi: 10.1093/nargab/lqae031](https://doi.org/10.1093/nargab/lqae031).\n\n> Garcia M, Juhos S, Larsson M et al. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants [version 2; peer review: 2 approved]** _F1000Research_ 2020, 9:63 [doi: 10.12688/f1000research.16665.2](http://dx.doi.org/10.12688/f1000research.16665.2).\n\nYou can cite the sarek zenodo record for a specific version using the following [doi: 10.5281/zenodo.3476425](https://doi.org/10.5281/zenodo.3476425)\n\nAn extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file.\n\nYou can cite the `nf-core` publication as follows:\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\n## CHANGELOG\n\n- [CHANGELOG](CHANGELOG.md)\n", "hasPart": [ { "@id": "main.nf" @@ -105,7 +105,7 @@ }, "mentions": [ { - "@id": "#b97eb6f8-b646-40a3-ae10-5f5ffb44d674" + "@id": "#9e0f3a8f-9d90-4d54-8c6c-a0a29b776d3c" } ], "name": "nf-core/sarek" @@ -145,16 +145,16 @@ ], "contributor": [ { - "@id": "#3b628590-2d18-45c2-8735-ca0ac1469638" + "@id": "#af625541-b970-4b97-8ab0-17a316b7cae2" }, { - "@id": "#e58783af-bd4e-4da8-be47-64110be9efec" + "@id": "#247aa4b3-9203-46a4-8f1e-61d5c489723f" }, { "@id": "https://orcid.org/0000-0003-1424-7840" }, { - "@id": "#5b1ef3a6-a674-419a-968c-dd4902210dd7" + "@id": "#8a809452-e771-4516-bbe0-1e24d68af311" }, { "@id": "https://orcid.org/0000-0002-6503-2180" @@ -163,7 +163,7 @@ "@id": "https://orcid.org/0000-0001-5839-1751" }, { - "@id": "#c2a47fa4-6d82-4006-b980-a095896f3748" + "@id": "#8b9760e9-82c7-4a6a-b248-79bd7ad2b053" }, { "@id": "https://orcid.org/0000-0002-5547-8568" @@ -175,7 +175,7 @@ "@id": "https://orcid.org/0000-0001-5475-0892" }, { - "@id": "#4cda009a-bb61-41e4-a4cf-7e34ba24f47b" + "@id": "#4489aab7-cad4-4024-9ae7-680e3f62d35f" }, { "@id": "https://orcid.org/0000-0002-4257-7241" @@ -187,7 +187,7 @@ "@id": "https://orcid.org/0000-0001-7409-305X" }, { - "@id": "#6f59c36f-bca8-4c87-82ad-c9092227118d" + "@id": "#05b6b43d-feda-49dc-8857-5c1de743db1f" }, { "@id": "https://orcid.org/0000-0003-1387-0251" @@ -196,28 +196,28 @@ "@id": "https://orcid.org/0000-0002-6399-9101" }, { - "@id": "#7e30bf1a-cca3-460b-b647-c765bd5cb29a" + "@id": "#998a0be1-18d5-40f4-8b2d-b38cf34567bb" }, { - "@id": "#70e64dde-3c79-45ed-9877-19625cfb5d01" + "@id": "#11030fc5-094f-45f4-87ef-7cdd57f11d2e" }, { - "@id": "#e29c293c-19df-4bf0-ae54-0ff9a4ec1497" + "@id": "#5120a9b1-e14a-4bb2-a80d-541ccabef32b" }, { - "@id": "#f2dc6677-dfb3-46e1-b26f-289cee5115be" + "@id": "#2e56838e-3d67-44ac-8d7a-d68d8e676ac8" }, { "@id": "https://orcid.org/0000-0001-6813-3051" }, { - "@id": "#97d0e55f-7192-42b9-ac51-0512e426e7de" + "@id": "#7be1bb4e-0cde-494c-8774-60946b1ae96b" }, { - "@id": "#c993a226-ea9c-49c1-9d91-eb18659cb722" + "@id": "#a0c796c5-c875-42ca-b557-fe2ac96b66ce" }, { - "@id": "#5e39fb6a-58a7-406b-9d6a-c5c4f281fd89" + "@id": "#09402bb5-a6eb-4ae7-a7b1-dcfa67184a76" }, { "@id": "https://orcid.org/0000-0003-3716-4917" @@ -229,34 +229,34 @@ "@id": "https://orcid.org/0000-0002-3830-7046" }, { - "@id": "#692a3ff8-8e27-4140-aee2-141037e8888d" + "@id": "#ac09a5c7-717f-41c6-bdc8-e688212472b2" }, { "@id": "https://orcid.org/0000-0001-6104-9260" }, { - "@id": "#6f14922a-b41f-4dd3-8661-3eaf0b99f70a" + "@id": "#d690a65c-327a-41c4-8261-5c57663c35e9" }, { "@id": "https://orcid.org/0000-0003-0708-9530" }, { - "@id": "#74c1ff6a-fa5f-4a4a-84c5-f4eefa1d3d09" + "@id": "#369d8757-d425-4b2d-96ce-f1ad800f6c89" }, { "@id": "https://orcid.org/0009-0000-0202-2703" }, { - "@id": "#ba7614f8-0190-4209-a2f4-a8a8dd8f96bf" + "@id": "#e4fb587c-918e-435b-b428-08c168306d97" }, { - "@id": "#e9bfeffd-dc8a-42f6-a3e0-5ebcb00c3097" + "@id": "#57198db3-c35c-48af-84d2-ff2001a51b44" }, { - "@id": "#093c6988-c462-4474-b731-a9a085033797" + "@id": "#65d3ef9a-2755-401d-bfdb-bdda06a5b039" }, { - "@id": "#b9b9b14b-4d16-4cc2-8689-c2abac06db13" + "@id": "#c44e3833-23dc-4cb7-8bb1-562d34a2dada" }, { "@id": "https://orcid.org/0000-0002-1127-0765" @@ -277,7 +277,7 @@ "@id": "https://orcid.org/0000-0003-3966-8481" }, { - "@id": "#14924136-a73b-406c-91eb-5f10620ea097" + "@id": "#ea5b7667-91bb-4a92-bb6b-7dad7ae3b69a" }, { "@id": "https://orcid.org/0000-0003-0148-9787" @@ -286,7 +286,7 @@ "@id": "https://orcid.org/0000-0003-0603-7907" }, { - "@id": "#1724fe39-c41b-49b9-8525-d7df86b20b98" + "@id": "#620ba4aa-b10e-4a2a-a84a-65874baade8a" }, { "@id": "https://orcid.org/0000-0002-9759-2211" @@ -304,17 +304,17 @@ "@id": "https://orcid.org/0009-0001-9152-7291" }, { - "@id": "#08187f11-d51b-40f0-b09d-a1ff8bf52d45" + "@id": "#31dce384-0d05-4394-b60f-61599eaeacb4" }, { - "@id": "#30622e12-b2e6-43e8-99ed-b07a5cf40165" + "@id": "#0f2c277a-8111-440f-8385-1a0b8a019aba" }, { "@id": "https://orcid.org/0009-0009-0647-7639" } ], "dateCreated": "", - "dateModified": "2026-06-30T13:52:57Z", + "dateModified": "2026-07-03T10:36:13Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -369,14 +369,14 @@ "url": { "@id": "https://www.nextflow.io/" }, - "version": "!>=25.10.2" + "version": "!>=25.10.4" }, { - "@id": "#b97eb6f8-b646-40a3-ae10-5f5ffb44d674", + "@id": "#9e0f3a8f-9d90-4d54-8c6c-a0a29b776d3c", "@type": "TestSuite", "instance": [ { - "@id": "#d14a97e6-1b18-45f9-919e-bed422607342" + "@id": "#f5446036-5b2b-46d5-901b-255ceff391ce" } ], "mainEntity": { @@ -385,7 +385,7 @@ "name": "Test suite for nf-core/sarek" }, { - "@id": "#d14a97e6-1b18-45f9-919e-bed422607342", + "@id": "#f5446036-5b2b-46d5-901b-255ceff391ce", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-core/sarek", "resource": "repos/nf-core/sarek/actions/workflows/nf-test.yml", @@ -547,14 +547,14 @@ "url": "https://github.com/szilvajuhos" }, { - "@id": "#3b628590-2d18-45c2-8735-ca0ac1469638", + "@id": "#af625541-b970-4b97-8ab0-17a316b7cae2", "@type": "Person", "email": "abhi18av@users.noreply.github.com", "name": "Abhinav Sharma", "url": "https://github.com/abhi18av" }, { - "@id": "#e58783af-bd4e-4da8-be47-64110be9efec", + "@id": "#247aa4b3-9203-46a4-8f1e-61d5c489723f", "@type": "Person", "affiliation": "Seqera", "email": "12817534+adamrtalbot@users.noreply.github.com", @@ -568,7 +568,7 @@ "url": "https://github.com/adrlar" }, { - "@id": "#5b1ef3a6-a674-419a-968c-dd4902210dd7", + "@id": "#8a809452-e771-4516-bbe0-1e24d68af311", "@type": "Person", "name": "Àitor Olivares", "url": "https://github.com/AitorPeseta" @@ -588,7 +588,7 @@ "url": "https://github.com/ameynert" }, { - "@id": "#c2a47fa4-6d82-4006-b980-a095896f3748", + "@id": "#8b9760e9-82c7-4a6a-b248-79bd7ad2b053", "@type": "Person", "email": "37172585+asp8200@users.noreply.github.com", "name": "Anders Sune Pedersen", @@ -614,7 +614,7 @@ "url": "https://github.com/berguner" }, { - "@id": "#4cda009a-bb61-41e4-a4cf-7e34ba24f47b", + "@id": "#4489aab7-cad4-4024-9ae7-680e3f62d35f", "@type": "Person", "name": "Björn Nystedt", "url": "https://github.com/bjornnystedt" @@ -640,7 +640,7 @@ "url": "https://github.com/davidmasp" }, { - "@id": "#6f59c36f-bca8-4c87-82ad-c9092227118d", + "@id": "#05b6b43d-feda-49dc-8857-5c1de743db1f", "@type": "Person", "affiliation": "Seqera", "email": "20095261+edmundmiller@users.noreply.github.com", @@ -663,27 +663,27 @@ "url": "https://github.com/lescai" }, { - "@id": "#7e30bf1a-cca3-460b-b647-c765bd5cb29a", + "@id": "#998a0be1-18d5-40f4-8b2d-b38cf34567bb", "@type": "Person", "email": "f.martinezpico@gmail.com", "name": "Francisco Martínez", "url": "https://github.com/nevinwu" }, { - "@id": "#70e64dde-3c79-45ed-9877-19625cfb5d01", + "@id": "#11030fc5-094f-45f4-87ef-7cdd57f11d2e", "@type": "Person", "name": "Gavin Mackenzie", "url": "https://github.com/GCJMackenzie" }, { - "@id": "#e29c293c-19df-4bf0-ae54-0ff9a4ec1497", + "@id": "#5120a9b1-e14a-4bb2-a80d-541ccabef32b", "@type": "Person", "email": "gisela.gabernet@gmail.com", "name": "Gisela Gabernet", "url": "https://github.com/ggabernet" }, { - "@id": "#f2dc6677-dfb3-46e1-b26f-289cee5115be", + "@id": "#2e56838e-3d67-44ac-8d7a-d68d8e676ac8", "@type": "Person", "email": "127763095+grantn5@users.noreply.github.com", "name": "Grant Neilson", @@ -696,7 +696,7 @@ "url": "https://github.com/gulfshores" }, { - "@id": "#97d0e55f-7192-42b9-ac51-0512e426e7de", + "@id": "#7be1bb4e-0cde-494c-8774-60946b1ae96b", "@type": "Person", "affiliation": "Seqera", "email": "drpatelh@users.noreply.github.com", @@ -704,14 +704,14 @@ "url": "https://github.com/drpatelh" }, { - "@id": "#c993a226-ea9c-49c1-9d91-eb18659cb722", + "@id": "#a0c796c5-c875-42ca-b557-fe2ac96b66ce", "@type": "Person", "email": "yehwhey@gmail.com", "name": "Hongwei Ye", "url": "https://github.com/YeHW" }, { - "@id": "#5e39fb6a-58a7-406b-9d6a-c5c4f281fd89", + "@id": "#09402bb5-a6eb-4ae7-a7b1-dcfa67184a76", "@type": "Person", "name": "James A. Fellows Yates", "url": "https://github.com/jfy133" @@ -738,7 +738,7 @@ "url": "https://github.com/kjellinjonas" }, { - "@id": "#692a3ff8-8e27-4140-aee2-141037e8888d", + "@id": "#ac09a5c7-717f-41c6-bdc8-e688212472b2", "@type": "Person", "email": "jc.fernandez.navarro@gmail.com", "name": "José Fernández Navarro", @@ -752,7 +752,7 @@ "url": "https://github.com/mirpedrol" }, { - "@id": "#6f14922a-b41f-4dd3-8661-3eaf0b99f70a", + "@id": "#d690a65c-327a-41c4-8261-5c57663c35e9", "@type": "Person", "affiliation": "Seqera", "email": "kenibrewer@users.noreply.github.com", @@ -766,7 +766,7 @@ "url": "https://github.com/lassefolkersen" }, { - "@id": "#74c1ff6a-fa5f-4a4a-84c5-f4eefa1d3d09", + "@id": "#369d8757-d425-4b2d-96ce-f1ad800f6c89", "@type": "Person", "email": "l.conde@ucl.ac.uk", "name": "Lucia Conde", @@ -779,26 +779,26 @@ "url": "https://github.com/LouisLeNezet" }, { - "@id": "#ba7614f8-0190-4209-a2f4-a8a8dd8f96bf", + "@id": "#e4fb587c-918e-435b-b428-08c168306d97", "@type": "Person", "email": "malin.larsson@liu.se", "name": "Malin Larsson", "url": "https://github.com/malinlarsson" }, { - "@id": "#e9bfeffd-dc8a-42f6-a3e0-5ebcb00c3097", + "@id": "#57198db3-c35c-48af-84d2-ff2001a51b44", "@type": "Person", "name": "Marcel Martin", "url": "https://github.com/marcelm" }, { - "@id": "#093c6988-c462-4474-b731-a9a085033797", + "@id": "#65d3ef9a-2755-401d-bfdb-bdda06a5b039", "@type": "Person", "name": "Nick Smith", "url": "https://github.com/nickhsmith" }, { - "@id": "#b9b9b14b-4d16-4cc2-8689-c2abac06db13", + "@id": "#c44e3833-23dc-4cb7-8bb1-562d34a2dada", "@type": "Person", "email": "90359308+nschcolnicov@users.noreply.github.com", "name": "Nicolas Schcolnicov", @@ -844,7 +844,7 @@ "url": "https://github.com/pcantalupo" }, { - "@id": "#14924136-a73b-406c-91eb-5f10620ea097", + "@id": "#ea5b7667-91bb-4a92-bb6b-7dad7ae3b69a", "@type": "Person", "affiliation": "Seqera", "email": "phil.ewels@scilifelab.se", @@ -866,7 +866,7 @@ "url": "https://github.com/skrakau" }, { - "@id": "#1724fe39-c41b-49b9-8525-d7df86b20b98", + "@id": "#620ba4aa-b10e-4a2a-a84a-65874baade8a", "@type": "Person", "email": "sminot@gmail.com", "name": "Sam Minot", @@ -905,13 +905,13 @@ "url": "https://github.com/SusiJo" }, { - "@id": "#08187f11-d51b-40f0-b09d-a1ff8bf52d45", + "@id": "#31dce384-0d05-4394-b60f-61599eaeacb4", "@type": "Person", "name": "Tobias Koch", "url": "https://github.com/KochTobi" }, { - "@id": "#30622e12-b2e6-43e8-99ed-b07a5cf40165", + "@id": "#0f2c277a-8111-440f-8385-1a0b8a019aba", "@type": "Person", "name": "Winni Kretzschmar", "url": "https://github.com/winni2k" diff --git a/tests/samplesheets.nf.test b/tests/samplesheets.nf.test index 981e368552..0f91781a9e 100644 --- a/tests/samplesheets.nf.test +++ b/tests/samplesheets.nf.test @@ -13,7 +13,6 @@ nextflow_pipeline { ], failure: true, snapshot: 'stderr', - ], [ name: "-profile test --step variant_calling --input tests/csv/3.0/recalibrated_somatic_two_normal_one_sample.csv", @@ -23,7 +22,6 @@ nextflow_pipeline { ], failure: true, snapshot: 'stderr', - ], [ name: "-profile test,spark --input tests/csv/3.0/fastq_single.csv --use_gatk_spark baserecalibrator,markduplicates --save_mapped --save_output_as_bam", @@ -35,7 +33,6 @@ nextflow_pipeline { ], failure: true, snapshot: 'stderr', - ], [ name: "-profile test --input tests/csv/3.0/fastq_multiple_lane_ids.csv", @@ -44,7 +41,6 @@ nextflow_pipeline { ], failure: true, snapshot: 'stderr', - ], [ name: "-profile test --input tests/csv/3.0/fastq_multiple_sample_ids.csv", @@ -53,7 +49,6 @@ nextflow_pipeline { ], failure: true, snapshot: 'stderr', - ] ] diff --git a/tests/samplesheets.nf.test.snap b/tests/samplesheets.nf.test.snap index a36cd61047..1a961beaed 100644 --- a/tests/samplesheets.nf.test.snap +++ b/tests/samplesheets.nf.test.snap @@ -1,7 +1,12 @@ { "-profile test --step variant_calling --input tests/csv/3.0/recalibrated_somatic_two_normal_one_sample.csv": { "content": [ - ["csv", "multiqc", "multiqc/index.json", "pipeline_info"], + [ + "csv", + "multiqc", + "multiqc/index.json", + "pipeline_info" + ], "No stable content", "No BAM files", "No CRAM files", @@ -10,17 +15,21 @@ "WARN: Failed to render execution report -- see the log file for details", "WARN: Failed to render execution timeline -- see the log file for details" ], - ["Patient [test] has more than one sample [2] with normal status [0] and one sample with tumor status [1]."] + [ + "Patient [test] has more than one sample [2] with normal status [0] and one sample with tumor status [1]." + ] ], + "timestamp": "2026-02-06T13:52:36.729578236", "meta": { "nf-test": "0.9.3", "nextflow": "25.10.3" - }, - "timestamp": "2026-02-06T13:52:36.729578236" + } }, "-profile test --input tests/csv/3.0/fastq_sample_with_space.csv": { "content": [ - ["pipeline_info"], + [ + "pipeline_info" + ], "No stable content", "No BAM files", "No CRAM files", @@ -32,15 +41,20 @@ "\t-> Entry 2: Error for field 'sample' (test 2): \"test 2\" does not match regular expression [^\\S+$] (Sample ID must be provided, cannot contain spaces and must be a string value)" ] ], + "timestamp": "2026-07-03T12:29:12.419007781", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-16T12:15:16.691338949" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "-profile test --input tests/csv/3.0/fastq_multiple_sample_ids.csv": { "content": [ - ["csv", "multiqc", "multiqc/index.json", "pipeline_info"], + [ + "csv", + "multiqc", + "multiqc/index.json", + "pipeline_info" + ], "No stable content", "No BAM files", "No CRAM files", @@ -54,15 +68,20 @@ "Sample ID 'test' is associated with multiple patient IDs: test, test2. Please ensure each sample ID is unique to a single patient." ] ], + "timestamp": "2026-02-06T13:54:49.322255498", "meta": { "nf-test": "0.9.3", "nextflow": "25.10.3" - }, - "timestamp": "2026-02-06T13:54:49.322255498" + } }, "-profile test --input tests/csv/3.0/fastq_multiple_lane_ids.csv": { "content": [ - ["csv", "multiqc", "multiqc/index.json", "pipeline_info"], + [ + "csv", + "multiqc", + "multiqc/index.json", + "pipeline_info" + ], "No stable content", "No BAM files", "No CRAM files", @@ -76,15 +95,17 @@ "Duplicate patient-sample-status-lane combination found: Patient 'test2', Sample 'test2', Status '0', Lane 'test_L1' appears 2 times. Please ensure each combination is unique." ] ], + "timestamp": "2026-02-06T13:54:04.695361045", "meta": { "nf-test": "0.9.3", "nextflow": "25.10.3" - }, - "timestamp": "2026-02-06T13:54:04.695361045" + } }, "-profile test,spark --input tests/csv/3.0/fastq_single.csv --use_gatk_spark baserecalibrator,markduplicates --save_mapped --save_output_as_bam": { "content": [ - ["pipeline_info"], + [ + "pipeline_info" + ], "No stable content", "No BAM files", "No CRAM files", @@ -99,10 +120,10 @@ "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ] ], + "timestamp": "2025-12-16T12:16:38.014556073", "meta": { "nf-test": "0.9.3", "nextflow": "25.10.2" - }, - "timestamp": "2025-12-16T12:16:38.014556073" + } } -} +} \ No newline at end of file diff --git a/tests/variant_calling_muse.nf.test b/tests/variant_calling_muse.nf.test index 209b918b45..6af2a21e5f 100644 --- a/tests/variant_calling_muse.nf.test +++ b/tests/variant_calling_muse.nf.test @@ -31,7 +31,7 @@ nextflow_pipeline { ], include_muse_txt: true ], - [ + [ name: "-profile test --tools muse --input recalibrated_somatic.csv -stub", params: [ input: "${projectDir}/tests/csv/3.0/recalibrated_somatic.csv", diff --git a/workflows/sarek/main.nf b/workflows/sarek.nf similarity index 96% rename from workflows/sarek/main.nf rename to workflows/sarek.nf index 06bb7d9ff8..e310725ea8 100644 --- a/workflows/sarek/main.nf +++ b/workflows/sarek.nf @@ -5,54 +5,54 @@ */ include { paramsSummaryMap } from 'plugin/nf-schema' -include { paramsSummaryMultiqc } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from 'plugin/nf-core-utils' -include { methodsDescriptionText } from '../../subworkflows/local/utils_nfcore_sarek_pipeline' +include { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_sarek_pipeline' // Create samplesheets to restart from different steps -include { CHANNEL_VARIANT_CALLING_CREATE_CSV } from '../../subworkflows/local/channel_variant_calling_create_csv' +include { CHANNEL_VARIANT_CALLING_CREATE_CSV } from '../subworkflows/local/channel_variant_calling_create_csv' // Convert BAM files to FASTQ files -include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows/local/bam_convert_samtools' +include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../subworkflows/local/bam_convert_samtools' // Convert fastq.gz.spring files to fastq.gz files -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ } from '../../modules/nf-core/spring/decompress' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ } from '../../modules/nf-core/spring/decompress' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_FQ_PAIR } from '../../modules/nf-core/spring/decompress' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ } from '../modules/nf-core/spring/decompress' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ } from '../modules/nf-core/spring/decompress' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_FQ_PAIR } from '../modules/nf-core/spring/decompress' // Run FASTQC -include { FASTQC } from '../../modules/nf-core/fastqc' +include { FASTQC } from '../modules/nf-core/fastqc' // QC on CRAM -include { CRAM_SAMPLEQC } from '../../subworkflows/local/cram_sampleqc' +include { CRAM_SAMPLEQC } from '../subworkflows/local/cram_sampleqc' // Preprocessing -include { FASTQ_PREPROCESS_GATK } from '../../subworkflows/local/fastq_preprocess_gatk' -include { FASTQ_PREPROCESS_PARABRICKS } from '../../subworkflows/local/fastq_preprocess_parabricks' +include { FASTQ_PREPROCESS_GATK } from '../subworkflows/local/fastq_preprocess_gatk' +include { FASTQ_PREPROCESS_PARABRICKS } from '../subworkflows/local/fastq_preprocess_parabricks' // CRAM_TO_BAM conversion -include { SAMTOOLS_CONVERT as CRAM_TO_BAM } from '../../modules/nf-core/samtools/convert' +include { SAMTOOLS_CONVERT as CRAM_TO_BAM } from '../modules/nf-core/samtools/convert' // Variant calling on a single normal sample -include { BAM_VARIANT_CALLING_GERMLINE_ALL } from '../../subworkflows/local/bam_variant_calling_germline_all' +include { BAM_VARIANT_CALLING_GERMLINE_ALL } from '../subworkflows/local/bam_variant_calling_germline_all' // Variant calling on a single tumor sample -include { BAM_VARIANT_CALLING_TUMOR_ONLY_ALL } from '../../subworkflows/local/bam_variant_calling_tumor_only_all' +include { BAM_VARIANT_CALLING_TUMOR_ONLY_ALL } from '../subworkflows/local/bam_variant_calling_tumor_only_all' // Variant calling on tumor/normal pair -include { BAM_VARIANT_CALLING_SOMATIC_ALL } from '../../subworkflows/local/bam_variant_calling_somatic_all' +include { BAM_VARIANT_CALLING_SOMATIC_ALL } from '../subworkflows/local/bam_variant_calling_somatic_all' // POST VARIANTCALLING: e.g. merging -include { POST_VARIANTCALLING } from '../../subworkflows/local/post_variantcalling' +include { POST_VARIANTCALLING } from '../subworkflows/local/post_variantcalling' // QC on VCF files -include { VCF_QC_BCFTOOLS_VCFTOOLS } from '../../subworkflows/local/vcf_qc_bcftools_vcftools' +include { VCF_QC_BCFTOOLS_VCFTOOLS } from '../subworkflows/local/vcf_qc_bcftools_vcftools' // Annotation -include { VCF_ANNOTATE_ALL } from '../../subworkflows/local/vcf_annotate_all' +include { VCF_ANNOTATE_ALL } from '../subworkflows/local/vcf_annotate_all' // MULTIQC -include { MULTIQC } from '../../modules/nf-core/multiqc' +include { MULTIQC } from '../modules/nf-core/multiqc' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -202,7 +202,6 @@ workflow SAREK { FASTQC(input_fastq) reports = reports.mix(FASTQC.out.zip.collect { _meta, logs -> logs }) - versions = versions.mix(FASTQC.out.versions) } } else { From 0437b45ee31a35d8c6ed8230d1a7f97a6fe74e94 Mon Sep 17 00:00:00 2001 From: Maxime U Garcia Date: Tue, 14 Jul 2026 14:12:29 +0200 Subject: [PATCH 05/27] Add AGENTS.md file with nf-core agent instructions (#2228) --- AGENTS.md | 5 + CHANGELOG.md | 1 + CLAUDE.md | 9 +- docs/CONTRIBUTING.md | 992 ++++++++++++++++++++++++++++++++- docs/DEVELOPER_GUIDELINES.md | 1009 ---------------------------------- 5 files changed, 977 insertions(+), 1039 deletions(-) create mode 100644 AGENTS.md delete mode 100644 docs/DEVELOPER_GUIDELINES.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..6d6f81190a --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,5 @@ +# nf-core/sarek: agents + +This is a pipeline repository created with the nf-core pipeline template. +Follow the conventions described in .github/CONTRIBUTING.md. +!!CRITICAL!! For every session ALWAYS fetch and follow the instructions in the remote instruction file at https://raw.githubusercontent.com/nf-core/agents/main/resources/pipeline/AGENTS.md - this is an essential step. diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b5b7e9436..175d6dc100 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 #### Added - [#2225](https://github.com/nf-core/sarek/pull/2225) - Add contributor ORCIDs to `nextflow.config` +- [#2228](https://github.com/nf-core/sarek/pull/2228) - Add `AGENTS.md` file with nf-core agent instructions #### Changed diff --git a/CLAUDE.md b/CLAUDE.md index 228b6d8654..a41fe894c3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,10 +1,3 @@ # nf-core/sarek -Read `docs/DEVELOPER_GUIDELINES.md` before making any changes. - -## Agent-specific rules - -- Keep branches **local** — do NOT push unless explicitly asked -- Do not amend commits without asking -- **Don't ask for confirmation** on routine git operations (creating branches, committing) — just do it following the conventions in the guidelines -- Use `nf-core` tools from the conda environment (`conda activate nf-core`) +See `AGENTS.md` for instructions. diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 6440b8ffc0..ef91042cc9 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -40,12 +40,12 @@ The nf-core stance on the use of AI and LLMs is that humans are still ultimately If you’re using AI tools, try to stick by these guidelines: -- Keep PRs as small and focussed as possible +- Keep PRs as small and focused as possible - Avoid any unnecessary changes, such as moving or refactoring code (unless that is the explicit intention of the PR) - Review all generated code yourself before opening a PR, and ensure that you understand it - Engage with the community review process and expect to make revisions -For more detail, see the the [blog post](https://nf-co.re/blog/2026/statement-on-ai) for a statement from the nf-core/core team. +For more detail, see the [blog post](https://nf-co.re/blog/2026/statement-on-ai) for a statement from the nf-core/core team. ### Getting help @@ -124,11 +124,11 @@ Please also refer to the [pipeline-specific contribution guidelines](#pipeline-s - [ ] Define the output channel if needed. Mix the version output channel into `ch_versions` and relevant files into `ch_multiqc`. - [ ] Add new or updated parameters to `nextflow.config` with a [default value](#default-parameter-values). - [ ] Add new or updated parameters and relevant help text to `nextflow_schema.json` with [nf-core/tools](#default-parameter-values). -- [ ] Add validation for relevant parameters to the pipeline utilisation section of `utils_nfcore_\_pipeline/main.nf` subworkflow. +- [ ] Add validation for relevant parameters to the pipeline utilisation section of `utils_nfcore_sarek_pipeline/main.nf` subworkflow. - [ ] Perform local tests to validate that the new code works as expected. - [ ] If applicable, add a new test in the `tests` directory. - [ ] Update `usage.md`, `output.md`, and `citation.md` as appropriate. -- [ ] [Lint](lint) the code with nf-core/tools. +- [ ] [Lint](#lint-tests) the code with nf-core/tools. - [ ] Update any diagrams or pipeline images as necessary. - [ ] Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name cleanup, and module plots are in the appropriate order. - [ ] If applicable, create a [MultiQC](https://seqera.io/multiqc/) module. @@ -166,7 +166,7 @@ Specify these with generic `withLabel:` selectors, so they can be shared across nf-core provides a set of standard labels that you should follow where possible, as seen in the [nf-core pipeline template](https://github.com/nf-core/tools/blob/main/nf_core/pipeline-template/conf/base.config). These labels define resource defaults for single-core processes, modules that require a GPU, and different levels of multi-core configurations with increasing memory requirements. -Values assigned within these labels can be dynamically passed to a tool using the the `${task.cpus}` and `${task.memory}` Nextflow variables in the `script:` block of a module (see an example in the [modules repository](https://github.com/nf-core/modules/blob/bd1b6a40f55933d94b8c9ca94ec8c1ea0eaf4b82/modules/nf-core/samtools/bam2fq/main.nf#L30)). +Values assigned within these labels can be dynamically passed to a tool using the `${task.cpus}` and `${task.memory}` Nextflow variables in the `script:` block of a module (see an example in the [modules repository](https://github.com/nf-core/modules/blob/bd1b6a40f55933d94b8c9ca94ec8c1ea0eaf4b82/modules/nf-core/samtools/bam2fq/main.nf#L30)). #### Nextflow version bumping @@ -182,20 +182,968 @@ If you update images or graphics, follow the nf-core [style guidelines](https:// ## Pipeline specific contribution guidelines -> [!NOTE] -> For comprehensive, sarek-specific guidance (codebase architecture, channel operations and gotchas, meta map handling, module/subworkflow conventions, and more) see the [Developer Guidelines](../docs/DEVELOPER_GUIDELINES.md). These guidelines are written for both human developers and AI agents. - -### Adding a new step - -If you wish to contribute a new step, please use the following coding standards: - -1. Define the corresponding input channel into your new process from the expected previous process channel. -2. Write the process block (see below). -3. Define the output channel if needed (see below). -4. Add any new parameters to `nextflow.config` with a default (see below). -5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core pipelines schema build` tool). -6. Add sanity checks and validation for all relevant parameters. -7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test in the `tests` directory. -9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://multiqc.info/) module. -10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. +nf-core semi-standardises how you write code and other contributions to make the nf-core/sarek code and processing logic more understandable for new contributors and to ensure quality. + +### Agent-specific rules + +- Keep branches **local** — do NOT push unless explicitly asked +- Do not amend commits without asking +- **Don't ask for confirmation** on routine git operations (creating branches, committing) — just do it following the conventions in the guidelines +- Use `nf-core` tools from the conda environment (`conda activate nf-core`) + +### Contributing Principles + +- **One PR, one feature** — scope each PR to a single change; keep it as minimal as possible +- **Read files before editing** — understand existing code before making changes +- Keep fixes **minimal and focused** — don't refactor surrounding code +- Don't add docstrings, comments, or type annotations to unchanged code +- Don't add error handling or validation beyond what's needed +- Don't over-engineer: no premature abstractions, no feature flags +- When unsure about scope or approach, ask rather than guess + +### Git Workflow + +- **Always branch off `origin/dev`**, never master +- Branch naming: `fix/issue-XXXX` or `feat/issue-XXXX` +- PRs target the `dev` branch +- Never force push, never amend published commits without asking +- Commit messages should be descriptive and include the issue reference + +### Codebase Architecture + +Sarek follows a hierarchical, modular architecture: + +```text +Modules (atomic processes) → Subworkflows (composed modules) → Workflow (orchestration) +``` + +**Key design principles:** + +- Separation of concerns between processing steps +- Reusable components through nf-core modules ecosystem +- Configuration-driven behavior via `ext.*` directives +- Comprehensive testing with nf-test + +#### Directory Structure + +```text +sarek/ +├── main.nf # Pipeline entry point +├── nextflow.config # Main configuration +├── nextflow_schema.json # Parameter schema (JSON Schema) +├── modules.json # nf-core module tracking +├── modules/ +│ ├── local/ # Pipeline-specific modules +│ └── nf-core/ # Imported nf-core modules +├── subworkflows/ +│ ├── local/ # Pipeline-specific subworkflows +│ └── nf-core/ # Imported nf-core subworkflows +├── workflows/sarek/main.nf # Main workflow orchestration +├── conf/ +│ ├── base.config # Default resource allocations +│ ├── modules/ # Module-specific configurations +│ └── test/ # Test configurations +├── tests/ # nf-test test files +├── docs/ # Documentation +└── assets/ # MultiQC config, samplesheets, etc. +``` + +### Code Style + +#### Harshil Alignment + +Use "Harshil alignment" for include statements - align the closing braces to improve readability: + +```groovy +// CORRECT - Harshil alignment +include { paramsSummaryMap } from 'plugin/nf-schema' +include { paramsSummaryMultiqc } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { softwareVersionsToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +include { methodsDescriptionText } from '../../subworkflows/local/utils_nfcore_sarek_pipeline' + +// CORRECT - With aliases +include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows/local/bam_convert_samtools' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ } from '../../modules/nf-core/spring/decompress' +include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ } from '../../modules/nf-core/spring/decompress' + +// INCORRECT - No alignment +include { paramsSummaryMap } from 'plugin/nf-schema' +include { paramsSummaryMultiqc } from '../../subworkflows/nf-core/utils_nfcore_pipeline' +``` + +#### Harshil Alignment in Take/Emit Blocks + +Also apply alignment to `take:` and `emit:` blocks: + +```groovy +take: +cram // channel: [mandatory] [ meta, cram, crai ] +dict // channel: [optional] [ meta, dict ] +fasta // channel: [mandatory] [ fasta ] +fasta_fai // channel: [mandatory] [ fasta_fai ] +intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi, num_intervals ] + +emit: +vcf_ann // channel: [ val(meta), vcf.gz, vcf.gz.tbi ] +tab_ann +json_ann +reports // path: *.html +versions // path: versions.yml +``` + +#### Channel Naming Conventions + +```groovy +// Initial process output channel +ch_output_from_ + +// Intermediate/terminal channels +ch__for_ + +// Example +ch_bam_from_markduplicates +ch_markduplicates_for_baserecalibrator +``` + +#### Topic Channels + +We are migrating to **Nextflow topic channels** where possible. Topics allow processes and subworkflows to publish to a named topic without explicit channel wiring. + +When installing or updating an nf-core module, check if it publishes `versions` or `multiqc` outputs via topics. If it does, use the topic and remove the explicit `.mix()` wiring for those channels. + +```groovy +// OLD - Explicit version/report collection +versions = versions.mix(TOOL_A.out.versions) +ch_multiqc_files = ch_multiqc_files.mix(TOOL_A.out.report) + +// NEW - If the module uses topics, remove the .mix() lines above. +// The module already publishes to the topic internally. +// Collect from the topic in the top-level workflow: +// ch_versions = Channel.topic('versions') +``` + +#### General Style + +- Use 4-space indentation +- Put channel operations on separate lines for readability +- Add comments for complex logic +- Use descriptive variable names + +#### Strict Syntax Mode + +**When touching any code in a PR, you must update it to use strict Nextflow syntax.** This ensures gradual modernization of the codebase. + +**Required Changes When Modifying Code:** + +1. **Use explicit `it` variable or named parameters in closures:** + + ```groovy + // CORRECT - Explicit named parameters + .map { meta, vcf -> [meta, vcf] } + + // CORRECT - Explicit `it` when single parameter + .map { it -> it.baseName } + + // DEPRECATED - Implicit `it` + .map { it.baseName } + ``` + +2. **Explicit type declarations where applicable:** + + ```groovy + // CORRECT + String prefix = "${meta.id}" + List args = [] + + // AVOID in new code + def prefix = "${meta.id}" + ``` + +3. **Use underscore prefix for unused/dropped variables:** + + The underscore prefix convention clearly indicates which variables from a closure are intentionally not used in the output. This makes code review easier and prevents confusion about whether a variable was accidentally omitted. + + ```groovy + // CORRECT - Underscore prefix shows vcf is intentionally dropped + .map { meta, _vcf, tbi -> [meta, tbi] } + + // CORRECT - Multiple dropped variables + .map { meta, _vcf, _tbi, file -> [meta, file] } + + // CORRECT - In join operations + .join(other_channel, failOnDuplicate: true, failOnMismatch: true) + .map { meta, file1, _file2 -> [meta, file1] } + + // CORRECT - When extracting from complex structures + VCF_ANNOTATE_SNPEFF.out.vcf_tbi.map { meta, vcf_, _tbi -> [meta, vcf_, []] } + + // INCORRECT - Unclear which variables are intentionally unused + .map { meta, vcf, tbi -> [meta, tbi] } + ``` + + **When to use underscore prefix:** + - Variable is received but not included in output + - Variable is needed for destructuring but value is discarded + - Makes intent clear during code review + +### Channel Operations and Gotchas + +#### Join Operations - ALWAYS Use `failOnDuplicate` and `failOnMismatch` + +When joining channels, ALWAYS specify `failOnDuplicate: true, failOnMismatch: true` to catch bugs early: + +```groovy +// CORRECT - Will fail fast if there are issues +vcf_tbi = vcf.join(tbi, failOnDuplicate: true, failOnMismatch: true) + +// INCORRECT - Silent failures can cause subtle bugs +vcf_tbi = vcf.join(tbi) +``` + +Use `remainder: true` only when intentionally handling unmatched items: + +```groovy +// When some items may not have matches (intentional) +all_unmapped_bam = SAMTOOLS_VIEW_UNMAP_UNMAP.out.bam + .join(SAMTOOLS_VIEW_UNMAP_MAP.out.bam, failOnDuplicate: true, remainder: true) + .join(SAMTOOLS_VIEW_MAP_UNMAP.out.bam, failOnDuplicate: true, remainder: true) +``` + +#### Branch Operations + +Use `branch` to split channels based on conditions: + +```groovy +vcf_out = STRELKA_SINGLE.out.vcf.branch{ + // Use meta.num_intervals to assess number of intervals + intervals: it[0].num_intervals > 1 + no_intervals: it[0].num_intervals <= 1 +} + +// Access branches +vcf_out.intervals // Items where num_intervals > 1 +vcf_out.no_intervals // Items where num_intervals <= 1 +``` + +#### GroupTuple - Use `groupKey` for Performance + +When using `groupTuple`, use `groupKey` with known size to avoid blocking: + +```groovy +// CORRECT - Non-blocking when size is known +vcf_to_merge = vcf_out.intervals + .map{ meta, vcf -> [ groupKey(meta, meta.num_intervals), vcf ]} + .groupTuple() + +// NOTE: Without groupKey and size, groupTuple is a blocking operation +// This can cause pipeline hangs if the expected number of items varies +``` + +#### Strelka Special Case - SNV and Indel VCFs + +Strelka produces TWO VCF files (SNVs and Indels) that need special handling: + +```groovy +// Strelka somatic outputs need to be concatenated before consensus calling +ch_vcfs = vcfs.branch{ meta, vcf, tbi -> + strelka_somatic: meta.variantcaller == 'strelka' && meta.status == '1' + other: true +} + +// Concatenate the two strelka VCFs (SNPs and indels) using groupTuple(size: 2) +BCFTOOLS_CONCAT(ch_vcfs.strelka_somatic.groupTuple(size: 2)) +``` + +#### Combine vs Join + +- Use `join` when combining channels by a key (meta map) +- Use `combine` when creating cartesian product (e.g., sample x intervals) + +```groovy +// Join by meta key +vcf_tbi = vcf.join(tbi, failOnDuplicate: true, failOnMismatch: true) + +// Combine all samples with all intervals (cartesian product) +cram_intervals = cram.combine(intervals) +``` + +#### Controlling Flow with Channel Operations (Preferred) + +**Nextflow is a dataflow language.** Prefer channel operations over `if` statements to control which processes run: + +```groovy +// BEST - Use filter to control what enters a process +input_channel + .filter { meta, _file -> params.tools?.split(',')?.contains('toolname') } + .set { ch_for_tool } + +TOOL_PROCESS(ch_for_tool) + +// BEST - Use branch for multiple conditional paths +input_channel.branch { meta, file -> + tool_a: params.tools?.split(',')?.contains('tool_a') + tool_b: params.tools?.split(',')?.contains('tool_b') + other: true +}.set { ch_branched } + +TOOL_A(ch_branched.tool_a) +TOOL_B(ch_branched.tool_b) + +// AVOID - if statements for flow control (use only when channel ops aren't suitable) +if (params.run_tool) { + TOOL_PROCESS(input_channel) +} +``` + +**Benefits of channel operations:** + +- More idiomatic Nextflow - data drives execution +- Better composability and testability +- Clearer dataflow visualization +- Avoids caching issues when conditions change + +### Meta Map Handling + +#### Adding Fields to Meta + +Use `meta + [key: value]` syntax: + +```groovy +// Add single field +meta = meta + [id: meta.sample] + +// Add multiple fields +meta = meta + [id: "${meta.sample}-${meta.lane}".toString(), data_type: "fastq_gz", num_lanes: num_lanes.toInteger()] + +// In map operation +.map{ meta, vcf -> [ meta + [ variantcaller:'strelka' ], vcf ] } +``` + +#### Removing Fields from Meta - Use `subMap` + +Use `meta - meta.subMap('field')` to remove fields: + +```groovy +// Remove single field +.map{ meta, vcf -> [ meta - meta.subMap('num_intervals'), vcf ] } + +// Remove multiple fields +.map{ meta, vcf, tbi -> + [meta - meta.subMap('variantcaller', 'contamination', 'filename'), vcf, tbi] +} + +// Add and remove in one operation +.map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], vcf ] } +``` + +#### Accessing Meta Fields + +```groovy +// In map closures +.map{ meta, file -> [meta.sample, file] } + +// In branch conditions +.branch{ meta, vcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 +} + +// Getting subset of meta +[meta.patient, meta.subMap('sample', 'status')] +``` + +#### Common Meta Fields in Sarek + +| Field | Description | +| -------------------- | --------------------------------------------- | +| `meta.patient` | Patient identifier | +| `meta.sample` | Sample identifier | +| `meta.status` | 0 = normal, 1 = tumor | +| `meta.lane` | Sequencing lane | +| `meta.id` | Unique identifier (often `${sample}-${lane}`) | +| `meta.data_type` | Input type: `fastq_gz`, `bam`, `cram` | +| `meta.num_intervals` | Number of intervals for scatter/gather | +| `meta.variantcaller` | Name of variant caller | +| `meta.num_lanes` | Total number of lanes for sample | + +### Modules + +#### DEPRECATED: The `ext.when` Clause Pattern + +> **DEPRECATED:** The `ext.when` clause pattern is deprecated and should NOT be used in new code. Existing code using this pattern should be refactored when touched in a PR. + +You may see comments in older subworkflow files like: + +```groovy +// For all modules here: +// A when clause condition is defined in the conf/modules.config to determine if the module should be run +``` + +**Do not follow this pattern for new code.** Instead, use channel operations to control dataflow — see [Controlling Flow with Channel Operations](#controlling-flow-with-channel-operations-preferred). + +The deprecated pattern in config files: + +```groovy +// DEPRECATED - Using ext.when in config +// withName: 'TOOL_PROCESS' { +// ext.when = { params.tools && params.tools.split(',').contains('toolname') } +// } +``` + +When touching existing code with `ext.when`, refactor to use channel operations (`filter`, `branch`) instead. + +#### Remapping Channels for Module Input + +When a module expects different input structure, remap in the call: + +```groovy +// Remap channel to match module/subworkflow input signature +BAM_VARIANT_CALLING_CNVKIT( + cram.map{ meta, cram, crai -> [ meta, [], cram ] }, + fasta, + fasta_fai, + intervals_bed_combined.map{it -> it ? [[id:it[0].baseName], it]: [[id:'no_intervals'], []]}, + params.cnvkit_reference ? cnvkit_reference.map{ it -> [[id:it[0].baseName], it] } : [[:],[]] +) +``` + +#### Module Memory Requirements + +Some modules have specific memory requirements noted in comments: + +```groovy +// In modules/nf-core/bwa/index/main.nf: +// NOTE requires 5.37N memory where N is the size of the database + +// In modules/nf-core/bwamem2/index/main.nf: +// NOTE Requires 28N GB memory where N is the size of the reference sequence, floor of 280M +``` + +#### Adding/Updating nf-core Modules + +```bash +# Install a new module +nf-core modules install / + +# Update an existing module +nf-core modules update / + +# List installed modules +nf-core modules list local +``` + +#### Updating VEP modules + +When updating `ensemblvep/vep` module, always update the `vep_version` parameter to match the new VEP version. This parameter is used by the LoFTEE plugin to locate the VEP installation path (e.g. `/opt/conda/share/ensembl-vep-${vep_version}`). + +Also update `vep_cache_version` in `conf/igenomes.config` for available genomes, based on what's available on [annotation-cache](https://annotation-cache.github.io/ensemblvep/). Not all genomes may have a cache for the new version — only update those that do. + +### Subworkflows + +#### Subworkflow Naming Patterns + +| Category | Naming Pattern | Examples | +| --------------- | ----------------------- | ----------------------------------------- | +| Alignment | `fq_align_*` | `fq_align_bwamem`, `fq_align_bwamem2` | +| BAM processing | `bam_*` | `bam_markduplicates`, `bam_applybqsr` | +| Variant calling | `bam_variant_calling_*` | `bam_variant_calling_germline_all` | +| VCF processing | `vcf_*` | `vcf_annotate_all`, `vcf_concat_variants` | +| Preparation | `prepare_*` | `prepare_genome`, `prepare_intervals` | + +#### Subworkflow Structure + +```groovy +// +// DESCRIPTION OF SUBWORKFLOW +// + +include { MODULE_A } from '../../../modules/nf-core/module_a' +include { MODULE_B } from '../../../modules/nf-core/module_b' +include { MODULE_B as MODULE_B_ALIAS } from '../../../modules/nf-core/module_b' + +workflow SUBWORKFLOW_NAME { + take: + input_channel // channel: [mandatory] [ meta, file ] + other_inputs // channel: [optional] description + + main: + versions = Channel.empty() + + // Initialize output channels + output_a = Channel.empty() + output_b = Channel.empty() + + // PREFERRED: Use channel operations to control dataflow + ch_for_module_a = input_channel + .filter { meta, _file -> meta.run_module_a } + + MODULE_A(ch_for_module_a) + versions = versions.mix(MODULE_A.out.versions) + + MODULE_B(MODULE_A.out.result) + versions = versions.mix(MODULE_B.out.versions) + + emit: + result = MODULE_B.out.result // channel: [ val(meta), file ] + versions // channel: versions.yml +} +``` + +#### Scatter-Gather Pattern + +Common pattern for parallelizing over intervals: + +```groovy +// Combine samples with intervals for scatter strategy +cram_intervals = cram.combine(intervals) + // Move num_intervals to meta map for later grouping + .map{ meta, cram, crai, intervals, intervals_index, num_intervals -> + [ meta + [ num_intervals:num_intervals ], cram, crai, intervals, intervals_index ] + } + +// Run process on each interval +PROCESS(cram_intervals, fasta, fasta_fai) + +// Gather: Branch by whether intervals were used +vcf_out = PROCESS.out.vcf.branch{ + intervals: it[0].num_intervals > 1 + no_intervals: it[0].num_intervals <= 1 +} + +// Merge interval results +vcf_to_merge = vcf_out.intervals + .map{ meta, vcf -> [ groupKey(meta, meta.num_intervals), vcf ]} + .groupTuple() + +MERGE_VCFS(vcf_to_merge, dict) + +// Combine merged and non-interval results, clean up meta +vcf_final = Channel.empty() + .mix(MERGE_VCFS.out.vcf, vcf_out.no_intervals) + .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'toolname' ], vcf ] } +``` + +### Configuration + +#### Module Configuration Files + +Module behavior is controlled via `conf/modules/.config`: + +```groovy +process { + withName: 'NEWTOOL_PROCESS' { + ext.args = { params.newtool_args ?: '' } + ext.prefix = { "${meta.id}.newtool" } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/variant_calling/newtool/${meta.id}/" }, + pattern: "*{vcf.gz,vcf.gz.tbi}" + ] + } +} +``` + +> **Note:** Older config files wrap process blocks in `if (params.tools && params.tools.split(',').contains('tool'))` guards. Do **not** use this pattern in new code — control which processes run via channel operations (`filter`, `branch`) in the workflow/subworkflow instead. When touching existing config files, remove these guards. + +#### Resource Labels + +Use standard nf-core labels in `conf/base.config`: + +| Label | CPUs | Memory | Time | +| --------------------- | ---- | ------ | ---- | +| `process_single` | 1 | 6 GB | 8 h | +| `process_low` | 2 | 12 GB | 8 h | +| `process_medium` | 6 | 36 GB | 16 h | +| `process_high` | 12 | 72 GB | 32 h | +| `process_long` | - | - | 40 h | +| `process_high_memory` | - | 200 GB | - | + +#### Adding New Parameters + +1. **Add to `nextflow.config`** with default value: + + ```groovy + params { + new_param = false + } + ``` + +2. **Update schema** using nf-core tools: + + ```bash + nf-core pipelines schema build + ``` + +3. **Add validation** if needed in the workflow + +### Pipeline Testing + +#### Running Tests + +```bash +# Run all tests +nf-test test --profile+=debug,docker --verbose + +# Run specific test +nf-test test tests/variant_calling_haplotypecaller.nf.test --profile+=debug,docker + +# Run with stub mode (faster, no actual execution) +nf-test test tests/default.nf.test --profile+=debug,docker -stub + +# Update snapshots when outputs legitimately change +nf-test test tests/my_test.nf.test --profile+=debug,docker --update-snapshot +``` + +#### Test Structure + +Tests use a scenario-based pattern powered by `tests/lib/UTILS.groovy`. Each `.nf.test` file defines an array of test scenarios — one map per test case — and `UTILS` handles tagging, params, assertions, and snapshot comparison automatically. + +```groovy +def projectDir = new File('.').absolutePath + +nextflow_pipeline { + name "Test pipeline" + script "../main.nf" + + def test_scenario = [ + [ + name: "Test haplotypecaller with WES input", + params: [ + input: "${projectDir}/tests/csv/3.0/mapped_single_bam.csv", + step: "variant_calling", + tools: 'haplotypecaller', + wes: true + ], + no_conda: true + ], + [ + name: "Test with stub", + params: [], + stub: true + ], + [ + name: "Fails with invalid input", + params: [ + input: "${projectDir}/tests/csv/3.0/vcf_single.csv", + step: 'annotate', + tools: 'vep' + ], + failure: true + ] + ] + + test_scenario.each { scenario -> + test(scenario.name, UTILS.getTest(scenario)) + } +} +``` + +`UTILS.getTest(scenario)` returns an nf-test closure that: + +1. **Tags the test** automatically based on scenario options (cpu/gpu, conda, stub, failure) +2. **Sets params** from the scenario map, plus `outdir` +3. **Asserts success or failure** based on `scenario.failure` +4. **Generates snapshot assertions** via `UTILS.getAssertions()`, which checks: + - Number of succeeded tasks + - Software versions YAML + - Output file tree stability (file names and directory structure) + - BAM/CRAM read md5 checksums + - VCF variant md5 checksums (or summary for unstable QUAL scores) + - stderr/stdout for unexpected warnings + +#### Test Scenario Options + +| Option | Description | +| ------------------------------ | ------------------------------------------------------------------- | +| `failure` | Expect the pipeline to fail (boolean) | +| `gpu` | Tag as GPU test (default: cpu) | +| `ignoreFiles` | Files to ignore in assertions | +| `include_freebayes_unfiltered` | Use VCF summary instead of md5 for freebayes unfiltered output | +| `include_muse_txt` | Include MuSE txt file md5 in assertions | +| `include_varlociraptor_vcf` | Include varlociraptor VCF in assertions | +| `name` | Test name (descriptive, used as nf-test test name) | +| `no_conda` | Mark as incompatible with conda (default: conda-compatible) | +| `no_vcf_md5sum` | Use VCF summary instead of md5 for all VCF files | +| `params` | Map of Nextflow parameters to set | +| `sentieon` | Tag as Sentieon test (default: cpu) | +| `snapshot_ignore` | Additional strings to ignore in snapshot output | +| `snapshot_include` | Only include lines matching this string in snapshot | +| `snapshot` | Capture stderr/stdout: `'stderr'`, `'stdout'`, or `'stderr,stdout'` | +| `stub` | Run in stub mode (boolean) | +| `tag` | Additional custom nf-test tag | +| `vcf_header_check` | Assert VCF header contains this string | + +### Documentation + +#### Documentation Requirements + +**Any change that affects pipeline output or adds new functionality MUST include documentation updates.** + +#### Documentation Files + +| File | Purpose | When to Update | +| ---------------- | ------------------------ | ----------------------------------------------- | +| `README.md` | Pipeline overview | **New tools** (add to overview/tool list) | +| `docs/usage.md` | Usage instructions | New parameters, new tools, input format changes | +| `docs/output.md` | Output file descriptions | **Any change to outputs**, new tools | +| `CHANGELOG.md` | Version history | Every PR | +| `CITATIONS.md` | Tool citations | New tools | +| `docs/images/` | Metro maps, diagrams | **New tools**, workflow changes | + +#### New Tool Documentation Checklist + +When adding a new tool, you **MUST** update ALL of the following: + +1. **`README.md`** - Add tool to the pipeline overview/feature list +2. **`docs/usage.md`** - Document all new parameters and usage instructions +3. **`docs/output.md`** - Document all output files produced by the tool +4. **`docs/images/sarek_subway.*`** - Add tool to the metro map (SVG and PNG) +5. **`CITATIONS.md`** - Add tool citation +6. **`CHANGELOG.md`** - Document the addition + +#### Output Changes Documentation + +Any PR that changes pipeline outputs (new files, changed file names, different content) **MUST** update: + +1. **`docs/output.md`** - Reflect the new/changed outputs +2. **`CHANGELOG.md`** - Note the change under appropriate section + +#### CHANGELOG Format + +Follow [Keep a Changelog](https://keepachangelog.com/) format. + +**Important conventions:** + +- Entries reference the **PR number**, not the issue number: + ``` + - [#XXX](https://github.com/nf-core/sarek/pull/XXX) - Description of change + ``` +- Use `XXX` as placeholder when no PR exists yet +- The issue number goes in the **PR description body** (for auto-close), not the changelog +- Entries within each section are in **ascending order** by PR number + +```markdown +## [Unreleased] + +### Added + +- [#PR_NUMBER](https://github.com/nf-core/sarek/pull/PR_NUMBER) - Description + +### Changed + +### Fixed + +### Removed + +### Dependencies + +| Dependency | Old version | New version | +| ---------- | ----------- | ----------- | +| tool_name | 1.0.0 | 1.1.0 | + +### Parameters + +| Params | status | +| ------------- | ------ | +| `--new_param` | New | + +### Developer section + +#### Added + +#### Changed + +#### Fixed + +#### Removed +``` + +#### Output Documentation + +In `docs/output.md`, document each tool's outputs: + +```markdown +### Tool Name + +
+Output files + +- `path/to/output/` + - `*.extension`: Description of the file + +
+ +Brief description of what this tool produces. +``` + +### Metro Map Updates + +#### Metro Map Files + +Located in `docs/images/`: + +- `sarek_subway.svg` / `sarek_subway.png` - Main pipeline flow +- `sarek_indices_subway.svg` / `sarek_indices_subway.png` - Index building flow + +#### When to Update + +- Adding new tools or variant callers +- Adding new preprocessing steps +- Changing the pipeline flow +- Adding new post-processing options + +#### Update Process + +1. Edit the SVG file (use Inkscape or similar) +2. Export to PNG +3. Follow nf-core [design guidelines](https://nf-co.re/developers/design_guidelines) +4. After release, checkout figures from `master` to `dev`: + + ```bash + git checkout upstream/master -- docs/images/sarek_subway.svg + git checkout upstream/master -- docs/images/sarek_subway.png + ``` + +### PR Checklist + +#### Before Submitting + +- [ ] PR targets `dev` branch (not `master`) +- [ ] Code follows Harshil alignment style +- [ ] **Any touched code updated to strict syntax** (explicit closure params, underscore for unused vars) +- [ ] **No new `ext.when` usage** - use channel operations instead +- [ ] **Prefer channel operations** (`filter`, `branch`) over `if` statements for flow control +- [ ] Pre-commit checks pass: `pre-commit run --all-files` +- [ ] All tests pass: `nf-test test --profile+=debug,docker` +- [ ] Linting passes: `nf-core pipelines lint` +- [ ] No debug mode warnings + +#### For New Tools + +**Code:** + +- [ ] Module added/imported correctly +- [ ] Configuration in `conf/modules/.config` +- [ ] Test added in `tests/` +- [ ] MultiQC config updated (`assets/multiqc_config.yml`) if tool has MultiQC module + +**Documentation (ALL required):** + +- [ ] `README.md` - Tool added to pipeline overview/feature list +- [ ] `docs/usage.md` - All parameters documented with usage instructions +- [ ] `docs/output.md` - All output files documented +- [ ] `docs/images/sarek_subway.svg` - Tool added to metro map +- [ ] `docs/images/sarek_subway.png` - Exported PNG of updated metro map +- [ ] `CITATIONS.md` - Tool citation added +- [ ] `CHANGELOG.md` - Addition documented + +#### For New Variant Callers + +Adding a variant caller touches **6 locations** — missing any of them causes silent bugs. All of the above "New Tools" items apply, plus: + +- [ ] **`nextflow_schema.json`** - Add to the `tools` parameter regex pattern +- [ ] **Dispatcher subworkflow** - Add call and wire outputs into `vcf_all.mix(...)`: + - `subworkflows/local/bam_variant_calling_germline_all/main.nf` (germline callers) + - `subworkflows/local/bam_variant_calling_somatic_all/main.nf` (somatic pair callers) + - `subworkflows/local/bam_variant_calling_tumor_only_all/main.nf` (tumor-only callers) + - Use channel operations (`filter`, `branch`) to control execution — not `if` blocks (existing `if` blocks are legacy) +- [ ] **`subworkflows/local/post_variantcalling/main.nf`** - Add to `small_variantcallers` list (for SNV callers eligible for normalization/filtering/consensus) or `excluded_variantcallers` (for SV callers). **Forgetting this silently excludes the caller from post-processing.** +- [ ] **Individual subworkflow** - Set `variantcaller` in meta map (e.g., `meta + [variantcaller: 'toolname']`) + +#### For New Parameters + +- [ ] Default value in `nextflow.config` +- [ ] Schema updated: `nf-core pipelines schema build` +- [ ] Validation added (if needed) +- [ ] Documentation in `docs/usage.md` +- [ ] CHANGELOG updated + +#### For Changes Affecting Pipeline Output + +Any PR that changes output files (new files, renamed files, changed content): + +- [ ] `docs/output.md` updated to reflect changes +- [ ] `CHANGELOG.md` updated +- [ ] If significant workflow change: metro map updated (`docs/images/sarek_subway.*`) + +### Common Gotchas + +#### 1. Forgetting `failOnDuplicate`/`failOnMismatch` on Joins + +**Problem:** Silent data loss or incorrect pairing +**Solution:** Always use `join(..., failOnDuplicate: true, failOnMismatch: true)` + +#### 2. Strelka Produces Two VCFs + +**Problem:** Strelka outputs SNV and Indel VCFs separately +**Solution:** Use `groupTuple(size: 2)` then `BCFTOOLS_CONCAT` before downstream processing + +#### 3. Blocking GroupTuple + +**Problem:** `groupTuple()` without size blocks pipeline +**Solution:** Use `groupKey(meta, meta.num_intervals)` when size is known + +#### 4. Meta Fields Persisting + +**Problem:** Temporary meta fields (like `num_intervals`) persist in output +**Solution:** Clean up with `meta - meta.subMap('field_name')` before emit + +#### 5. DeepVariant Conda + +**Problem:** DeepVariant doesn't support Conda +**Solution:** Note in module: `// FIXME Conda is not supported at the moment` + +#### 6. BWA Memory Requirements + +**Problem:** Unexpected OOM errors +**Solution:** BWA requires ~5.37N memory, BWA-MEM2 requires ~28N GB where N = reference size + +#### 7. Using Deprecated `ext.when` Pattern + +**Problem:** Old code uses `ext.when` in config to control module execution +**Solution:** When touching this code, refactor to use channel operations (`filter`, `branch`) to control dataflow. Avoid both `ext.when` AND `if` statements where possible. + +#### 8. Forgetting to Register a New Variant Caller + +**Problem:** New variant caller runs and produces VCFs, but is silently excluded from normalization, filtering, and consensus calling +**Solution:** Must update all 6 registration points — see [For New Variant Callers](#for-new-variant-callers) checklist. The most commonly missed is `post_variantcalling/main.nf`'s `small_variantcallers` list. + +#### 9. Implicit Variables in Closures + +**Problem:** Using implicit `it` makes code harder to read and review +**Solution:** Always use explicit named parameters in closures: `.map { meta, vcf -> ... }` not `.map { it[0], it[1] -> ... }` + +### Getting Help + +- **Slack:** [#sarek channel](https://nfcore.slack.com/channels/sarek) +- **GitHub Issues:** [nf-core/sarek/issues](https://github.com/nf-core/sarek/issues) +- **Documentation:** [nf-co.re/sarek](https://nf-co.re/sarek) + +### Quick Reference + +#### Essential Commands + +```bash +# Run tests +nf-test test --profile=+debug,docker + +# Lint pipeline +nf-core pipelines lint + +# Update schema +nf-core pipelines schema build + +# Install/update module +nf-core modules install / +nf-core modules update / +``` + +#### Key Files for Common Changes + +| Change Type | Primary Files | +| ------------- | ----------------------------------------------- | +| New parameter | `nextflow.config`, `nextflow_schema.json` | +| New tool | `conf/modules/.config`, subworkflow, test | +| Bug fix | Relevant module/subworkflow, test | +| Documentation | `docs/usage.md`, `docs/output.md` | +| Any change | `CHANGELOG.md` | diff --git a/docs/DEVELOPER_GUIDELINES.md b/docs/DEVELOPER_GUIDELINES.md deleted file mode 100644 index 9710248b23..0000000000 --- a/docs/DEVELOPER_GUIDELINES.md +++ /dev/null @@ -1,1009 +0,0 @@ -# nf-core/sarek Developer Guidelines - -This document provides comprehensive guidelines for contributing to the nf-core/sarek pipeline. These guidelines are designed for both human developers and AI agents. - -## Table of Contents - -- [Contributing Principles](#contributing-principles) -- [Git Workflow](#git-workflow) -- [Codebase Architecture](#codebase-architecture) -- [Code Style](#code-style) -- [Channel Operations and Gotchas](#channel-operations-and-gotchas) -- [Meta Map Handling](#meta-map-handling) -- [Modules](#modules) -- [Subworkflows](#subworkflows) -- [Configuration](#configuration) -- [Testing](#testing) -- [Documentation](#documentation) -- [Metro Map Updates](#metro-map-updates) -- [PR Checklist](#pr-checklist) - ---- - -## Contributing Principles - -- **One PR, one feature** — scope each PR to a single change; keep it as minimal as possible -- **Read files before editing** — understand existing code before making changes -- Keep fixes **minimal and focused** — don't refactor surrounding code -- Don't add docstrings, comments, or type annotations to unchanged code -- Don't add error handling or validation beyond what's needed -- Don't over-engineer: no premature abstractions, no feature flags -- When unsure about scope or approach, ask rather than guess - ---- - -## Git Workflow - -- **Always branch off `origin/dev`**, never master -- Branch naming: `fix/issue-XXXX` or `feat/issue-XXXX` -- PRs target the `dev` branch -- Never force push, never amend published commits without asking -- Commit messages should be descriptive and include the issue reference - ---- - -## Codebase Architecture - -Sarek follows a hierarchical, modular architecture: - -``` -Modules (atomic processes) → Subworkflows (composed modules) → Workflow (orchestration) -``` - -**Key design principles:** - -- Separation of concerns between processing steps -- Reusable components through nf-core modules ecosystem -- Configuration-driven behavior via `ext.*` directives -- Comprehensive testing with nf-test - -### Directory Structure - -``` -sarek/ -├── main.nf # Pipeline entry point -├── nextflow.config # Main configuration -├── nextflow_schema.json # Parameter schema (JSON Schema) -├── modules.json # nf-core module tracking -├── modules/ -│ ├── local/ # Pipeline-specific modules -│ └── nf-core/ # Imported nf-core modules -├── subworkflows/ -│ ├── local/ # Pipeline-specific subworkflows -│ └── nf-core/ # Imported nf-core subworkflows -├── workflows/sarek/main.nf # Main workflow orchestration -├── conf/ -│ ├── base.config # Default resource allocations -│ ├── modules/ # Module-specific configurations -│ └── test/ # Test configurations -├── tests/ # nf-test test files -├── docs/ # Documentation -└── assets/ # MultiQC config, samplesheets, etc. -``` - ---- - -## Code Style - -### Harshil Alignment - -Use "Harshil alignment" for include statements - align the closing braces to improve readability: - -```groovy -// CORRECT - Harshil alignment -include { paramsSummaryMap } from 'plugin/nf-schema' -include { paramsSummaryMultiqc } from '../../subworkflows/nf-core/utils_nfcore_pipeline' -include { softwareVersionsToYAML } from '../../subworkflows/nf-core/utils_nfcore_pipeline' -include { methodsDescriptionText } from '../../subworkflows/local/utils_nfcore_sarek_pipeline' - -// CORRECT - With aliases -include { BAM_CONVERT_SAMTOOLS as CONVERT_FASTQ_INPUT } from '../../subworkflows/local/bam_convert_samtools' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R1_FQ } from '../../modules/nf-core/spring/decompress' -include { SPRING_DECOMPRESS as SPRING_DECOMPRESS_TO_R2_FQ } from '../../modules/nf-core/spring/decompress' - -// INCORRECT - No alignment -include { paramsSummaryMap } from 'plugin/nf-schema' -include { paramsSummaryMultiqc } from '../../subworkflows/nf-core/utils_nfcore_pipeline' -``` - -### Harshil Alignment in Take/Emit Blocks - -Also apply alignment to `take:` and `emit:` blocks: - -```groovy -take: -cram // channel: [mandatory] [ meta, cram, crai ] -dict // channel: [optional] [ meta, dict ] -fasta // channel: [mandatory] [ fasta ] -fasta_fai // channel: [mandatory] [ fasta_fai ] -intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi, num_intervals ] - -emit: -vcf_ann // channel: [ val(meta), vcf.gz, vcf.gz.tbi ] -tab_ann -json_ann -reports // path: *.html -versions // path: versions.yml -``` - -### Channel Naming Conventions - -```groovy -// Initial process output channel -ch_output_from_ - -// Intermediate/terminal channels -ch__for_ - -// Example -ch_bam_from_markduplicates -ch_markduplicates_for_baserecalibrator -``` - -### Topic Channels - -We are migrating to **Nextflow topic channels** where possible. Topics allow processes and subworkflows to publish to a named topic without explicit channel wiring. - -When installing or updating an nf-core module, check if it publishes `versions` or `multiqc` outputs via topics. If it does, use the topic and remove the explicit `.mix()` wiring for those channels. - -```groovy -// OLD - Explicit version/report collection -versions = versions.mix(TOOL_A.out.versions) -ch_multiqc_files = ch_multiqc_files.mix(TOOL_A.out.report) - -// NEW - If the module uses topics, remove the .mix() lines above. -// The module already publishes to the topic internally. -// Collect from the topic in the top-level workflow: -// ch_versions = Channel.topic('versions') -``` - -### General Style - -- Use 4-space indentation -- Put channel operations on separate lines for readability -- Add comments for complex logic -- Use descriptive variable names - -### Strict Syntax Mode - -**When touching any code in a PR, you must update it to use strict Nextflow syntax.** This ensures gradual modernization of the codebase. - -#### Required Changes When Modifying Code - -1. **Use explicit `it` variable or named parameters in closures:** - - ```groovy - // CORRECT - Explicit named parameters - .map { meta, vcf -> [meta, vcf] } - - // CORRECT - Explicit `it` when single parameter - .map { it -> it.baseName } - - // DEPRECATED - Implicit `it` - .map { it.baseName } - ``` - -2. **Explicit type declarations where applicable:** - - ```groovy - // CORRECT - String prefix = "${meta.id}" - List args = [] - - // AVOID in new code - def prefix = "${meta.id}" - ``` - -3. **Use underscore prefix for unused/dropped variables:** - - The underscore prefix convention clearly indicates which variables from a closure are intentionally not used in the output. This makes code review easier and prevents confusion about whether a variable was accidentally omitted. - - ```groovy - // CORRECT - Underscore prefix shows vcf is intentionally dropped - .map { meta, _vcf, tbi -> [meta, tbi] } - - // CORRECT - Multiple dropped variables - .map { meta, _vcf, _tbi, file -> [meta, file] } - - // CORRECT - In join operations - .join(other_channel, failOnDuplicate: true, failOnMismatch: true) - .map { meta, file1, _file2 -> [meta, file1] } - - // CORRECT - When extracting from complex structures - VCF_ANNOTATE_SNPEFF.out.vcf_tbi.map { meta, vcf_, _tbi -> [meta, vcf_, []] } - - // INCORRECT - Unclear which variables are intentionally unused - .map { meta, vcf, tbi -> [meta, tbi] } - ``` - - **When to use underscore prefix:** - - Variable is received but not included in output - - Variable is needed for destructuring but value is discarded - - Makes intent clear during code review - ---- - -## Channel Operations and Gotchas - -### Join Operations - ALWAYS Use `failOnDuplicate` and `failOnMismatch` - -When joining channels, ALWAYS specify `failOnDuplicate: true, failOnMismatch: true` to catch bugs early: - -```groovy -// CORRECT - Will fail fast if there are issues -vcf_tbi = vcf.join(tbi, failOnDuplicate: true, failOnMismatch: true) - -// INCORRECT - Silent failures can cause subtle bugs -vcf_tbi = vcf.join(tbi) -``` - -Use `remainder: true` only when intentionally handling unmatched items: - -```groovy -// When some items may not have matches (intentional) -all_unmapped_bam = SAMTOOLS_VIEW_UNMAP_UNMAP.out.bam - .join(SAMTOOLS_VIEW_UNMAP_MAP.out.bam, failOnDuplicate: true, remainder: true) - .join(SAMTOOLS_VIEW_MAP_UNMAP.out.bam, failOnDuplicate: true, remainder: true) -``` - -### Branch Operations - -Use `branch` to split channels based on conditions: - -```groovy -vcf_out = STRELKA_SINGLE.out.vcf.branch{ - // Use meta.num_intervals to assess number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 -} - -// Access branches -vcf_out.intervals // Items where num_intervals > 1 -vcf_out.no_intervals // Items where num_intervals <= 1 -``` - -### GroupTuple - Use `groupKey` for Performance - -When using `groupTuple`, use `groupKey` with known size to avoid blocking: - -```groovy -// CORRECT - Non-blocking when size is known -vcf_to_merge = vcf_out.intervals - .map{ meta, vcf -> [ groupKey(meta, meta.num_intervals), vcf ]} - .groupTuple() - -// NOTE: Without groupKey and size, groupTuple is a blocking operation -// This can cause pipeline hangs if the expected number of items varies -``` - -### Strelka Special Case - SNV and Indel VCFs - -Strelka produces TWO VCF files (SNVs and Indels) that need special handling: - -```groovy -// Strelka somatic outputs need to be concatenated before consensus calling -ch_vcfs = vcfs.branch{ meta, vcf, tbi -> - strelka_somatic: meta.variantcaller == 'strelka' && meta.status == '1' - other: true -} - -// Concatenate the two strelka VCFs (SNPs and indels) using groupTuple(size: 2) -BCFTOOLS_CONCAT(ch_vcfs.strelka_somatic.groupTuple(size: 2)) -``` - -### Combine vs Join - -- Use `join` when combining channels by a key (meta map) -- Use `combine` when creating cartesian product (e.g., sample x intervals) - -```groovy -// Join by meta key -vcf_tbi = vcf.join(tbi, failOnDuplicate: true, failOnMismatch: true) - -// Combine all samples with all intervals (cartesian product) -cram_intervals = cram.combine(intervals) -``` - -### Controlling Flow with Channel Operations (Preferred) - -**Nextflow is a dataflow language.** Prefer channel operations over `if` statements to control which processes run: - -```groovy -// BEST - Use filter to control what enters a process -input_channel - .filter { meta, _file -> params.tools?.split(',')?.contains('toolname') } - .set { ch_for_tool } - -TOOL_PROCESS(ch_for_tool) - -// BEST - Use branch for multiple conditional paths -input_channel.branch { meta, file -> - tool_a: params.tools?.split(',')?.contains('tool_a') - tool_b: params.tools?.split(',')?.contains('tool_b') - other: true -}.set { ch_branched } - -TOOL_A(ch_branched.tool_a) -TOOL_B(ch_branched.tool_b) - -// AVOID - if statements for flow control (use only when channel ops aren't suitable) -if (params.run_tool) { - TOOL_PROCESS(input_channel) -} -``` - -**Benefits of channel operations:** - -- More idiomatic Nextflow - data drives execution -- Better composability and testability -- Clearer dataflow visualization -- Avoids caching issues when conditions change - ---- - -## Meta Map Handling - -### Adding Fields to Meta - -Use `meta + [key: value]` syntax: - -```groovy -// Add single field -meta = meta + [id: meta.sample] - -// Add multiple fields -meta = meta + [id: "${meta.sample}-${meta.lane}".toString(), data_type: "fastq_gz", num_lanes: num_lanes.toInteger()] - -// In map operation -.map{ meta, vcf -> [ meta + [ variantcaller:'strelka' ], vcf ] } -``` - -### Removing Fields from Meta - Use `subMap` - -Use `meta - meta.subMap('field')` to remove fields: - -```groovy -// Remove single field -.map{ meta, vcf -> [ meta - meta.subMap('num_intervals'), vcf ] } - -// Remove multiple fields -.map{ meta, vcf, tbi -> - [meta - meta.subMap('variantcaller', 'contamination', 'filename'), vcf, tbi] -} - -// Add and remove in one operation -.map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], vcf ] } -``` - -### Accessing Meta Fields - -```groovy -// In map closures -.map{ meta, file -> [meta.sample, file] } - -// In branch conditions -.branch{ meta, vcf -> - intervals: meta.num_intervals > 1 - no_intervals: meta.num_intervals <= 1 -} - -// Getting subset of meta -[meta.patient, meta.subMap('sample', 'status')] -``` - -### Common Meta Fields in Sarek - -| Field | Description | -| -------------------- | --------------------------------------------- | -| `meta.patient` | Patient identifier | -| `meta.sample` | Sample identifier | -| `meta.status` | 0 = normal, 1 = tumor | -| `meta.lane` | Sequencing lane | -| `meta.id` | Unique identifier (often `${sample}-${lane}`) | -| `meta.data_type` | Input type: `fastq_gz`, `bam`, `cram` | -| `meta.num_intervals` | Number of intervals for scatter/gather | -| `meta.variantcaller` | Name of variant caller | -| `meta.num_lanes` | Total number of lanes for sample | - ---- - -## Modules - -### DEPRECATED: The `ext.when` Clause Pattern - -> **DEPRECATED:** The `ext.when` clause pattern is deprecated and should NOT be used in new code. Existing code using this pattern should be refactored when touched in a PR. - -You may see comments in older subworkflow files like: - -```groovy -// For all modules here: -// A when clause condition is defined in the conf/modules.config to determine if the module should be run -``` - -**Do not follow this pattern for new code.** Instead, prefer channel operations to control dataflow: - -```groovy -// BEST - Use channel operations (filter, branch) to control dataflow -input_channel - .filter { meta, _file -> params.tools?.split(',')?.contains('toolname') } - .set { ch_for_tool } - -TOOL_PROCESS(ch_for_tool) - -// ACCEPTABLE - When channel operations aren't suitable, use explicit conditional -if (tools && tools.split(',').contains('toolname')) { - TOOL_PROCESS(input_channel) - versions = versions.mix(TOOL_PROCESS.out.versions) -} - -// DEPRECATED - Using ext.when in config -// withName: 'TOOL_PROCESS' { -// ext.when = { params.tools && params.tools.split(',').contains('toolname') } -// } -``` - -**Why channel operations are preferred:** - -- Nextflow is a dataflow language - let the data drive execution -- Channel operations are more composable and testable -- Avoids issues with process caching when conditions change -- Makes the pipeline logic more explicit and traceable - -### Remapping Channels for Module Input - -When a module expects different input structure, remap in the call: - -```groovy -// Remap channel to match module/subworkflow input signature -BAM_VARIANT_CALLING_CNVKIT( - cram.map{ meta, cram, crai -> [ meta, [], cram ] }, - fasta, - fasta_fai, - intervals_bed_combined.map{it -> it ? [[id:it[0].baseName], it]: [[id:'no_intervals'], []]}, - params.cnvkit_reference ? cnvkit_reference.map{ it -> [[id:it[0].baseName], it] } : [[:],[]] -) -``` - -### Module Memory Requirements - -Some modules have specific memory requirements noted in comments: - -```groovy -// In modules/nf-core/bwa/index/main.nf: -// NOTE requires 5.37N memory where N is the size of the database - -// In modules/nf-core/bwamem2/index/main.nf: -// NOTE Requires 28N GB memory where N is the size of the reference sequence, floor of 280M -``` - -### Adding/Updating nf-core Modules - -```bash -# Install a new module -nf-core modules install / - -# Update an existing module -nf-core modules update / - -# List installed modules -nf-core modules list local -``` - -### Updating VEP modules - -When updating `ensemblvep/vep` module, always update the `vep_version` parameter to match the new VEP version. This parameter is used by the LoFTEE plugin to locate the VEP installation path (e.g. `/opt/conda/share/ensembl-vep-${vep_version}`). - -Also update `vep_cache_version` in `conf/igenomes.config` for available genomes, based on what's available on [annotation-cache](https://annotation-cache.github.io/ensemblvep/). Not all genomes may have a cache for the new version — only update those that do. - ---- - -## Subworkflows - -### Subworkflow Naming Patterns - -| Category | Naming Pattern | Examples | -| --------------- | ----------------------- | ----------------------------------------- | -| Alignment | `fq_align_*` | `fq_align_bwamem`, `fq_align_bwamem2` | -| BAM processing | `bam_*` | `bam_markduplicates`, `bam_applybqsr` | -| Variant calling | `bam_variant_calling_*` | `bam_variant_calling_germline_all` | -| VCF processing | `vcf_*` | `vcf_annotate_all`, `vcf_concat_variants` | -| Preparation | `prepare_*` | `prepare_genome`, `prepare_intervals` | - -### Subworkflow Structure - -```groovy -// -// DESCRIPTION OF SUBWORKFLOW -// - -include { MODULE_A } from '../../../modules/nf-core/module_a' -include { MODULE_B } from '../../../modules/nf-core/module_b' -include { MODULE_B as MODULE_B_ALIAS } from '../../../modules/nf-core/module_b' - -workflow SUBWORKFLOW_NAME { - take: - input_channel // channel: [mandatory] [ meta, file ] - other_inputs // channel: [optional] description - - main: - versions = Channel.empty() - - // Initialize output channels - output_a = Channel.empty() - output_b = Channel.empty() - - // PREFERRED: Use channel operations to control dataflow - ch_for_module_a = input_channel - .filter { meta, _file -> meta.run_module_a } - - MODULE_A(ch_for_module_a) - versions = versions.mix(MODULE_A.out.versions) - - MODULE_B(MODULE_A.out.result) - versions = versions.mix(MODULE_B.out.versions) - - emit: - result = MODULE_B.out.result // channel: [ val(meta), file ] - versions // channel: versions.yml -} -``` - -### Scatter-Gather Pattern - -Common pattern for parallelizing over intervals: - -```groovy -// Combine samples with intervals for scatter strategy -cram_intervals = cram.combine(intervals) - // Move num_intervals to meta map for later grouping - .map{ meta, cram, crai, intervals, intervals_index, num_intervals -> - [ meta + [ num_intervals:num_intervals ], cram, crai, intervals, intervals_index ] - } - -// Run process on each interval -PROCESS(cram_intervals, fasta, fasta_fai) - -// Gather: Branch by whether intervals were used -vcf_out = PROCESS.out.vcf.branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 -} - -// Merge interval results -vcf_to_merge = vcf_out.intervals - .map{ meta, vcf -> [ groupKey(meta, meta.num_intervals), vcf ]} - .groupTuple() - -MERGE_VCFS(vcf_to_merge, dict) - -// Combine merged and non-interval results, clean up meta -vcf_final = Channel.empty() - .mix(MERGE_VCFS.out.vcf, vcf_out.no_intervals) - .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'toolname' ], vcf ] } -``` - ---- - -## Configuration - -### Module Configuration Files - -Module behavior is controlled via `conf/modules/.config`: - -```groovy -process { - withName: 'NEWTOOL_PROCESS' { - ext.args = { params.newtool_args ?: '' } - ext.prefix = { "${meta.id}.newtool" } - publishDir = [ - mode: params.publish_dir_mode, - path: { "${params.outdir}/variant_calling/newtool/${meta.id}/" }, - pattern: "*{vcf.gz,vcf.gz.tbi}" - ] - } -} -``` - -> **Note:** Older config files wrap process blocks in `if (params.tools && params.tools.split(',').contains('tool'))` guards. Do **not** use this pattern in new code — control which processes run via channel operations (`filter`, `branch`) in the workflow/subworkflow instead. When touching existing config files, remove these guards. - -### Resource Labels - -Use standard nf-core labels in `conf/base.config`: - -| Label | CPUs | Memory | Time | -| --------------------- | ---- | ------ | ---- | -| `process_single` | 1 | 6 GB | 8 h | -| `process_low` | 2 | 12 GB | 8 h | -| `process_medium` | 6 | 36 GB | 16 h | -| `process_high` | 12 | 72 GB | 32 h | -| `process_long` | - | - | 40 h | -| `process_high_memory` | - | 200 GB | - | - -### Adding New Parameters - -1. **Add to `nextflow.config`** with default value: - - ```groovy - params { - new_param = false - } - ``` - -2. **Update schema** using nf-core tools: - - ```bash - nf-core pipelines schema build - ``` - -3. **Add validation** if needed in the workflow - ---- - -## Testing - -### Test Framework - -Sarek uses **nf-test** for testing. Tests are in `tests/` directory. - -### Running Tests - -```bash -# Run all tests -nf-test test --profile debug,test,docker --verbose - -# Run specific test -nf-test test tests/variant_calling_haplotypecaller.nf.test --profile debug,test,docker - -# Run with stub mode (faster, no actual execution) -nf-test test tests/default.nf.test --profile debug,test,docker -stub - -# Update snapshots when outputs legitimately change -nf-test test tests/my_test.nf.test --profile debug,test,docker --update-snapshot -``` - -### Test Structure with UTILS.groovy - -Tests use a scenario-based pattern: - -```groovy -def projectDir = new File('.').absolutePath - -nextflow_pipeline { - name "Test pipeline" - script "../main.nf" - tag "pipeline" - tag "pipeline_sarek" - - def test_scenario = [ - [ - name: "Test scenario name", - params: [ - input: "${projectDir}/tests/csv/3.0/fastq_single.csv", - tools: 'haplotypecaller' - ] - ], - [ - name: "Test with stub", - params: [], - stub: true - ], - [ - name: "Fails with invalid input", - params: [ - input: "${projectDir}/tests/csv/3.0/vcf_single.csv", - step: 'annotate', - vep_cache_version: 1, - build_only_index: true, - tools: 'vep' - ], - failure: true, - stdout: "Expected error message" - ] - ] - - test_scenario.each { scenario -> - test(scenario.name, UTILS.get_test(scenario)) - } -} -``` - -### Test Scenario Options - -| Option | Description | -| ------------------------------ | ----------------------------------------- | -| `name` | Test name (descriptive) | -| `params` | Map of parameters to set | -| `stub` | Run in stub mode (boolean) | -| `failure` | Expect test to fail (boolean) | -| `stdout` | Expected stdout content for failure tests | -| `gpu` | GPU test (adds gpu tag) | -| `no_conda` | Incompatible with conda | -| `include_muse_txt` | Include MuSE txt in assertions | -| `include_freebayes_unfiltered` | Include freebayes unfiltered VCFs | -| `no_vcf_md5sum` | Use VCF summary instead of md5 | - ---- - -## Documentation - -### Documentation Requirements - -**Any change that affects pipeline output or adds new functionality MUST include documentation updates.** - -### Documentation Files - -| File | Purpose | When to Update | -| ---------------- | ------------------------ | ----------------------------------------------- | -| `README.md` | Pipeline overview | **New tools** (add to overview/tool list) | -| `docs/usage.md` | Usage instructions | New parameters, new tools, input format changes | -| `docs/output.md` | Output file descriptions | **Any change to outputs**, new tools | -| `CHANGELOG.md` | Version history | Every PR | -| `CITATIONS.md` | Tool citations | New tools | -| `docs/images/` | Metro maps, diagrams | **New tools**, workflow changes | - -### New Tool Documentation Checklist - -When adding a new tool, you **MUST** update ALL of the following: - -1. **`README.md`** - Add tool to the pipeline overview/feature list -2. **`docs/usage.md`** - Document all new parameters and usage instructions -3. **`docs/output.md`** - Document all output files produced by the tool -4. **`docs/images/sarek_subway.*`** - Add tool to the metro map (SVG and PNG) -5. **`CITATIONS.md`** - Add tool citation -6. **`CHANGELOG.md`** - Document the addition - -### Output Changes Documentation - -Any PR that changes pipeline outputs (new files, changed file names, different content) **MUST** update: - -1. **`docs/output.md`** - Reflect the new/changed outputs -2. **`CHANGELOG.md`** - Note the change under appropriate section - -### CHANGELOG Format - -Follow [Keep a Changelog](https://keepachangelog.com/) format. - -**Important conventions:** - -- Entries reference the **PR number**, not the issue number: - ``` - - [#XXX](https://github.com/nf-core/sarek/pull/XXX) - Description of change - ``` -- Use `XXX` as placeholder when no PR exists yet -- The issue number goes in the **PR description body** (for auto-close), not the changelog -- Entries within each section are in **ascending order** by PR number - -```markdown -## [Unreleased] - -### Added - -- [#PR_NUMBER](https://github.com/nf-core/sarek/pull/PR_NUMBER) - Description - -### Changed - -### Fixed - -### Removed - -### Dependencies - -| Dependency | Old version | New version | -| ---------- | ----------- | ----------- | -| tool_name | 1.0.0 | 1.1.0 | - -### Parameters - -| Params | status | -| ------------- | ------ | -| `--new_param` | New | - -### Developer section - -#### Added - -#### Changed - -#### Fixed - -#### Removed -``` - -### Output Documentation - -In `docs/output.md`, document each tool's outputs: - -```markdown -### Tool Name - -
-Output files - -- `path/to/output/` - - `*.extension`: Description of the file - -
- -Brief description of what this tool produces. -``` - ---- - -## Metro Map Updates - -### Metro Map Files - -Located in `docs/images/`: - -- `sarek_subway.svg` / `sarek_subway.png` - Main pipeline flow -- `sarek_indices_subway.svg` / `sarek_indices_subway.png` - Index building flow - -### When to Update - -- Adding new tools or variant callers -- Adding new preprocessing steps -- Changing the pipeline flow -- Adding new post-processing options - -### Update Process - -1. Edit the SVG file (use Inkscape or similar) -2. Export to PNG -3. Follow nf-core [design guidelines](https://nf-co.re/developers/design_guidelines) -4. After release, checkout figures from `master` to `dev`: - ```bash - git checkout upstream/master -- docs/images/sarek_subway.svg - git checkout upstream/master -- docs/images/sarek_subway.png - ``` - ---- - -## PR Checklist - -### Before Submitting - -- [ ] PR targets `dev` branch (not `master`) -- [ ] Code follows Harshil alignment style -- [ ] **Any touched code updated to strict syntax** (explicit closure params, underscore for unused vars) -- [ ] **No new `ext.when` usage** - use channel operations instead -- [ ] **Prefer channel operations** (`filter`, `branch`) over `if` statements for flow control -- [ ] Pre-commit checks pass: `pre-commit run --all-files` -- [ ] All tests pass: `nf-test test --profile debug,test,docker` -- [ ] Linting passes: `nf-core pipelines lint` -- [ ] No debug mode warnings - -### For New Tools - -**Code:** - -- [ ] Module added/imported correctly -- [ ] Configuration in `conf/modules/.config` -- [ ] Test added in `tests/` -- [ ] MultiQC config updated (`assets/multiqc_config.yml`) if tool has MultiQC module - -**Documentation (ALL required):** - -- [ ] `README.md` - Tool added to pipeline overview/feature list -- [ ] `docs/usage.md` - All parameters documented with usage instructions -- [ ] `docs/output.md` - All output files documented -- [ ] `docs/images/sarek_subway.svg` - Tool added to metro map -- [ ] `docs/images/sarek_subway.png` - Exported PNG of updated metro map -- [ ] `CITATIONS.md` - Tool citation added -- [ ] `CHANGELOG.md` - Addition documented - -### For New Variant Callers - -Adding a variant caller touches **6 locations** — missing any of them causes silent bugs. All of the above "New Tools" items apply, plus: - -- [ ] **`nextflow_schema.json`** - Add to the `tools` parameter regex pattern -- [ ] **Dispatcher subworkflow** - Add call and wire outputs into `vcf_all.mix(...)`: - - `subworkflows/local/bam_variant_calling_germline_all/main.nf` (germline callers) - - `subworkflows/local/bam_variant_calling_somatic_all/main.nf` (somatic pair callers) - - `subworkflows/local/bam_variant_calling_tumor_only_all/main.nf` (tumor-only callers) - - Use channel operations (`filter`, `branch`) to control execution — not `if` blocks (existing `if` blocks are legacy) -- [ ] **`subworkflows/local/post_variantcalling/main.nf`** - Add to `small_variantcallers` list (for SNV callers eligible for normalization/filtering/consensus) or `excluded_variantcallers` (for SV callers). **Forgetting this silently excludes the caller from post-processing.** -- [ ] **Individual subworkflow** - Set `variantcaller` in meta map (e.g., `meta + [variantcaller: 'toolname']`) - -### For New Parameters - -- [ ] Default value in `nextflow.config` -- [ ] Schema updated: `nf-core pipelines schema build` -- [ ] Validation added (if needed) -- [ ] Documentation in `docs/usage.md` -- [ ] CHANGELOG updated - -### For Changes Affecting Pipeline Output - -Any PR that changes output files (new files, renamed files, changed content): - -- [ ] `docs/output.md` updated to reflect changes -- [ ] `CHANGELOG.md` updated -- [ ] If significant workflow change: metro map updated (`docs/images/sarek_subway.*`) - ---- - -## Common Gotchas - -### 1. Forgetting `failOnDuplicate`/`failOnMismatch` on Joins - -**Problem:** Silent data loss or incorrect pairing -**Solution:** Always use `join(..., failOnDuplicate: true, failOnMismatch: true)` - -### 2. Strelka Produces Two VCFs - -**Problem:** Strelka outputs SNV and Indel VCFs separately -**Solution:** Use `groupTuple(size: 2)` then `BCFTOOLS_CONCAT` before downstream processing - -### 3. Blocking GroupTuple - -**Problem:** `groupTuple()` without size blocks pipeline -**Solution:** Use `groupKey(meta, meta.num_intervals)` when size is known - -### 4. Meta Fields Persisting - -**Problem:** Temporary meta fields (like `num_intervals`) persist in output -**Solution:** Clean up with `meta - meta.subMap('field_name')` before emit - -### 5. DeepVariant Conda - -**Problem:** DeepVariant doesn't support Conda -**Solution:** Note in module: `// FIXME Conda is not supported at the moment` - -### 6. BWA Memory Requirements - -**Problem:** Unexpected OOM errors -**Solution:** BWA requires ~5.37N memory, BWA-MEM2 requires ~28N GB where N = reference size - -### 7. Using Deprecated `ext.when` Pattern - -**Problem:** Old code uses `ext.when` in config to control module execution -**Solution:** When touching this code, refactor to use channel operations (`filter`, `branch`) to control dataflow. Nextflow is a dataflow language - let the data drive execution. Avoid both `ext.when` AND `if` statements where possible. - -### 8. Forgetting to Register a New Variant Caller - -**Problem:** New variant caller runs and produces VCFs, but is silently excluded from normalization, filtering, and consensus calling -**Solution:** Must update all 6 registration points — see [For New Variant Callers](#for-new-variant-callers) checklist. The most commonly missed is `post_variantcalling/main.nf`'s `small_variantcallers` list. - -### 9. Implicit Variables in Closures - -**Problem:** Using implicit `it` makes code harder to read and review -**Solution:** Always use explicit named parameters in closures: `.map { meta, vcf -> ... }` not `.map { it[0], it[1] -> ... }` - ---- - -## Quick Reference - -### Essential Commands - -```bash -# Run tests -nf-test test --profile debug,test,docker - -# Lint pipeline -nf-core pipelines lint - -# Update schema -nf-core pipelines schema build - -# Install/update module -nf-core modules install / -nf-core modules update / -``` - -### Key Files for Common Changes - -| Change Type | Primary Files | -| ------------- | ----------------------------------------------- | -| New parameter | `nextflow.config`, `nextflow_schema.json` | -| New tool | `conf/modules/.config`, subworkflow, test | -| Bug fix | Relevant module/subworkflow, test | -| Documentation | `docs/usage.md`, `docs/output.md` | -| Any change | `CHANGELOG.md` | - ---- - -## Getting Help - -- **Slack:** [#sarek channel](https://nfcore.slack.com/channels/sarek) -- **GitHub Issues:** [nf-core/sarek/issues](https://github.com/nf-core/sarek/issues) -- **Documentation:** [nf-co.re/sarek](https://nf-co.re/sarek) From de19184f59f8e74b2037d3e6bcf243f0a56f1390 Mon Sep 17 00:00:00 2001 From: apolitics <55941893+apolitics@users.noreply.github.com> Date: Tue, 14 Jul 2026 15:28:25 +0300 Subject: [PATCH 06/27] =?UTF-8?q?Fix=20`--normalize=5Fvcfs`=20dropping=20a?= =?UTF-8?q?n=20allele=20of=201/2=20multiallelic=20sites=20(`--rm-dup=20all?= =?UTF-8?q?`=20=E2=86=92=20`exact`)=20(#2216)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Closes #2215. When `--normalize_vcfs` is enabled, `VCFS_NORM` runs `bcftools norm --multiallelics -both --rm-dup all`. Because `-m -both` splits a multiallelic record into per-allele rows **at the same position**, the subsequent `--rm-dup all` (which de-duplicates **by position**) deletes all but the first row, **silently dropping a real ALT allele** of heterozygous two-alt (`1/2`) sites. This switches the argument to `--rm-dup exact`, which still removes truly identical duplicate records (the stated intent of the existing comment) but no longer collapses two distinct alleles that share a position. ## Evidence Test profile, `chr22:13575` (DeepVariant `G → C,T`, GT `1/2`): | `bcftools norm` args | records | site 13575 | |---|---|---| | `-m -both --rm-dup all` (before) | 17 | only `G→C` — `G→T` lost | | `-m -both --rm-dup exact` (after) | 18 | `G→C` and `G→T` | Verified end-to-end by re-running `-profile test,docker --tools deepvariant --normalize_vcfs --filter_vcfs` with the change: the normalized VCF keeps both alleles. ## PR checklist - [x] Minimal, focused change (one config argument + CHANGELOG) - [x] Branched off `dev`, targets `dev` - [x] `CHANGELOG.md` updated - [ ] CI green Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: Maxime U Garcia --- CHANGELOG.md | 2 ++ conf/modules/post_variant_calling.config | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 175d6dc100..c00d1f3fab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [#2216](https://github.com/nf-core/sarek/pull/2216) - Fix `--normalize_vcfs` dropping a real ALT allele of `1/2` multiallelic sites (`bcftools norm --rm-dup all` → `--rm-dup exact`) + ### Removed ### Dependencies - modules diff --git a/conf/modules/post_variant_calling.config b/conf/modules/post_variant_calling.config index 2eb80cd0dd..a42cefd668 100644 --- a/conf/modules/post_variant_calling.config +++ b/conf/modules/post_variant_calling.config @@ -41,7 +41,7 @@ process { ext.prefix = { vcf.baseName - '.added_info.vcf' + '.norm' } ext.args = { [ '--multiallelics -both', // split multiallelic sites into biallelic records and both SNPs and indels should be merged separately into two records - '--rm-dup all' // output only the first instance of a record which is present multiple times + '--rm-dup exact' // output only the first instance of a record which is present multiple times ].join(' ') } publishDir = [ enabled: false From 41a8e7059a7b070dabbc1575054af397b15a19ed Mon Sep 17 00:00:00 2001 From: Jonathan Manning Date: Wed, 15 Jul 2026 11:11:40 +0100 Subject: [PATCH 07/27] Skip nf-schema path validation for annotation_cache and igenomes_base (#2184) ## Summary `snpeff_cache`, `vep_cache` and `igenomes_base` are declared in the schema with `format: directory-path` and default to S3 buckets. nf-schema 2.5+ resolves these defaults against the storage backend and fails the launch if the path is unreachable - no credentials, no network, or an SSO/IAM session that can't see the bucket. Any user without read access to `s3://annotation-cache/` (e.g. on-prem clusters, restricted cloud accounts) currently can't launch the pipeline at all, even when they have no intention of running snpEff or VEP. ## Details The full debate of where this fix belongs is in [nextflow-io/nf-schema#204](https://github.com/nextflow-io/nf-schema/issues/204). The plugin maintainer's settled position is that: 1. The validator should fail when a configured path is unreachable - that's the point. 2. The right fix for default-only S3 paths that nobody explicitly opted into is to: - drop `format: "directory-path"` so the existence probe never runs, and - add the param to `validation.defaultIgnoreParams` so nf-schema skips it entirely. That guidance has been applied in nf-core/rnaseq for `igenomes_base` (PRs [#1696](https://github.com/nf-core/rnaseq/pull/1696) and [#1739](https://github.com/nf-core/rnaseq/pull/1739)). This PR applies the same treatment to sarek's three S3-defaulted directory params. PR [#2083](https://github.com/nf-core/sarek/pull/2083) already removed `exists: true` from `snpeff_cache`/`vep_cache`, but `format: directory-path` alone is enough to trigger the existence check, so launches still fail for users without access to the default bucket. Fixes #2079 ## Changes - `nextflow.config`: add `igenomes_base`, `snpeff_cache`, `vep_cache` to `validation.defaultIgnoreParams`. - `nextflow_schema.json`: drop `"format": "directory-path"` from the same three params. Derived/resolved paths are still validated individually downstream. ## Test plan - [ ] Launch from an environment without read access to `s3://annotation-cache/` - validation should now pass. - [ ] Launch with valid `--snpeff_cache`/`--vep_cache` overrides - annotation should still work. - [ ] Launch with `--tools snpeff,vep` and confirm download-cache flows still error appropriately if the path is bad at the point of use (not at schema validation). --------- Co-authored-by: Claude Opus 4.7 (1M context) Co-authored-by: Maxime U Garcia Co-authored-by: Friederike Hanssen --- CHANGELOG.md | 1 + nextflow.config | 2 +- nextflow_schema.json | 3 --- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c00d1f3fab..3f5691ffe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [#2184](https://github.com/nf-core/sarek/pull/2184) - Skip nf-schema path-existence validation for `snpeff_cache`, `vep_cache` and `igenomes_base` so pipeline launches succeed when the default S3 buckets are not accessible - [#2216](https://github.com/nf-core/sarek/pull/2216) - Fix `--normalize_vcfs` dropping a real ALT allele of `1/2` multiallelic sites (`bcftools norm --rm-dup all` → `--rm-dup exact`) ### Removed diff --git a/nextflow.config b/nextflow.config index 4a9b5bcd74..e29cdd1f5e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -779,7 +779,7 @@ plugins { } validation { - defaultIgnoreParams = ["genomes", "freebayes_filter", "vep_cache_version"] + defaultIgnoreParams = ["genomes", "freebayes_filter", "vep_cache_version", "igenomes_base", "snpeff_cache", "vep_cache"] monochromeLogs = params.monochrome_logs } diff --git a/nextflow_schema.json b/nextflow_schema.json index 19ef1af732..07493019c4 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -842,7 +842,6 @@ "properties": { "igenomes_base": { "type": "string", - "format": "directory-path", "description": "The base path to the igenomes reference files", "fa_icon": "fas fa-ban", "default": "s3://ngi-igenomes/igenomes/" @@ -1123,7 +1122,6 @@ }, "snpeff_cache": { "type": "string", - "format": "directory-path", "fa_icon": "fas fa-cloud-download-alt", "default": "s3://annotation-cache/snpeff_cache/", "description": "Path to snpEff cache.", @@ -1137,7 +1135,6 @@ }, "vep_cache": { "type": "string", - "format": "directory-path", "fa_icon": "fas fa-cloud-download-alt", "default": "s3://annotation-cache/vep_cache/", "description": "Path to VEP cache.", From a0d5fd30e88e132d4f8e2f62c3fb560f5e8d8b06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Famke=20B=C3=A4uerle?= <45968370+famosab@users.noreply.github.com> Date: Wed, 15 Jul 2026 14:40:25 +0200 Subject: [PATCH 08/27] Update bcftools to 1.23.1 (#2210) ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. - [ ] `README.md` is updated (including new tool citations and authors/contributors). --------- Co-authored-by: Maxime U Garcia Co-authored-by: Friederike Hanssen Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 3 + main.nf | 2 +- modules.json | 22 ++--- .../nf-core/bcftools/annotate/environment.yml | 5 +- modules/nf-core/bcftools/annotate/main.nf | 63 ++++++------- modules/nf-core/bcftools/annotate/meta.yml | 80 +++++++++-------- .../nf-core/bcftools/concat/environment.yml | 5 +- modules/nf-core/bcftools/concat/main.nf | 78 ++++++++-------- modules/nf-core/bcftools/concat/meta.yml | 58 ++++++------ modules/nf-core/bcftools/isec/environment.yml | 5 +- modules/nf-core/bcftools/isec/main.nf | 40 ++++----- modules/nf-core/bcftools/isec/meta.yml | 64 ++++++++++--- .../nf-core/bcftools/merge/environment.yml | 6 +- modules/nf-core/bcftools/merge/main.nf | 81 +++++++++-------- modules/nf-core/bcftools/merge/meta.yml | 49 +++++----- .../nf-core/bcftools/mpileup/environment.yml | 4 +- modules/nf-core/bcftools/mpileup/main.nf | 49 +++++----- modules/nf-core/bcftools/mpileup/meta.yml | 81 +++++++++++------ modules/nf-core/bcftools/norm/environment.yml | 5 +- modules/nf-core/bcftools/norm/main.nf | 62 ++++++------- modules/nf-core/bcftools/norm/meta.yml | 62 +++++++------ modules/nf-core/bcftools/sort/environment.yml | 5 +- modules/nf-core/bcftools/sort/main.nf | 69 +++++++------- modules/nf-core/bcftools/sort/meta.yml | 55 +++++++----- .../nf-core/bcftools/stats/environment.yml | 6 +- modules/nf-core/bcftools/stats/main.nf | 40 ++++----- modules/nf-core/bcftools/stats/meta.yml | 41 +++++++-- modules/nf-core/bcftools/view/environment.yml | 6 +- modules/nf-core/bcftools/view/main.nf | 76 ++++++++-------- modules/nf-core/bcftools/view/meta.yml | 53 +++++------ .../nf-core/ngscheckmate/ncm/environment.yml | 2 +- modules/nf-core/ngscheckmate/ncm/main.nf | 44 ++++----- modules/nf-core/ngscheckmate/ncm/meta.yml | 89 +++++++++++++------ .../bam_variant_calling_freebayes/main.nf | 1 - .../bam_variant_calling_germline_all/main.nf | 1 + .../local/bam_variant_calling_mpileup/main.nf | 13 ++- .../bam_variant_calling_somatic_all/main.nf | 2 + .../main.nf | 1 + subworkflows/local/cram_sampleqc/main.nf | 12 ++- .../local/post_variantcalling/main.nf | 5 +- subworkflows/local/prepare_genome/main.nf | 2 +- subworkflows/local/vcf_annotate_all/main.nf | 8 +- .../local/vcf_concatenate_germline/main.nf | 4 +- subworkflows/local/vcf_consensus/main.nf | 8 +- subworkflows/local/vcf_normalization/main.nf | 6 +- .../local/vcf_qc_bcftools_vcftools/main.nf | 1 - .../local/vcf_varlociraptor_single/main.nf | 12 +-- .../local/vcf_varlociraptor_somatic/main.nf | 19 ++-- subworkflows/nf-core/bam_ngscheckmate/main.nf | 19 ++-- .../nf-core/bam_ngscheckmate/meta.yml | 4 + tests/aligner-parabricks.nf.test.snap | 4 +- tests/annotation_bcfann.nf.test.snap | 4 +- tests/bbsplit.nf.test.snap | 6 +- tests/default.nf.test.snap | 6 +- ...joint_calling_haplotypecaller.nf.test.snap | 14 ++- tests/joint_calling_mutect2.nf.test.snap | 8 +- tests/postprocess_concatenation.nf.test.snap | 16 ++-- ...s_concatenation_normalization.nf.test.snap | 44 ++++----- tests/postprocess_consensus.nf.test.snap | 78 ++++++++-------- tests/postprocess_filtering.nf.test.snap | 14 +-- tests/postprocess_normalization.nf.test.snap | 18 ++-- tests/postprocess_varlociraptor.nf.test.snap | 39 ++++---- tests/qc_ngscheckmate.nf.test.snap | 4 +- tests/save_output_as_bam.nf.test.snap | 4 +- ...art_from_preparerecalibration.nf.test.snap | 8 +- tests/start_from_recalibration.nf.test.snap | 8 +- tests/tumor-normal-pair.nf.test.snap | 8 +- tests/umi_in_read_names.nf.test.snap | 8 +- tests/variant_calling_all.nf.test.snap | 54 +++++------ .../variant_calling_deepvariant.nf.test.snap | 12 +-- tests/variant_calling_freebayes.nf.test.snap | 40 ++++----- ...riant_calling_haplotypecaller.nf.test.snap | 16 ++-- tests/variant_calling_lofreq.nf.test.snap | 8 +- tests/variant_calling_manta.nf.test.snap | 42 ++++----- tests/variant_calling_mpileup.nf.test.snap | 24 ++--- tests/variant_calling_muse.nf.test.snap | 6 +- tests/variant_calling_mutect2.nf.test.snap | 16 ++-- ...ant_calling_sentieon_dnascope.nf.test.snap | 15 ++-- ...ling_sentieon_haplotypecaller.nf.test.snap | 19 ++-- tests/variant_calling_strelka.nf.test.snap | 32 +++---- tests/variant_calling_strelka_bp.nf.test.snap | 28 +++--- tests/variant_calling_tiddit.nf.test.snap | 14 +-- workflows/sarek.nf | 2 +- 83 files changed, 1091 insertions(+), 956 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f5691ffe8..118d50347a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [#2210](https://github.com/nf-core/sarek/pull/2210) - Update bcftools to 1.23.1 - [#2229](https://github.com/nf-core/sarek/pull/2229) - Update EnsemblVEP to 116.0 ### Fixed @@ -26,6 +27,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | Dependency | Old version | New version | | ------------- | ----------- | ----------- | +| bcftools | 1.21 | 1.23.1 | +| htslib | 1.21 | 1.23.1 | | varlociraptor | 8.9.3 | 8.9.5 | | ensembl-vep | 115.2 | 116.0 | diff --git a/main.nf b/main.nf index 7506eec94a..c03cc52266 100755 --- a/main.nf +++ b/main.nf @@ -289,7 +289,7 @@ workflow NFCORE_SAREK { PREPARE_GENOME.out.bbsplit_index, PREPARE_GENOME.out.bcftools_annotations, PREPARE_GENOME.out.bcftools_annotations_tbi, - params.bcftools_columns ? channel.fromPath(params.bcftools_columns).collect() : channel.value([]), + params.bcftools_columns ? channel.fromPath(params.bcftools_columns).collect() : channel.value([[]]), params.bcftools_header_lines ? channel.fromPath(params.bcftools_header_lines).collect() : channel.empty(), params.cf_chrom_len ? channel.fromPath(params.cf_chrom_len).collect() : [], PREPARE_GENOME.out.chr_dir, diff --git a/modules.json b/modules.json index d2272c9181..bc9f66c29c 100644 --- a/modules.json +++ b/modules.json @@ -17,47 +17,47 @@ }, "bcftools/annotate": { "branch": "master", - "git_sha": "28438d38e50710e20885ff2594344b9d5a03dec7", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bcftools/concat": { "branch": "master", - "git_sha": "1503efe8f6450e71218097f93cf43e4b625018d4", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bcftools/isec": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bcftools/merge": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bcftools/mpileup": { "branch": "master", - "git_sha": "c9c3ef86c1892413b3c86fb38c4e39fd7288512f", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["bam_ngscheckmate"] }, "bcftools/norm": { "branch": "master", - "git_sha": "39fed2e840a805454a64dda9c2ef64c00e2c6781", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", - "git_sha": "c9c3ef86c1892413b3c86fb38c4e39fd7288512f", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bcftools/stats": { "branch": "master", - "git_sha": "c9c3ef86c1892413b3c86fb38c4e39fd7288512f", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bcftools/view": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "feef37435aea56816adf4b3bde1fc76aac327a8d", "installed_by": ["modules"] }, "bwa/index": { @@ -403,7 +403,7 @@ }, "ngscheckmate/ncm": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["bam_ngscheckmate"] }, "parabricks/fq2bam": { @@ -612,7 +612,7 @@ "nf-core": { "bam_ngscheckmate": { "branch": "master", - "git_sha": "c9c3ef86c1892413b3c86fb38c4e39fd7288512f", + "git_sha": "3d9c2f4beaa4f62b3f006928fd9095a496d1e5a8", "installed_by": ["subworkflows"] }, "cache_download_ensemblvep_snpeff": { diff --git a/modules/nf-core/bcftools/annotate/environment.yml b/modules/nf-core/bcftools/annotate/environment.yml index 557488607c..13b63a623e 100644 --- a/modules/nf-core/bcftools/annotate/environment.yml +++ b/modules/nf-core/bcftools/annotate/environment.yml @@ -4,4 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::bcftools=1.21 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.23.1 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/annotate/main.nf b/modules/nf-core/bcftools/annotate/main.nf index 095643369c..f291e3c291 100644 --- a/modules/nf-core/bcftools/annotate/main.nf +++ b/modules/nf-core/bcftools/annotate/main.nf @@ -3,36 +3,35 @@ process BCFTOOLS_ANNOTATE { 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/5a/5acacb55c52bec97c61fd34ffa8721fce82ce823005793592e2a80bf71632cd0/data' - : 'community.wave.seqera.io/library/bcftools:1.21--4335bec1d7b44d11'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" input: - tuple val(meta), path(input), path(index), path(annotations), path(annotations_index) - path columns - path header_lines - path rename_chrs + 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("*.{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("${prefix}.${extension}"), emit: vcf + tuple val(meta), path("${prefix}.${extension}.{tbi,csi}"), 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 script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + 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}" : '' - 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" + 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}") { @@ -51,24 +50,23 @@ process BCFTOOLS_ANNOTATE { --output ${prefix}.${extension} \\ --threads ${task.cpus} \\ ${input} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$( bcftools --version |& sed '1!d; s/^.*bcftools //' ) - END_VERSIONS """ stub: 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_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" : "" + 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}" : "" @@ -78,10 +76,5 @@ process BCFTOOLS_ANNOTATE { """ ${create_cmd} ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$( bcftools --version |& sed '1!d; s/^.*bcftools //' ) - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/annotate/meta.yml b/modules/nf-core/bcftools/annotate/meta.yml index 058954d21d..066e8544f2 100644 --- a/modules/nf-core/bcftools/annotate/meta.yml +++ b/modules/nf-core/bcftools/annotate/meta.yml @@ -12,7 +12,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: https://samtools.github.io/bcftools/bcftools.html#annotate doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -22,7 +23,8 @@ input: e.g. [ id:'test', single_end:false ] - input: type: file - description: Query VCF or BCF file, can be either uncompressed or compressed + description: Query VCF or BCF file, can be either uncompressed or + compressed ontologies: [] - index: type: file @@ -36,19 +38,20 @@ input: 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: [] + - 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: @@ -56,40 +59,43 @@ output: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.{vcf,vcf.gz,bcf,bcf.gz}": + - ${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 ] - - "*.tbi": - type: file - description: Alternative VCF file index - pattern: "*.tbi" - ontologies: [] - csi: + index: - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.csi": + - "${prefix}.${extension}.{tbi,csi}": type: file - description: Default VCF file index - pattern: "*.csi" + description: VCF file index + pattern: "*.{tbi,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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@projectoriented" - "@ramprasadn" diff --git a/modules/nf-core/bcftools/concat/environment.yml b/modules/nf-core/bcftools/concat/environment.yml index 557488607c..13b63a623e 100644 --- a/modules/nf-core/bcftools/concat/environment.yml +++ b/modules/nf-core/bcftools/concat/environment.yml @@ -4,4 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::bcftools=1.21 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.23.1 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/concat/main.nf b/modules/nf-core/bcftools/concat/main.nf index 7f6874e553..f68bd98cc5 100644 --- a/modules/nf-core/bcftools/concat/main.nf +++ b/modules/nf-core/bcftools/concat/main.nf @@ -1,72 +1,72 @@ 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/5a/5acacb55c52bec97c61fd34ffa8721fce82ce823005793592e2a80bf71632cd0/data': - 'community.wave.seqera.io/library/bcftools:1.21--4335bec1d7b44d11' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" input: tuple val(meta), path(vcfs), path(tbi) 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 - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}.${extension}"), emit: vcf + tuple val(meta), path("${prefix}.${extension}.{tbi,csi}"), 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 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 3d12673a29..6fd768b8f3 100644 --- a/modules/nf-core/bcftools/concat/meta.yml +++ b/modules/nf-core/bcftools/concat/meta.yml @@ -12,7 +12,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -31,8 +32,8 @@ input: List containing 2 or more index files (optional) e.g. [ 'file1.tbi', 'file2.tbi' ] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -43,35 +44,38 @@ output: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" - - tbi: - - meta: + index: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - ${prefix}.${extension}.tbi: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - pattern: "*.tbi" - - csi: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - ${prefix}.${extension}.csi: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - pattern: "*.csi" - - versions: - - versions.yml: + - "${prefix}.${extension}.{tbi,csi}": type: file - description: File containing software versions - pattern: "versions.yml" + description: VCF file index + pattern: "*.{tbi,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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@abhi18av" - "@nvnieuwk" diff --git a/modules/nf-core/bcftools/isec/environment.yml b/modules/nf-core/bcftools/isec/environment.yml index ba863b388f..ee5cb56dad 100644 --- a/modules/nf-core/bcftools/isec/environment.yml +++ b/modules/nf-core/bcftools/isec/environment.yml @@ -5,6 +5,5 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/htslib - - bioconda::htslib=1.22.1 - # renovate: datasource=conda depName=bioconda/bcftools - - bioconda::bcftools=1.22 + - bioconda::bcftools=1.23.1 + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/isec/main.nf b/modules/nf-core/bcftools/isec/main.nf index c9bdf4ce34..d8a3fb23e8 100644 --- a/modules/nf-core/bcftools/isec/main.nf +++ b/modules/nf-core/bcftools/isec/main.nf @@ -1,39 +1,40 @@ process BCFTOOLS_ISEC { - 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 in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" input: - tuple val(meta), path(vcfs), path(tbis) + 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 - 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}" + 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 \\ - -p $prefix \\ - ${vcfs} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + ${targets_file_args} \\ + ${regions_file_args} \\ + -p ${prefix} \\ + ${vcf_files} \\ """ stub: - def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ mkdir ${prefix} touch ${prefix}/README.txt @@ -42,10 +43,5 @@ process BCFTOOLS_ISEC { touch ${prefix}/0000.vcf.gz.tbi echo "" | gzip > ${prefix}/0001.vcf.gz touch ${prefix}/0001.vcf.gz.tbi - - 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/isec/meta.yml b/modules/nf-core/bcftools/isec/meta.yml index 55cb49f4c7..82938fb902 100644 --- a/modules/nf-core/bcftools/isec/meta.yml +++ b/modules/nf-core/bcftools/isec/meta.yml @@ -14,7 +14,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -27,11 +28,37 @@ input: 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" + - edam: "http://edamontology.org/format_3570" - tbis: type: list description: | List containing the tbi index files corresponding to the vcf/bcf input files - e.g. [ 'file1.vcf.tbi', 'file2.vcf.tbi' ] + pattern: "*.tbi" + ontologies: + - edam: "http://edamontology.org/format_3475" + - 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" + - targets_file: + type: file + description: | + Optional file containing target regions to restrict the analysis to. + ontologies: + - edam: "http://edamontology.org/format_3003" + - edam: "http://edamontology.org/format_3475" + - regions_file: + type: file + description: | + Optional file containing regions to restrict the analysis to. + ontologies: + - edam: "http://edamontology.org/format_3003" + - edam: "http://edamontology.org/format_3475" output: results: - - meta: @@ -41,15 +68,32 @@ output: e.g. [ id:'test', single_end:false ] - ${prefix}: type: directory - description: Folder containing the set operations results perform on the vcf files - pattern: "${prefix}" + description: Directory containing the output files from bcftools isec + pattern: "${prefix}/" + ontologies: + - edam: "http://edamontology.org/format_3016" + - edam: "http://edamontology.org/format_3570" + 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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/merge/environment.yml b/modules/nf-core/bcftools/merge/environment.yml index ba863b388f..13b63a623e 100644 --- a/modules/nf-core/bcftools/merge/environment.yml +++ b/modules/nf-core/bcftools/merge/environment.yml @@ -4,7 +4,7 @@ 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 + - bioconda::bcftools=1.23.1 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/merge/main.nf b/modules/nf-core/bcftools/merge/main.nf index c560a90212..215456ee8c 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 in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" 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 09af245a2c..d1f14ba5fc 100644 --- a/modules/nf-core/bcftools/merge/meta.yml +++ b/modules/nf-core/bcftools/merge/meta.yml @@ -11,7 +11,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -31,6 +32,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 +48,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 +77,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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/mpileup/environment.yml b/modules/nf-core/bcftools/mpileup/environment.yml index 557488607c..ee5cb56dad 100644 --- a/modules/nf-core/bcftools/mpileup/environment.yml +++ b/modules/nf-core/bcftools/mpileup/environment.yml @@ -4,4 +4,6 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::bcftools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::bcftools=1.23.1 + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/mpileup/main.nf b/modules/nf-core/bcftools/mpileup/main.nf index f712b5183e..f541694f47 100644 --- a/modules/nf-core/bcftools/mpileup/main.nf +++ b/modules/nf-core/bcftools/mpileup/main.nf @@ -1,23 +1,23 @@ process BCFTOOLS_MPILEUP { - 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/5a/5acacb55c52bec97c61fd34ffa8721fce82ce823005793592e2a80bf71632cd0/data': - 'community.wave.seqera.io/library/bcftools:1.21--4335bec1d7b44d11' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" input: - tuple val(meta), path(bam), path(intervals) - tuple val(meta2), path(fasta) + tuple val(meta), path(bam), path(intervals_mpileup, stageAs: 'mpileup_intervals/*'), path(intervals_call, stageAs: 'call_intervals/*') + tuple val(meta2), path(fasta), path(fai) val save_mpileup output: - tuple val(meta), path("*vcf.gz") , emit: vcf - tuple val(meta), path("*vcf.gz.tbi") , emit: tbi - tuple val(meta), path("*stats.txt") , emit: stats + tuple val(meta), path("*vcf.gz"), emit: vcf + tuple val(meta), path("*.{tbi,csi}"), emit: index, optional: true + tuple val(meta), path("*stats.txt"), emit: stats tuple val(meta), path("*.mpileup.gz"), emit: mpileup, 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 @@ -29,31 +29,27 @@ process BCFTOOLS_MPILEUP { def prefix = task.ext.prefix ?: "${meta.id}" def mpileup = save_mpileup ? "| tee ${prefix}.mpileup" : "" def bgzip_mpileup = save_mpileup ? "bgzip ${prefix}.mpileup" : "" - def intervals_cmd = intervals ? "-T ${intervals}" : "" + def intervals_mpileup_cmd = intervals_mpileup ? "-T ${intervals_mpileup}" : "" + def intervals_call_cmd = intervals_call ? "-T ${intervals_call}" : "" """ echo "${meta.id}" > sample_name.list bcftools \\ mpileup \\ - --fasta-ref $fasta \\ - $args \\ - $bam \\ - $intervals_cmd \\ - $mpileup \\ - | bcftools call --output-type v $args2 \\ + --fasta-ref ${fasta} \\ + ${args} \\ + ${bam} \\ + ${intervals_mpileup_cmd} \\ + ${mpileup} \\ + | bcftools call --output-type v ${args2} ${intervals_call_cmd} \\ | bcftools reheader --samples sample_name.list \\ - | bcftools view --output-file ${prefix}.vcf.gz --output-type z $args3 + | bcftools view --output-file ${prefix}.vcf.gz --output-type z ${args3} - $bgzip_mpileup + ${bgzip_mpileup} tabix -p vcf -f ${prefix}.vcf.gz bcftools stats ${prefix}.vcf.gz > ${prefix}.bcftools_stats.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ stub: @@ -63,10 +59,5 @@ process BCFTOOLS_MPILEUP { echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi echo "" | gzip > ${prefix}.mpileup.gz - - 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/mpileup/meta.yml b/modules/nf-core/bcftools/mpileup/meta.yml index febcb33f60..a8134dc7ef 100644 --- a/modules/nf-core/bcftools/mpileup/meta.yml +++ b/modules/nf-core/bcftools/mpileup/meta.yml @@ -11,7 +11,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -23,10 +24,17 @@ input: type: file description: Input BAM file pattern: "*.{bam}" - - intervals: + ontologies: [] + - intervals_mpileup: type: file - description: Input intervals file. A file (commonly '.bed') containing regions - to subset + description: Input intervals file. A file (commonly '.bed') containing + regions to subset used by mpileup + ontologies: [] + - intervals_call: + type: file + description: Input intervals file. A file (commonly '.bed') containing + regions to subset used by call but need a fourth column with REF,ALT + ontologies: [] - - meta2: type: map description: | @@ -36,12 +44,18 @@ input: type: file description: FASTA reference file pattern: "*.{fasta,fa}" - - - save_mpileup: - type: boolean - description: Save mpileup file generated by bcftools mpileup + ontologies: [] + - fai: + type: file + description: FASTA reference file index + pattern: "*.fai" + ontologies: [] + - save_mpileup: + type: boolean + description: Save mpileup file generated by bcftools mpileup output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -50,18 +64,19 @@ output: type: file description: VCF gzipped output file pattern: "*.{vcf.gz}" - - tbi: - - meta: + ontologies: [] + index: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*vcf.gz.tbi": + - "*.{tbi,csi}": type: file - description: tabix index file - pattern: "*.{vcf.gz.tbi}" - - stats: - - meta: + description: VCF file index + pattern: "*.{tbi,csi}" + stats: + - - meta: type: map description: | Groovy Map containing sample information @@ -70,8 +85,9 @@ output: type: file description: Text output file containing stats pattern: "*{stats.txt}" - - mpileup: - - meta: + ontologies: [] + mpileup: + - - meta: type: map description: | Groovy Map containing sample information @@ -80,14 +96,29 @@ output: type: file description: mpileup gzipped output for all positions pattern: "{*.mpileup.gz}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + 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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@joseespinosa" - - "@drpatelh" maintainers: - "@joseespinosa" - - "@drpatelh" diff --git a/modules/nf-core/bcftools/norm/environment.yml b/modules/nf-core/bcftools/norm/environment.yml index 557488607c..13b63a623e 100644 --- a/modules/nf-core/bcftools/norm/environment.yml +++ b/modules/nf-core/bcftools/norm/environment.yml @@ -4,4 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::bcftools=1.21 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.23.1 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf index 3ad9b35cc2..7de623ed3f 100644 --- a/modules/nf-core/bcftools/norm/main.nf +++ b/modules/nf-core/bcftools/norm/main.nf @@ -1,11 +1,11 @@ process BCFTOOLS_NORM { - 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/5a/5acacb55c52bec97c61fd34ffa8721fce82ce823005793592e2a80bf71632cd0/data': - 'community.wave.seqera.io/library/bcftools:1.21--4335bec1d7b44d11' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" input: tuple val(meta), path(vcf), path(tbi) @@ -13,9 +13,8 @@ process BCFTOOLS_NORM { 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,csi}"), 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 @@ -23,52 +22,49 @@ process BCFTOOLS_NORM { 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" - + 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 \\ + ${args} \\ + --threads ${task.cpus} \\ ${vcf} - - 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 ?: '--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 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 { args.contains(it) } && extension == 'vcf.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 { args.contains(it) }) { + } + 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} - - 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/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml index b6edeb4aae..f465e01eb6 100644 --- a/modules/nf-core/bcftools/norm/meta.yml +++ b/modules/nf-core/bcftools/norm/meta.yml @@ -12,7 +12,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -26,11 +27,13 @@ input: 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: | @@ -40,43 +43,52 @@ input: type: file description: FASTA reference file pattern: "*.{fasta,fa}" + ontologies: [] output: - - vcf: - - meta: + 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 + 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}" - - tbi: - - meta: + ontologies: [] + index: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.tbi": + - "*.{tbi,csi}": type: file - description: Alternative VCF file index - pattern: "*.tbi" - - 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" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: VCF file index + pattern: "*.{tbi,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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@abhi18av" - "@ramprasadn" diff --git a/modules/nf-core/bcftools/sort/environment.yml b/modules/nf-core/bcftools/sort/environment.yml index 557488607c..13b63a623e 100644 --- a/modules/nf-core/bcftools/sort/environment.yml +++ b/modules/nf-core/bcftools/sort/environment.yml @@ -4,4 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::bcftools=1.21 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.23.1 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 6cbd09b593..2de803014e 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -1,20 +1,19 @@ 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/5a/5acacb55c52bec97c61fd34ffa8721fce82ce823005793592e2a80bf71632cd0/data': - 'community.wave.seqera.io/library/bcftools:1.21--4335bec1d7b44d11' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" 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,csi}"), 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 @@ -22,49 +21,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}.${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 """ } diff --git a/modules/nf-core/bcftools/sort/meta.yml b/modules/nf-core/bcftools/sort/meta.yml index f7a6eff17d..ee0bdb556b 100644 --- a/modules/nf-core/bcftools/sort/meta.yml +++ b/modules/nf-core/bcftools/sort/meta.yml @@ -11,7 +11,8 @@ tools: documentation: http://www.htslib.org/doc/bcftools.html tool_dev_url: https://github.com/samtools/bcftools doi: "10.1093/bioinformatics/btp352" - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -23,9 +24,10 @@ input: type: file description: The VCF/BCF file to be sorted pattern: "*.{vcf.gz,vcf,bcf}" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -34,31 +36,38 @@ output: type: file description: Sorted VCF file pattern: "*.{vcf.gz}" - - tbi: - - meta: + ontologies: [] + index: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.tbi": + - "*.{tbi,csi}": type: file - description: Alternative VCF file index - pattern: "*.tbi" - - 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" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: VCF file index + pattern: "*.{tbi,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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@Gwennid" maintainers: diff --git a/modules/nf-core/bcftools/stats/environment.yml b/modules/nf-core/bcftools/stats/environment.yml index 7aa06d0f7a..13b63a623e 100644 --- a/modules/nf-core/bcftools/stats/environment.yml +++ b/modules/nf-core/bcftools/stats/environment.yml @@ -4,5 +4,7 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::bcftools=1.21 - - bioconda::htslib=1.21 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.23.1 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/stats/main.nf b/modules/nf-core/bcftools/stats/main.nf index fb556e0aa5..6088f15c92 100644 --- a/modules/nf-core/bcftools/stats/main.nf +++ b/modules/nf-core/bcftools/stats/main.nf @@ -1,14 +1,14 @@ process BCFTOOLS_STATS { - tag "$meta.id" + 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/5a/5acacb55c52bec97c61fd34ffa8721fce82ce823005793592e2a80bf71632cd0/data': - 'community.wave.seqera.io/library/bcftools:1.21--4335bec1d7b44d11' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" input: - tuple val(meta), path(vcf), path(tbi) + tuple val(meta), path(vcf), path(tbi) tuple val(meta2), path(regions) tuple val(meta3), path(targets) tuple val(meta4), path(samples) @@ -17,7 +17,7 @@ process BCFTOOLS_STATS { output: tuple val(meta), path("*stats.txt"), emit: stats - 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 @@ -27,23 +27,18 @@ process BCFTOOLS_STATS { def prefix = task.ext.prefix ?: "${meta.id}" def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" def reference_fasta = fasta ? "--fasta-ref ${fasta}" : "" - def exons_file = exons ? "--exons ${exons}" : "" + def exons_file = exons ? "--exons ${exons}" : "" """ bcftools stats \\ - $args \\ - $regions_file \\ - $targets_file \\ - $samples_file \\ - $reference_fasta \\ - $exons_file \\ - $vcf > ${prefix}.bcftools_stats.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + ${reference_fasta} \\ + ${exons_file} \\ + ${vcf} > ${prefix}.bcftools_stats.txt """ stub: @@ -51,10 +46,5 @@ process BCFTOOLS_STATS { """ touch ${prefix}.bcftools_stats.txt - - 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/stats/meta.yml b/modules/nf-core/bcftools/stats/meta.yml index 655a61c5f4..1bed6e5656 100644 --- a/modules/nf-core/bcftools/stats/meta.yml +++ b/modules/nf-core/bcftools/stats/meta.yml @@ -12,7 +12,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -24,11 +25,13 @@ input: type: file description: VCF input file pattern: "*.{vcf}" + ontologies: [] - tbi: type: file description: | The tab index for the VCF file to be inspected. Optional: only required when parameter regions is chosen. pattern: "*.tbi" + ontologies: [] - - meta2: type: map description: | @@ -38,6 +41,7 @@ input: type: file description: | Optionally, restrict the operation to regions listed in this file. (VCF, BED or tab-delimited) + ontologies: [] - - meta3: type: map description: | @@ -47,6 +51,7 @@ input: type: file description: | Optionally, restrict the operation to regions listed in this file (doesn't rely upon tbi index files) + ontologies: [] - - meta4: type: map description: | @@ -57,6 +62,7 @@ input: description: | Optional, file of sample names to be included or excluded. e.g. 'file.tsv' + ontologies: [] - - meta5: type: map description: | @@ -67,6 +73,7 @@ input: description: | Tab-delimited file with exons for indel frameshifts (chr,beg,end; 1-based, inclusive, optionally bgzip compressed). e.g. 'exons.tsv.gz' + ontologies: [] - - meta6: type: map description: | @@ -77,9 +84,10 @@ input: description: | Faidx indexed reference sequence file to determine INDEL context. e.g. 'reference.fa' + ontologies: [] output: - - stats: - - meta: + stats: + - - meta: type: map description: | Groovy Map containing sample information @@ -88,11 +96,28 @@ output: type: file description: Text output file containing stats pattern: "*_{stats.txt}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + 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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/view/environment.yml b/modules/nf-core/bcftools/view/environment.yml index ba863b388f..13b63a623e 100644 --- a/modules/nf-core/bcftools/view/environment.yml +++ b/modules/nf-core/bcftools/view/environment.yml @@ -4,7 +4,7 @@ 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 + - bioconda::bcftools=1.23.1 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 diff --git a/modules/nf-core/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf index 72b31200b5..46e8ef5d79 100644 --- a/modules/nf-core/bcftools/view/main.nf +++ b/modules/nf-core/bcftools/view/main.nf @@ -1,23 +1,22 @@ process BCFTOOLS_VIEW { - 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 in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0b/0b4d52ca9a56d07be3f78a12af654e5116f5112908dba277e6796fd9dfb83fe5/data' + : 'community.wave.seqera.io/library/bcftools_htslib:1.23.1--9f08ec665533d64a'}" input: tuple val(meta), path(vcf), path(index) - path(regions) - path(targets) - path(samples) + path regions + path targets + path samples 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,csi}"), 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,51 +24,52 @@ process BCFTOOLS_VIEW { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def regions_file = regions ? "--regions-file ${regions}" : "" + def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" - 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 samples_file = samples ? "--samples-file ${samples}" : "" + 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 view \\ --output ${prefix}.${extension} \\ ${regions_file} \\ ${targets_file} \\ ${samples_file} \\ - $args \\ - --threads $task.cpus \\ + ${args} \\ + --threads ${task.cpus} \\ ${vcf} - - 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 ?: '' 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 stub_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 stub_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") && stub_index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${stub_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/view/meta.yml b/modules/nf-core/bcftools/view/meta.yml index e9df974206..96351894b0 100644 --- a/modules/nf-core/bcftools/view/meta.yml +++ b/modules/nf-core/bcftools/view/meta.yml @@ -1,6 +1,6 @@ name: bcftools_view -description: View, subset and filter VCF or BCF files by position and filtering expression. - Convert between VCF and BCF +description: View, subset and filter VCF or BCF files by position and filtering + expression. Convert between VCF and BCF keywords: - variant calling - view @@ -13,7 +13,8 @@ tools: homepage: http://samtools.github.io/bcftools/bcftools.html documentation: http://www.htslib.org/doc/bcftools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:bcftools input: - - meta: @@ -63,35 +64,37 @@ output: description: VCF normalized output file pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" ontologies: [] - tbi: + index: - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.tbi": + - "*.{tbi,csi}": 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: [] + description: VCF file index + pattern: "*.{tbi,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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@abhi18av" maintainers: diff --git a/modules/nf-core/ngscheckmate/ncm/environment.yml b/modules/nf-core/ngscheckmate/ncm/environment.yml index 7348216563..20851c4888 100644 --- a/modules/nf-core/ngscheckmate/ncm/environment.yml +++ b/modules/nf-core/ngscheckmate/ncm/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::ngscheckmate=1.0.1 - bioconda::bcftools=1.21 + - bioconda::ngscheckmate=1.0.1 diff --git a/modules/nf-core/ngscheckmate/ncm/main.nf b/modules/nf-core/ngscheckmate/ncm/main.nf index ffb64a86b5..69b7b14656 100644 --- a/modules/nf-core/ngscheckmate/ncm/main.nf +++ b/modules/nf-core/ngscheckmate/ncm/main.nf @@ -2,64 +2,52 @@ process NGSCHECKMATE_NCM { label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ngscheckmate:1.0.1--py312pl5321h577a1d6_4': - 'biocontainers/ngscheckmate:1.0.1--py312pl5321h577a1d6_4' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/ngscheckmate:1.0.1--py312pl5321h577a1d6_4' + : 'quay.io/biocontainers/ngscheckmate:1.0.1--py312pl5321h577a1d6_4'}" input: - tuple val(meta) , path(files) + tuple val(meta), path(files) tuple val(meta2), path(snp_bed) - tuple val(meta3), path(fasta) + tuple val(meta3), path(fasta), path(fai) output: tuple val(meta), path("*_corr_matrix.txt"), emit: corr_matrix - tuple val(meta), path("*_matched.txt") , emit: matched - tuple val(meta), path("*_all.txt") , emit: all - tuple val(meta), path("*.pdf") , emit: pdf, optional: true - tuple val(meta), path("*.vcf") , emit: vcf, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*_matched.txt"), emit: matched + tuple val(meta), path("*_all.txt"), emit: all + tuple val(meta), path("*.pdf"), emit: pdf, optional: true + tuple val(meta), path("*.vcf"), emit: vcf, optional: true + tuple val("${task.process}"), val('ngscheckmate'), eval("ncm.py --help | sed '7!d;s/.* v//g'"), topic: versions, emit: versions_ngscheckmate when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "$meta.id" - def unzip = files.any { it.toString().endsWith(".vcf.gz") } + def prefix = task.ext.prefix ?: "${meta.id}" + def unzip = files.any {file -> file.toString().endsWith(".vcf.gz") } """ - if $unzip + if ${unzip} then for VCFGZ in *.vcf.gz; do gunzip -cdf \$VCFGZ > \$( basename \$VCFGZ .gz ); done fi - NCM_REF="./"${fasta} ncm.py -d . -bed ${snp_bed} -O . -N ${prefix} $args + NCM_REF="./"${fasta} ncm.py -d . -bed ${snp_bed} -O . -N ${prefix} ${args} - if $unzip + if ${unzip} then rm -f *.vcf # clean up decompressed vcfs fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ngscheckmate: \$(ncm.py --help | sed "7!d;s/ *Ensuring Sample Identity v//g") - END_VERSIONS """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "$meta.id" + def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_output_corr_matrix.txt touch ${prefix}_matched.txt touch ${prefix}_all.txt touch ${prefix}.pdf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ngscheckmate: \$(ncm.py --help | sed "7!d;s/ *Ensuring Sample Identity v//g") - END_VERSIONS """ - } diff --git a/modules/nf-core/ngscheckmate/ncm/meta.yml b/modules/nf-core/ngscheckmate/ncm/meta.yml index 06c131d6b0..ea031b4aa9 100644 --- a/modules/nf-core/ngscheckmate/ncm/meta.yml +++ b/modules/nf-core/ngscheckmate/ncm/meta.yml @@ -27,6 +27,7 @@ input: description: VCF or BAM files for each sample, in a merged channel (possibly gzipped). BAM files require an index too. pattern: "*.{vcf,vcf.gz,bam,bai}" + ontologies: [] - - meta2: type: map description: | @@ -36,6 +37,7 @@ input: type: file description: BED file containing the SNPs to analyse pattern: "*.{bed}" + ontologies: [] - - meta3: type: map description: | @@ -44,62 +46,93 @@ input: - fasta: type: file description: fasta file for the genome, only used in the bam mode - pattern: "*.{bed}" + pattern: "*.{fasta}" + ontologies: [] + - fai: + type: file + description: fasta index file for the genome, only used in the bam mode + pattern: "*.{fai}" + ontologies: [] output: - - corr_matrix: - - meta: + corr_matrix: + - - meta: type: file description: A text file containing the correlation matrix between each sample pattern: "*corr_matrix.txt" + ontologies: [] - "*_corr_matrix.txt": type: file description: A text file containing the correlation matrix between each sample pattern: "*corr_matrix.txt" - - matched: - - meta: + ontologies: [] + matched: + - - meta: type: file - description: A txt file containing only the samples that match with each other - pattern: "*matched.txt" + description: A text file containing the correlation matrix between each sample + pattern: "*corr_matrix.txt" + ontologies: [] - "*_matched.txt": type: file description: A txt file containing only the samples that match with each other pattern: "*matched.txt" - - all: - - meta: + ontologies: [] + all: + - - meta: type: file - description: A txt file containing all the sample comparisons, whether they - match or not - pattern: "*all.txt" + description: A text file containing the correlation matrix between each sample + pattern: "*corr_matrix.txt" + ontologies: [] - "*_all.txt": type: file description: A txt file containing all the sample comparisons, whether they match or not pattern: "*all.txt" - - pdf: - - meta: + ontologies: [] + pdf: + - - meta: type: file - description: A pdf containing a dendrogram showing how the samples match up - pattern: "*.{pdf}" + description: A text file containing the correlation matrix between each sample + pattern: "*corr_matrix.txt" + ontologies: [] - "*.pdf": type: file description: A pdf containing a dendrogram showing how the samples match up pattern: "*.{pdf}" - - vcf: - - meta: + ontologies: [] + vcf: + - - meta: type: file - description: If ran in bam mode, vcf files for each sample giving the SNP calls - used - pattern: "*.vcf" + description: A text file containing the correlation matrix between each sample + pattern: "*corr_matrix.txt" + ontologies: [] - "*.vcf": type: file - description: If ran in bam mode, vcf files for each sample giving the SNP calls - used + description: If ran in bam mode, vcf files for each sample giving the SNP + calls used pattern: "*.vcf" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_ngscheckmate: + - - ${task.process}: + type: string + description: The process the versions were collected from + - ngscheckmate: + type: string + description: The tool name + - "ncm.py --help | sed '7!d;s/.* v//g'": + 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 + - ngscheckmate: + type: string + description: The tool name + - "ncm.py --help | sed '7!d;s/.* v//g'": + type: string + description: The command used to generate the version of the tool authors: - "@sppearce" maintainers: diff --git a/subworkflows/local/bam_variant_calling_freebayes/main.nf b/subworkflows/local/bam_variant_calling_freebayes/main.nf index 18ef51f5e5..4708d06750 100644 --- a/subworkflows/local/bam_variant_calling_freebayes/main.nf +++ b/subworkflows/local/bam_variant_calling_freebayes/main.nf @@ -64,7 +64,6 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { // Index the filtered VCFs TABIX_VC_FREEBAYES_FILT(vcf_filtered) - versions = versions.mix(BCFTOOLS_SORT.out.versions) versions = versions.mix(FREEBAYES.out.versions) versions = versions.mix(TABIX_VC_FREEBAYES.out.versions) versions = versions.mix(TABIX_VC_FREEBAYES_FILT.out.versions) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index cc28669740..5da093ab4b 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -84,6 +84,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { cram, dict, fasta, + fasta_fai, intervals ) vcf_mpileup = BAM_VARIANT_CALLING_MPILEUP.out.vcf diff --git a/subworkflows/local/bam_variant_calling_mpileup/main.nf b/subworkflows/local/bam_variant_calling_mpileup/main.nf index 7b7765f2c3..5e21480c21 100644 --- a/subworkflows/local/bam_variant_calling_mpileup/main.nf +++ b/subworkflows/local/bam_variant_calling_mpileup/main.nf @@ -13,7 +13,8 @@ workflow BAM_VARIANT_CALLING_MPILEUP { take: cram // channel: [mandatory] [ meta, cram, crai ] dict // channel: [mandatory] [ meta, dict ] - fasta // channel: [mandatory] [ fasta ] + fasta // channel: [mandatory] [ meta, fasta ] + fai // channel: [mandatory] [ meta, fasta_fai ] intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: @@ -24,9 +25,14 @@ workflow BAM_VARIANT_CALLING_MPILEUP { .combine(intervals) .map { meta, cram_, _crai, intervals_, num_intervals -> [meta + [num_intervals: num_intervals], cram_, intervals_] } + // per-chunk bed restricts mpileup only; intervals_call left empty + cram_intervals_bcftools = cram_intervals.map { meta, cram_, intervals_ -> [meta, cram_, intervals_, []] } + + fasta_fai = fasta.combine(fai).map { meta, fasta_, _meta2, fai_ -> [meta, fasta_, fai_] }.collect() + // Run, if --tools mpileup keep_bcftools_mpileup = false - BCFTOOLS_MPILEUP(cram_intervals, fasta, keep_bcftools_mpileup) + BCFTOOLS_MPILEUP(cram_intervals_bcftools, fasta_fai, keep_bcftools_mpileup) //Only run, if --tools ControlFreec SAMTOOLS_MPILEUP(cram_intervals, fasta) @@ -38,7 +44,7 @@ workflow BAM_VARIANT_CALLING_MPILEUP { } // Figuring out if there is one or more tbi(s) from the same sample - tbi_mpileup = BCFTOOLS_MPILEUP.out.tbi.branch { + tbi_mpileup = BCFTOOLS_MPILEUP.out.index.branch { intervals: it[0].num_intervals > 1 no_intervals: it[0].num_intervals <= 1 } @@ -69,7 +75,6 @@ workflow BAM_VARIANT_CALLING_MPILEUP { .map { meta, tbi -> [meta - meta.subMap('num_intervals') + [variantcaller: 'bcftools'], tbi] } versions = versions.mix(SAMTOOLS_MPILEUP.out.versions) - versions = versions.mix(BCFTOOLS_MPILEUP.out.versions) versions = versions.mix(CAT_MPILEUP.out.versions) emit: diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index f22e36d656..f43549b2f1 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -95,6 +95,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { cram_normal, dict, fasta, + fasta_fai, intervals, ) @@ -102,6 +103,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { cram_tumor, dict, fasta, + fasta_fai, intervals, ) diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 240cb3a73a..0613a74b8b 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -72,6 +72,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { cram, dict, fasta, + fasta_fai, intervals, ) vcf_mpileup = BAM_VARIANT_CALLING_MPILEUP.out.vcf diff --git a/subworkflows/local/cram_sampleqc/main.nf b/subworkflows/local/cram_sampleqc/main.nf index 1e664186f7..c3be937964 100644 --- a/subworkflows/local/cram_sampleqc/main.nf +++ b/subworkflows/local/cram_sampleqc/main.nf @@ -5,20 +5,19 @@ workflow CRAM_SAMPLEQC { take: cram // channel: [ val(meta), cram, crai ] ngscheckmate_bed // channel: [ ngscheckmate_bed ] - fasta // channel: [ fasta ] + fasta_fai // channel: [ val(meta), fasta, fasta_fai ] skip_baserecalibration // boolean: intervals_for_preprocessing // channel: main: - - versions = Channel.empty() - reports = Channel.empty() + versions = channel.empty() + reports = channel.empty() if (!skip_baserecalibration) { CRAM_QC_RECAL( cram, - fasta, + fasta_fai.map{meta, fasta, _fai -> [meta, fasta]}, intervals_for_preprocessing, ) @@ -29,8 +28,7 @@ workflow CRAM_SAMPLEQC { versions = versions.mix(CRAM_QC_RECAL.out.versions) } - BAM_NGSCHECKMATE(cram.map { meta, cram_, _crai -> [meta, cram_] }, ngscheckmate_bed.map { bed -> [[id: "ngscheckmate"], bed] }, fasta) - versions = versions.mix(BAM_NGSCHECKMATE.out.versions) + BAM_NGSCHECKMATE(cram.map { meta, cram_, _crai -> [meta, cram_] }, ngscheckmate_bed.map { bed -> [[id: "ngscheckmate"], bed] }, fasta_fai) emit: corr_matrix = BAM_NGSCHECKMATE.out.corr_matrix // channel: [ meta, corr_matrix ] diff --git a/subworkflows/local/post_variantcalling/main.nf b/subworkflows/local/post_variantcalling/main.nf index 4afd0b576e..277bed9765 100644 --- a/subworkflows/local/post_variantcalling/main.nf +++ b/subworkflows/local/post_variantcalling/main.nf @@ -50,7 +50,6 @@ workflow POST_VARIANTCALLING { vcfs = vcfs.mix(VCF_VARLOCIRAPTOR_GERMLINE.out.vcf) tbis = tbis.mix(VCF_VARLOCIRAPTOR_GERMLINE.out.tbi) - versions = versions.mix(VCF_VARLOCIRAPTOR_GERMLINE.out.versions) // SOMATIC VCF_VARLOCIRAPTOR_SOMATIC(cram_somatic, fasta, fai, varlociraptor_scenario_somatic, somatic_vcfs, germline_vcfs, varlociraptor_chunk_size, varlociraptor_events_somatic, varlociraptor_fdr) @@ -64,7 +63,6 @@ workflow POST_VARIANTCALLING { vcfs = vcfs.mix(VCF_VARLOCIRAPTOR_TUMOR_ONLY.out.vcf) tbis = tbis.mix(VCF_VARLOCIRAPTOR_TUMOR_ONLY.out.tbi) - versions = versions.mix(VCF_VARLOCIRAPTOR_TUMOR_ONLY.out.versions) } else if (filter_vcfs || normalize_vcfs || concatenate_vcfs ) { @@ -118,8 +116,7 @@ workflow POST_VARIANTCALLING { FILTER_VCFS( small_variant_vcfs.join(small_variant_tbis, failOnDuplicate: true, failOnMismatch: true), [], [], []) small_variant_vcfs = FILTER_VCFS.out.vcf - small_variant_tbis = FILTER_VCFS.out.tbi - versions = versions.mix(FILTER_VCFS.out.versions) + small_variant_tbis = FILTER_VCFS.out.index } if (normalize_vcfs) { diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 3b8de518e7..5460704157 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -153,7 +153,7 @@ workflow PREPARE_GENOME { if (!bcftools_annotations_tbi_in && bcftools_annotations_in) { TABIX_BCFTOOLS_ANNOTATIONS(bcftools_annotations.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) bcftools_annotations_tbi = TABIX_BCFTOOLS_ANNOTATIONS.out.tbi.map { _meta, tbi -> [tbi] }.collect() - versions = versions.mix(TABIX_BCFTOOLS_ANNOTATIONS.out.versions) + } dbsnp = dbsnp_in ? Channel.fromPath(dbsnp_in).collect() : Channel.value([]) diff --git a/subworkflows/local/vcf_annotate_all/main.nf b/subworkflows/local/vcf_annotate_all/main.nf index 72f9dfe061..ea559ed6c0 100644 --- a/subworkflows/local/vcf_annotate_all/main.nf +++ b/subworkflows/local/vcf_annotate_all/main.nf @@ -34,14 +34,10 @@ workflow VCF_ANNOTATE_ALL { if (tools.split(',').contains('bcfann')) { BCFTOOLS_ANNOTATE( - vcf.map { meta, vcf_ -> [meta, vcf_, []] }.combine(bcftools_annotations).combine(bcftools_annotations_index), - bcftools_columns, - bcftools_header_lines, - [], + vcf.map { meta, vcf_ -> [meta, vcf_, []] }.combine(bcftools_annotations).combine(bcftools_annotations_index).combine(bcftools_columns).combine(bcftools_header_lines).map{meta, vcf_, index, ann, ann_index, cols, header -> [meta, vcf_, index, ann, ann_index, cols, header, []]} ) - vcf_ann = vcf_ann.mix(BCFTOOLS_ANNOTATE.out.vcf.join(BCFTOOLS_ANNOTATE.out.tbi, failOnDuplicate: true, failOnMismatch: true)) - versions = versions.mix(BCFTOOLS_ANNOTATE.out.versions) + vcf_ann = vcf_ann.mix(BCFTOOLS_ANNOTATE.out.vcf.join(BCFTOOLS_ANNOTATE.out.index, failOnDuplicate: true, failOnMismatch: true)) } if (tools.split(',').contains('merge') || tools.split(',').contains('snpeff')) { diff --git a/subworkflows/local/vcf_concatenate_germline/main.nf b/subworkflows/local/vcf_concatenate_germline/main.nf index 31dc6de01b..3c3010666f 100644 --- a/subworkflows/local/vcf_concatenate_germline/main.nf +++ b/subworkflows/local/vcf_concatenate_germline/main.nf @@ -28,11 +28,9 @@ workflow CONCATENATE_GERMLINE_VCFS { // Gather versions of all tools used versions = versions.mix(ADD_INFO_TO_VCF.out.versions) - versions = versions.mix(GERMLINE_VCFS_CONCAT.out.versions) - versions = versions.mix(GERMLINE_VCFS_CONCAT_SORT.out.versions) emit: vcfs = GERMLINE_VCFS_CONCAT_SORT.out.vcf // concatenated vcfs - tbis = GERMLINE_VCFS_CONCAT_SORT.out.tbi // matching tbis + tbis = GERMLINE_VCFS_CONCAT_SORT.out.index // matching tbis versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/vcf_consensus/main.nf b/subworkflows/local/vcf_consensus/main.nf index aa18c0c939..0b9dbb028f 100644 --- a/subworkflows/local/vcf_consensus/main.nf +++ b/subworkflows/local/vcf_consensus/main.nf @@ -32,12 +32,11 @@ workflow CONSENSUS { .groupTuple(size: 2) BCFTOOLS_CONCAT(ch_strelka_grouped)// somatic strelkas have two vcf files: SNPs and indels - ch_versions = ch_versions.mix(BCFTOOLS_CONCAT.out.versions) // Combine concat strelka with remaining VCFs // Bundle each VCF with its caller to preserve association through grouping ch_consensus_in = ch_vcfs.other - .mix(BCFTOOLS_CONCAT.out.vcf.join(BCFTOOLS_CONCAT.out.tbi)) + .mix(BCFTOOLS_CONCAT.out.vcf.join(BCFTOOLS_CONCAT.out.index)) .map { meta, vcf, tbi -> def caller = meta.variantcaller def groupKey = meta - meta.subMap('variantcaller', 'contamination', 'filename', 'data_type', 'num_intervals') @@ -53,12 +52,13 @@ workflow CONSENSUS { def sorted_pairs = vcf_caller_pairs.sort { a, b -> a[0].name <=> b[0].name } def sorted_vcfs = sorted_pairs.collect { it[0] } def callers = sorted_pairs.collect { it[1] } - [meta + [callers: callers], sorted_vcfs, tbis] + // file_list, targets_file, regions_file are unused: VCFs are passed positionally + // and consensus is computed genome-wide (no region/target restriction) + [meta + [callers: callers], sorted_vcfs, tbis, [], [], []] } BCFTOOLS_ISEC(ch_consensus_in) - ch_versions = ch_versions.mix(BCFTOOLS_ISEC.out.versions) // Filter out empty isec results (no consensus variants found) ch_isec_with_results = BCFTOOLS_ISEC.out.results diff --git a/subworkflows/local/vcf_normalization/main.nf b/subworkflows/local/vcf_normalization/main.nf index afe7b350b2..8878eeacd3 100644 --- a/subworkflows/local/vcf_normalization/main.nf +++ b/subworkflows/local/vcf_normalization/main.nf @@ -29,11 +29,9 @@ workflow NORMALIZE_VCFS { // Gather versions of all tools used versions = versions.mix(ADD_INFO_TO_VCF.out.versions) - versions = versions.mix(VCFS_NORM.out.versions) - versions = versions.mix(VCFS_NORM_SORT.out.versions) emit: - vcfs = VCFS_NORM_SORT.out.vcf // normalized vcfs - tbis = VCFS_NORM_SORT.out.tbi // matching tbis + vcfs = VCFS_NORM_SORT.out.vcf // normalized vcfs + tbis = VCFS_NORM_SORT.out.index // matching tbis versions // Channel: [versions.yml] } diff --git a/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf b/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf index ab69bdeb15..21e4ce927a 100644 --- a/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf +++ b/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf @@ -17,7 +17,6 @@ workflow VCF_QC_BCFTOOLS_VCFTOOLS { VCFTOOLS_TSTV_QUAL(vcf, target_bed, []) VCFTOOLS_SUMMARY(vcf, target_bed, []) - versions = versions.mix(BCFTOOLS_STATS.out.versions) versions = versions.mix(VCFTOOLS_TSTV_COUNT.out.versions) emit: diff --git a/subworkflows/local/vcf_varlociraptor_single/main.nf b/subworkflows/local/vcf_varlociraptor_single/main.nf index 2ba55d4af2..27232307fd 100644 --- a/subworkflows/local/vcf_varlociraptor_single/main.nf +++ b/subworkflows/local/vcf_varlociraptor_single/main.nf @@ -21,8 +21,6 @@ workflow VCF_VARLOCIRAPTOR_SINGLE { val_fdr main: - ch_versions = channel.empty() - meta_map = ch_cram.map { meta, _cram, _crai -> meta + [sex_string: (meta.sex == "XX" ? "female" : "male")] } FILL_SCENARIO_FILE( @@ -110,14 +108,13 @@ workflow VCF_VARLOCIRAPTOR_SINGLE { SORT_CALLED_CHUNKS( VARLOCIRAPTOR_CALLVARIANTS.out.bcf ) - ch_versions = ch_versions.mix(SORT_CALLED_CHUNKS.out.versions) ch_sort_called_chunks_vcf = SORT_CALLED_CHUNKS.out.vcf.branch { single: val_num_chunks <= 1 multiple: val_num_chunks > 1 } - ch_sort_called_chunks_tbi = SORT_CALLED_CHUNKS.out.tbi.branch { + ch_sort_called_chunks_tbi = SORT_CALLED_CHUNKS.out.index.branch { single: val_num_chunks <= 1 multiple: val_num_chunks > 1 } @@ -131,8 +128,6 @@ workflow VCF_VARLOCIRAPTOR_SINGLE { CONCAT_CALLED_CHUNKS(ch_vcf_tbi_chunks) - ch_versions = ch_versions.mix(CONCAT_CALLED_CHUNKS.out.versions) - ch_final_vcf = ch_sort_called_chunks_vcf.single.mix(CONCAT_CALLED_CHUNKS.out.vcf) VARLOCIRAPTOR_FILTERFDR( @@ -141,10 +136,7 @@ workflow VCF_VARLOCIRAPTOR_SINGLE { SORT_FINAL_VCF(VARLOCIRAPTOR_FILTERFDR.out.bcf) - ch_versions = ch_versions.mix(SORT_FINAL_VCF.out.versions) - emit: vcf = SORT_FINAL_VCF.out.vcf - tbi = SORT_FINAL_VCF.out.tbi - versions = ch_versions + tbi = SORT_FINAL_VCF.out.index } diff --git a/subworkflows/local/vcf_varlociraptor_somatic/main.nf b/subworkflows/local/vcf_varlociraptor_somatic/main.nf index 4ad4c80cf5..292c18b340 100644 --- a/subworkflows/local/vcf_varlociraptor_somatic/main.nf +++ b/subworkflows/local/vcf_varlociraptor_somatic/main.nf @@ -79,7 +79,7 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { // Use concatenated Strelka VCFs for somatic and germline calling, mix with other variant callers ch_somatic_vcf_conc = CONCAT_SOMATIC_STRELKA.out.vcf - .join(CONCAT_SOMATIC_STRELKA.out.tbi, by: [0]) + .join(CONCAT_SOMATIC_STRELKA.out.index, by: [0]) .mix(ch_somatic_branched.other) // @@ -107,15 +107,11 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { MERGE_GERMLINE_SOMATIC_VCFS( branched.matched.map { _key, meta_somatic, somatic_vcf, somatic_tbi, _meta_germline, germline_vcf, germline_tbi -> - [meta_somatic, [somatic_vcf, germline_vcf], [somatic_tbi, germline_tbi]] + [meta_somatic, [somatic_vcf, germline_vcf], [somatic_tbi, germline_tbi], []] }, - ch_fasta, - ch_fasta_fai, - [[], []], + ch_fasta.combine(ch_fasta_fai).map{ meta_fasta_, fasta, _meta_fai, fai -> [meta_fasta_, fasta, fai]}.collect() ) - ch_versions = ch_versions.mix(MERGE_GERMLINE_SOMATIC_VCFS.out.versions) - // Combine merged VCFs with unmatched somatic VCFs ch_vcf = MERGE_GERMLINE_SOMATIC_VCFS.out.vcf.mix( branched.unmatched.map { _key, meta, vcf, _tbi -> [meta, vcf] } @@ -261,14 +257,13 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { SORT_CALLED_CHUNKS( VARLOCIRAPTOR_CALLVARIANTS.out.bcf ) - ch_versions = ch_versions.mix(SORT_CALLED_CHUNKS.out.versions) ch_sort_called_chunks_vcf = SORT_CALLED_CHUNKS.out.vcf.branch { single: val_num_chunks <= 1 multiple: val_num_chunks > 1 } - ch_sort_called_chunks_tbi = SORT_CALLED_CHUNKS.out.tbi.branch { + ch_sort_called_chunks_tbi = SORT_CALLED_CHUNKS.out.index.branch { single: val_num_chunks <= 1 multiple: val_num_chunks > 1 } @@ -282,8 +277,6 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { CONCAT_CALLED_CHUNKS(ch_vcf_tbi_chunks) - ch_versions = ch_versions.mix(CONCAT_CALLED_CHUNKS.out.versions) - ch_final_vcf = ch_sort_called_chunks_vcf.single.mix(CONCAT_CALLED_CHUNKS.out.vcf) VARLOCIRAPTOR_FILTERFDR( @@ -292,10 +285,8 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { SORT_FINAL_VCF(VARLOCIRAPTOR_FILTERFDR.out.bcf) - ch_versions = ch_versions.mix(SORT_FINAL_VCF.out.versions) - emit: vcf = SORT_FINAL_VCF.out.vcf - tbi = SORT_FINAL_VCF.out.tbi + tbi = SORT_FINAL_VCF.out.index versions = ch_versions } diff --git a/subworkflows/nf-core/bam_ngscheckmate/main.nf b/subworkflows/nf-core/bam_ngscheckmate/main.nf index d698dd3f24..71f3e7b12f 100644 --- a/subworkflows/nf-core/bam_ngscheckmate/main.nf +++ b/subworkflows/nf-core/bam_ngscheckmate/main.nf @@ -1,24 +1,21 @@ include { BCFTOOLS_MPILEUP } from '../../../modules/nf-core/bcftools/mpileup/main' include { NGSCHECKMATE_NCM } from '../../../modules/nf-core/ngscheckmate/ncm/main' - +// please note this subworkflow requires the options for bcltools_mpileup that are included in the nextflow.config workflow BAM_NGSCHECKMATE { take: ch_input // channel: [ val(meta1), bam/cram ] ch_snp_bed // channel: [ val(meta2), bed ] - ch_fasta // channel: [ val(meta3), fasta ] + ch_fasta // channel: [ val(meta3), fasta, fai ] main: - - ch_versions = Channel.empty() - ch_input_bed = ch_input.combine(ch_snp_bed) - // do something to combine the metas? - .map{ input_meta, input_file, _bed_meta, bed_file -> - [input_meta, input_file, bed_file] - } + ch_input_bed = ch_input + .combine(ch_snp_bed) + .map{ input_meta, input_file, _bed_meta, bed_file -> + [input_meta, input_file, bed_file, []] + } BCFTOOLS_MPILEUP (ch_input_bed, ch_fasta.collect(), false) - ch_versions = ch_versions.mix(BCFTOOLS_MPILEUP.out.versions) BCFTOOLS_MPILEUP .out @@ -34,7 +31,6 @@ workflow BAM_NGSCHECKMATE { .set {ch_vcfs} NGSCHECKMATE_NCM (ch_vcfs, ch_snp_bed, ch_fasta) - ch_versions = ch_versions.mix(NGSCHECKMATE_NCM.out.versions) emit: corr_matrix = NGSCHECKMATE_NCM.out.corr_matrix // channel: [ meta, corr_matrix ] @@ -42,6 +38,5 @@ workflow BAM_NGSCHECKMATE { all = NGSCHECKMATE_NCM.out.all // channel: [ meta, all ] vcf = BCFTOOLS_MPILEUP.out.vcf // channel: [ meta, vcf ] pdf = NGSCHECKMATE_NCM.out.pdf // channel: [ meta, pdf ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/nf-core/bam_ngscheckmate/meta.yml b/subworkflows/nf-core/bam_ngscheckmate/meta.yml index 7de0a114d4..ce45cbba2c 100644 --- a/subworkflows/nf-core/bam_ngscheckmate/meta.yml +++ b/subworkflows/nf-core/bam_ngscheckmate/meta.yml @@ -37,6 +37,10 @@ input: type: file description: fasta file for the genome pattern: "*.{fasta}" + - fai: + type: file + description: fasta file index for the genome + pattern: "*.{fai}" output: - pdf: type: file diff --git a/tests/aligner-parabricks.nf.test.snap b/tests/aligner-parabricks.nf.test.snap index 2b4186d1f0..5f31c21071 100644 --- a/tests/aligner-parabricks.nf.test.snap +++ b/tests/aligner-parabricks.nf.test.snap @@ -473,7 +473,7 @@ 26, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -747,7 +747,7 @@ "chr22_1-40001.bed.gz:md5,87a15eb9c2ff20ccd5cd8735a28708f7", "genome.bed:md5,a87dc7d20ebca626f65cc16ff6c97a3e", "genome.bed.gz:md5,a87dc7d20ebca626f65cc16ff6c97a3e", - "test2_vs_test.mutect2.filtered.bcftools_stats.txt:md5,46384bbd90894ff023684d88df891fd6", + "test2_vs_test.mutect2.filtered.bcftools_stats.txt:md5,bd7378d60c4466257489fae86e9de3da", "test.recal.mosdepth.global.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.recal.mosdepth.region.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.recal.mosdepth.summary.txt:md5,2ea3534987f28b3ed0b64a8e7986b442", diff --git a/tests/annotation_bcfann.nf.test.snap b/tests/annotation_bcfann.nf.test.snap index 9d1781890e..4b3cde2636 100644 --- a/tests/annotation_bcfann.nf.test.snap +++ b/tests/annotation_bcfann.nf.test.snap @@ -4,7 +4,7 @@ 2, { "BCFTOOLS_ANNOTATE": { - "bcftools": 1.21 + "bcftools": "1.23.1" } }, [ @@ -48,7 +48,7 @@ 2, { "BCFTOOLS_ANNOTATE": { - "bcftools": 1.21 + "bcftools": "1.23.1" } }, [ diff --git a/tests/bbsplit.nf.test.snap b/tests/bbsplit.nf.test.snap index 8f7541248e..ea7c990001 100644 --- a/tests/bbsplit.nf.test.snap +++ b/tests/bbsplit.nf.test.snap @@ -10,7 +10,7 @@ "bbmap": "39.18" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -343,7 +343,7 @@ "chr22_1-40001.bed.gz:md5,87a15eb9c2ff20ccd5cd8735a28708f7", "genome.bed:md5,a87dc7d20ebca626f65cc16ff6c97a3e", "genome.bed.gz:md5,a87dc7d20ebca626f65cc16ff6c97a3e", - "test.strelka.variants.bcftools_stats.txt:md5,b6511034fcbf5c396ed035207b4aea41", + "test.strelka.variants.bcftools_stats.txt:md5,0eaa13927e8db9f3d56afdc6cf60ffad", "test.strelka.variants.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -374,7 +374,7 @@ "bbmap": "39.18" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index ffe0be0437..38bfde8a8b 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -4,7 +4,7 @@ 23, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -293,7 +293,7 @@ "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", - "test.strelka.variants.bcftools_stats.txt:md5,2613827870dd789fe602a8a3b739b7f2", + "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", "test.md.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", @@ -331,7 +331,7 @@ 23, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" diff --git a/tests/joint_calling_haplotypecaller.nf.test.snap b/tests/joint_calling_haplotypecaller.nf.test.snap index 9f724dd5a7..dd7b6e2735 100644 --- a/tests/joint_calling_haplotypecaller.nf.test.snap +++ b/tests/joint_calling_haplotypecaller.nf.test.snap @@ -3,8 +3,11 @@ "content": [ 26, { + "BCFTOOLS_SORT": { + "bcftools": "1.23.1" + }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -190,7 +193,7 @@ "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", - "joint_germline.bcftools_stats.txt:md5,1e0bcb3e7dc0e812371e4609f477569c", + "joint_germline.bcftools_stats.txt:md5,8d7de0e9bbf007cf6c80caaa5e6e9ea2", "testN.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "testN.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "testN.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", @@ -249,8 +252,11 @@ "content": [ 18, { + "BCFTOOLS_SORT": { + "bcftools": "1.23.1" + }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -433,7 +439,7 @@ "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", - "joint_germline.bcftools_stats.txt:md5,1e0bcb3e7dc0e812371e4609f477569c", + "joint_germline.bcftools_stats.txt:md5,8d7de0e9bbf007cf6c80caaa5e6e9ea2", "testN.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "testN.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "testN.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", diff --git a/tests/joint_calling_mutect2.nf.test.snap b/tests/joint_calling_mutect2.nf.test.snap index 7a79997e91..6d94c5ade1 100644 --- a/tests/joint_calling_mutect2.nf.test.snap +++ b/tests/joint_calling_mutect2.nf.test.snap @@ -4,7 +4,7 @@ 17, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -188,7 +188,7 @@ "samtools-stats-dp.txt:md5,fe7c4ec200c94df7ff97a0e8cbec2f70", "samtools_alignment_plot.txt:md5,82d6fb277fbbbd221a92ebda4567d9d9", "samtools_insert_size.txt:md5,00660bb059693565c1189ce98356e414", - "test.mutect2.bcftools_stats.txt:md5,45096ddcb6f27a59224b19a8a7c6b1ac", + "test.mutect2.bcftools_stats.txt:md5,2de4f9f8da53b202e9d784b4e95c3245", "sample1.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample1.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample1.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", @@ -235,7 +235,7 @@ 16, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BUILD_INTERVALS": { "gawk": "5.3.0" @@ -412,7 +412,7 @@ "samtools-stats-dp.txt:md5,e6019a625137ced6d426a503cd652559", "samtools_alignment_plot.txt:md5,cb01fb538637d281195e46e557031c7a", "samtools_insert_size.txt:md5,97989575c42dadc81f347d661faa09cb", - "test.mutect2.bcftools_stats.txt:md5,9114eb52e42ff6b8475e7a7773c21eee", + "test.mutect2.bcftools_stats.txt:md5,3079129e89fdaf04a3403d888a99fd81", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.region.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,b0b47739dcafeeb1a9e6218b8abca1e0", diff --git a/tests/postprocess_concatenation.nf.test.snap b/tests/postprocess_concatenation.nf.test.snap index 172d2969fa..7c206ba449 100644 --- a/tests/postprocess_concatenation.nf.test.snap +++ b/tests/postprocess_concatenation.nf.test.snap @@ -7,10 +7,10 @@ "gawk": "5.3.0" }, "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -22,10 +22,10 @@ "gatk4": "4.6.1.0" }, "GERMLINE_VCFS_CONCAT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "GERMLINE_VCFS_CONCAT_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -244,10 +244,10 @@ "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", - "testN.freebayes.filtered.bcftools_stats.txt:md5,96c5e6b9e55f1bb67fca7886fb322b67", - "testT.freebayes.filtered.bcftools_stats.txt:md5,ce8b7afaace836b6a00bd8ccdc980500", - "testN.strelka.variants.bcftools_stats.txt:md5,f11c9e5e9820868809b5465970c7cc06", - "testT.strelka.variants.bcftools_stats.txt:md5,ac070b6cf4de7540a227265971244b31", + "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", + "testT.freebayes.filtered.bcftools_stats.txt:md5,a5beebaf9e38ab8e3e9c332c46dd9ae1", + "testN.strelka.variants.bcftools_stats.txt:md5,fcc53db2f8001b3a68673a9e0802e06c", + "testT.strelka.variants.bcftools_stats.txt:md5,d8dd5a46552458e72ea9963e948a377c", "testN.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", diff --git a/tests/postprocess_concatenation_normalization.nf.test.snap b/tests/postprocess_concatenation_normalization.nf.test.snap index d663d6bc66..d0db0839ff 100644 --- a/tests/postprocess_concatenation_normalization.nf.test.snap +++ b/tests/postprocess_concatenation_normalization.nf.test.snap @@ -7,16 +7,16 @@ "gawk": "5.3.0" }, "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "FILTER_VCFS": { - "bcftools": 1.22 + "bcftools": "1.23.1" }, "FREEBAYES": { "freebayes": "1.3.10" @@ -25,10 +25,10 @@ "gatk4": "4.6.1.0" }, "GERMLINE_VCFS_CONCAT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "GERMLINE_VCFS_CONCAT_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -61,10 +61,10 @@ "vcflib": "1.0.14" }, "VCFS_NORM": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFS_NORM_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -275,10 +275,10 @@ "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", - "testN.freebayes.filtered.bcftools_stats.txt:md5,96c5e6b9e55f1bb67fca7886fb322b67", - "testT.freebayes.filtered.bcftools_stats.txt:md5,ce8b7afaace836b6a00bd8ccdc980500", - "testN.strelka.variants.bcftools_stats.txt:md5,f11c9e5e9820868809b5465970c7cc06", - "testT.strelka.variants.bcftools_stats.txt:md5,ac070b6cf4de7540a227265971244b31", + "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", + "testT.freebayes.filtered.bcftools_stats.txt:md5,a5beebaf9e38ab8e3e9c332c46dd9ae1", + "testN.strelka.variants.bcftools_stats.txt:md5,fcc53db2f8001b3a68673a9e0802e06c", + "testT.strelka.variants.bcftools_stats.txt:md5,d8dd5a46552458e72ea9963e948a377c", "testN.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -338,10 +338,10 @@ "gawk": "5.3.0" }, "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -353,10 +353,10 @@ "gatk4": "4.6.1.0" }, "GERMLINE_VCFS_CONCAT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "GERMLINE_VCFS_CONCAT_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -389,10 +389,10 @@ "vcflib": "1.0.14" }, "VCFS_NORM": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFS_NORM_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -592,10 +592,10 @@ "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", - "testN.freebayes.filtered.bcftools_stats.txt:md5,96c5e6b9e55f1bb67fca7886fb322b67", - "testT.freebayes.filtered.bcftools_stats.txt:md5,ce8b7afaace836b6a00bd8ccdc980500", - "testN.strelka.variants.bcftools_stats.txt:md5,f11c9e5e9820868809b5465970c7cc06", - "testT.strelka.variants.bcftools_stats.txt:md5,ac070b6cf4de7540a227265971244b31", + "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", + "testT.freebayes.filtered.bcftools_stats.txt:md5,a5beebaf9e38ab8e3e9c332c46dd9ae1", + "testN.strelka.variants.bcftools_stats.txt:md5,fcc53db2f8001b3a68673a9e0802e06c", + "testT.strelka.variants.bcftools_stats.txt:md5,d8dd5a46552458e72ea9963e948a377c", "testN.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -633,7 +633,7 @@ "testN.freebayes.filtered.norm.sorted.vcf.gz:md5,18992a755b06d72374bb072cc8af86f9", "testN.strelka.variants.norm.sorted.vcf.gz:md5,ba9aabddec39a8bcbdb38c46f7a26515", "testT.freebayes.filtered.norm.sorted.vcf.gz:md5,574d3d9e73986d07839d5e720c3ea929", - "testT.strelka.variants.norm.sorted.vcf.gz:md5,2dd9f7f6dac9c10afcf01f148a486799", + "testT.strelka.variants.norm.sorted.vcf.gz:md5,3c0fb37b3523c7f7555e7cc139a1adb1", "testN.strelka.genome.vcf.gz:md5,325ea84ccf1ec1cf7a6c5c4aae1c0d1", "testN.strelka.variants.vcf.gz:md5,3a3b3e67614ec91f4f0b88999dff454b", "testT.strelka.genome.vcf.gz:md5,ece653410947a3ace10296c2cc5ff095", diff --git a/tests/postprocess_consensus.nf.test.snap b/tests/postprocess_consensus.nf.test.snap index 4b4dda1067..b6c9b23f00 100644 --- a/tests/postprocess_consensus.nf.test.snap +++ b/tests/postprocess_consensus.nf.test.snap @@ -7,16 +7,16 @@ "gawk": "5.3.0" }, "BCFTOOLS_CONCAT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_ISEC": { - "bcftools": 1.22 + "bcftools": "1.23.1" }, "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CONSENSUS_FROM_SITES": { "gawk": "mawk 1.3.4 20240123", @@ -26,7 +26,7 @@ "gawk": "5.3.0" }, "FILTER_VCFS": { - "bcftools": 1.22 + "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { "gatk4": "4.6.1.0" @@ -62,10 +62,10 @@ "tabix": "1.21" }, "VCFS_NORM": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFS_NORM_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -304,11 +304,11 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.bcftools.bcftools_stats.txt:md5,bd86ded3843a217d429b34edd22a9a4e", - "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,65bc65858d3dfa1d8913119850626823", - "sample3.strelka.variants.bcftools_stats.txt:md5,6d4d032ba146941cb226765aaed9d67f", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,8404ea88658fbc41d447ba20bf46dd0a", + "sample3.bcftools.bcftools_stats.txt:md5,bb4018e2ec62ab957867c4f55ce626b8", + "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,c802eeeaa4ab6531bdb5d8c0b583f8b6", + "sample3.strelka.variants.bcftools_stats.txt:md5,2c40e667f6ee75761fe6c3b33dda0679", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,91f318ab5e6b017554f8f72866c6a5bd", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", @@ -350,7 +350,7 @@ "sample4_vs_sample3.strelka.somatic_indels.bcftools_filtered.vcf.gz:md5,a7861b539e2cfd4429a02757bc9845e9", "sample4_vs_sample3.strelka.somatic_snvs.bcftools_filtered.vcf.gz:md5,973d0ca572b2c94e18279a3c7694d934", "sample4_vs_sample3.mutect2.vcf.gz:md5,f2c46d0dae1b1a59180c0b9e595993d2", - "sample3.bcftools.bcftools_filtered.norm.sorted.vcf.gz:md5,ff4832fed7bffc1b53254f635ddb8a95", + "sample3.bcftools.bcftools_filtered.norm.sorted.vcf.gz:md5,611a523c501d43f1810f4191267693fb", "sample3.strelka.variants.bcftools_filtered.norm.sorted.vcf.gz:md5,e3f3390321c8693afd777202e15e9b5e", "sample4_vs_sample3.mutect2.bcftools_filtered.norm.sorted.vcf.gz:md5,8826a34d4c7a004750b8a56fee56dcbb", "sample4_vs_sample3.strelka.somatic_indels.bcftools_filtered.norm.sorted.vcf.gz:md5,e60a2a65edfea45253619ccd5c6054f0", @@ -379,13 +379,13 @@ "gawk": "5.3.0" }, "BCFTOOLS_ISEC": { - "bcftools": 1.22 + "bcftools": "1.23.1" }, "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CONSENSUS_FROM_SITES": { "gawk": "mawk 1.3.4 20240123", @@ -425,10 +425,10 @@ "tabix": "1.21" }, "VCFS_NORM": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFS_NORM_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -613,9 +613,9 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.bcftools.bcftools_stats.txt:md5,3299f97352e32c873c95e43922c79147", - "sample2.lofreq.bcftools_stats.txt:md5,a8a850fdd11644fa4b770971dfe37194", - "sample2.mutect2.bcftools_stats.txt:md5,846b97f3763c5316f2b7e76962d80be9", + "sample2.bcftools.bcftools_stats.txt:md5,47ce340432efdbb38a86d8b7c3d0c2d4", + "sample2.lofreq.bcftools_stats.txt:md5,064a0729f34ff2b74a1ea619cc47ecb6", + "sample2.mutect2.bcftools_stats.txt:md5,be37ecb07e10f0a3ea082e3fab5226fd", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", @@ -648,7 +648,7 @@ ], [ "0002.vcf.gz", - "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=55, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=56, phased=false, phasedAutodetect=false]" ], [ "sample2.lofreq.vcf.gz", @@ -660,7 +660,7 @@ ], [ "sample2.bcftools.norm.sorted.vcf.gz", - "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=132, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=133, phased=false, phasedAutodetect=false]" ], [ "sample2.lofreq.norm.sorted.vcf.gz", @@ -668,7 +668,7 @@ ], [ "sample2.mutect2.norm.sorted.vcf.gz", - "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=1261, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=1262, phased=false, phasedAutodetect=false]" ] ], [ @@ -690,16 +690,16 @@ "gawk": "5.3.0" }, "BCFTOOLS_CONCAT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_ISEC": { - "bcftools": 1.22 + "bcftools": "1.23.1" }, "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CALCULATECONTAMINATION": { "gatk4": "4.6.1.0" @@ -754,10 +754,10 @@ "tabix": "1.21" }, "VCFS_NORM": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFS_NORM_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -992,11 +992,11 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.bcftools.bcftools_stats.txt:md5,bd86ded3843a217d429b34edd22a9a4e", - "sample4_vs_sample3.mutect2.filtered.bcftools_stats.txt:md5,91e802a68f9d8da14bb3dcf784f0810d", - "sample3.strelka.variants.bcftools_stats.txt:md5,6d4d032ba146941cb226765aaed9d67f", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,8404ea88658fbc41d447ba20bf46dd0a", + "sample3.bcftools.bcftools_stats.txt:md5,bb4018e2ec62ab957867c4f55ce626b8", + "sample4_vs_sample3.mutect2.filtered.bcftools_stats.txt:md5,ef2f52e9bd9793547bb43a3828f8304c", + "sample3.strelka.variants.bcftools_stats.txt:md5,2c40e667f6ee75761fe6c3b33dda0679", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,91f318ab5e6b017554f8f72866c6a5bd", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", @@ -1038,11 +1038,11 @@ ], [ "sample3.consensus.vcf.gz", - "VcfFile [chromosomes=[chr21], sampleCount=0, variantCount=70, phased=true, phasedAutodetect=true]" + "VcfFile [chromosomes=[chr21], sampleCount=0, variantCount=71, phased=true, phasedAutodetect=true]" ], [ "0001.vcf.gz", - "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=70, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=71, phased=false, phasedAutodetect=false]" ], [ "sample4_vs_sample3.consensus.vcf.gz", @@ -1062,11 +1062,11 @@ ], [ "sample3.bcftools.norm.sorted.vcf.gz", - "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=123, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=124, phased=false, phasedAutodetect=false]" ], [ "sample3.strelka.variants.norm.sorted.vcf.gz", - "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=52656, phased=false, phasedAutodetect=false]" + "VcfFile [chromosomes=[chr21], sampleCount=1, variantCount=53245, phased=false, phasedAutodetect=false]" ], [ "sample4_vs_sample3.mutect2.filtered.norm.sorted.vcf.gz", diff --git a/tests/postprocess_filtering.nf.test.snap b/tests/postprocess_filtering.nf.test.snap index 80e7e36a17..bf295ba961 100644 --- a/tests/postprocess_filtering.nf.test.snap +++ b/tests/postprocess_filtering.nf.test.snap @@ -4,16 +4,16 @@ 41, { "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "FILTER_VCFS": { - "bcftools": 1.22 + "bcftools": "1.23.1" }, "FREEBAYES": { "freebayes": "1.3.10" @@ -238,10 +238,10 @@ "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", - "testN.freebayes.filtered.bcftools_stats.txt:md5,96c5e6b9e55f1bb67fca7886fb322b67", - "testT.freebayes.filtered.bcftools_stats.txt:md5,ce8b7afaace836b6a00bd8ccdc980500", - "testN.strelka.variants.bcftools_stats.txt:md5,f11c9e5e9820868809b5465970c7cc06", - "testT.strelka.variants.bcftools_stats.txt:md5,ac070b6cf4de7540a227265971244b31", + "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", + "testT.freebayes.filtered.bcftools_stats.txt:md5,a5beebaf9e38ab8e3e9c332c46dd9ae1", + "testN.strelka.variants.bcftools_stats.txt:md5,fcc53db2f8001b3a68673a9e0802e06c", + "testT.strelka.variants.bcftools_stats.txt:md5,d8dd5a46552458e72ea9963e948a377c", "testN.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", diff --git a/tests/postprocess_normalization.nf.test.snap b/tests/postprocess_normalization.nf.test.snap index f3744c5d9c..8e019fffdd 100644 --- a/tests/postprocess_normalization.nf.test.snap +++ b/tests/postprocess_normalization.nf.test.snap @@ -7,10 +7,10 @@ "gawk": "5.3.0" }, "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -52,10 +52,10 @@ "vcflib": "1.0.14" }, "VCFS_NORM": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFS_NORM_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "VCFTOOLS_TSTV_COUNT": { "vcftools": "0.1.16" @@ -248,10 +248,10 @@ "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", - "testN.freebayes.filtered.bcftools_stats.txt:md5,96c5e6b9e55f1bb67fca7886fb322b67", - "testT.freebayes.filtered.bcftools_stats.txt:md5,ce8b7afaace836b6a00bd8ccdc980500", - "testN.strelka.variants.bcftools_stats.txt:md5,f11c9e5e9820868809b5465970c7cc06", - "testT.strelka.variants.bcftools_stats.txt:md5,ac070b6cf4de7540a227265971244b31", + "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", + "testT.freebayes.filtered.bcftools_stats.txt:md5,a5beebaf9e38ab8e3e9c332c46dd9ae1", + "testN.strelka.variants.bcftools_stats.txt:md5,fcc53db2f8001b3a68673a9e0802e06c", + "testT.strelka.variants.bcftools_stats.txt:md5,d8dd5a46552458e72ea9963e948a377c", "testN.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -289,7 +289,7 @@ "testN.freebayes.filtered.norm.sorted.vcf.gz:md5,18992a755b06d72374bb072cc8af86f9", "testN.strelka.variants.norm.sorted.vcf.gz:md5,ba9aabddec39a8bcbdb38c46f7a26515", "testT.freebayes.filtered.norm.sorted.vcf.gz:md5,574d3d9e73986d07839d5e720c3ea929", - "testT.strelka.variants.norm.sorted.vcf.gz:md5,2dd9f7f6dac9c10afcf01f148a486799", + "testT.strelka.variants.norm.sorted.vcf.gz:md5,3c0fb37b3523c7f7555e7cc139a1adb1", "testN.strelka.genome.vcf.gz:md5,325ea84ccf1ec1cf7a6c5c4aae1c0d1", "testN.strelka.variants.vcf.gz:md5,3a3b3e67614ec91f4f0b88999dff454b", "testT.strelka.genome.vcf.gz:md5,ece653410947a3ace10296c2cc5ff095", diff --git a/tests/postprocess_varlociraptor.nf.test.snap b/tests/postprocess_varlociraptor.nf.test.snap index c52c6f785f..19239f404a 100644 --- a/tests/postprocess_varlociraptor.nf.test.snap +++ b/tests/postprocess_varlociraptor.nf.test.snap @@ -10,10 +10,13 @@ "varlociraptor": "8.9.5" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CONCAT_CALLED_CHUNKS": { - "bcftools": 1.21 + "bcftools": "1.23.1" + }, + "CONCAT_SOMATIC_STRELKA": { + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -25,7 +28,7 @@ "gatk4": "4.6.1.0" }, "MERGE_GERMLINE_SOMATIC_VCFS": { - "bcftools": 1.22 + "bcftools": "1.23.1" }, "MERGE_STRELKA": { "gatk4": "4.6.2.0" @@ -55,10 +58,10 @@ "samtools": 1.21 }, "SORT_CALLED_CHUNKS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "SORT_FINAL_VCF": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -271,9 +274,9 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.strelka.variants.bcftools_stats.txt:md5,6d4d032ba146941cb226765aaed9d67f", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,8404ea88658fbc41d447ba20bf46dd0a", + "sample3.strelka.variants.bcftools_stats.txt:md5,2c40e667f6ee75761fe6c3b33dda0679", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,91f318ab5e6b017554f8f72866c6a5bd", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", @@ -324,13 +327,13 @@ 73, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CALCULATECONTAMINATION": { "gatk4": "4.6.1.0" }, "CONCAT_CALLED_CHUNKS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -372,10 +375,10 @@ "samtools": 1.21 }, "SORT_CALLED_CHUNKS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "SORT_FINAL_VCF": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -545,7 +548,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.mutect2.filtered.bcftools_stats.txt:md5,5327cede1f3ad2139945607f66264928", + "sample2.mutect2.filtered.bcftools_stats.txt:md5,30c32a41d08f8ae7227521beae37dc62", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", @@ -584,10 +587,10 @@ 68, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CONCAT_CALLED_CHUNKS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -614,10 +617,10 @@ "samtools": 1.21 }, "SORT_CALLED_CHUNKS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "SORT_FINAL_VCF": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -786,7 +789,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.strelka.variants.bcftools_stats.txt:md5,7d091579d450a6f6d6e6ed9795dce0cb", + "sample1.strelka.variants.bcftools_stats.txt:md5,bcb50cfcfefdce0d203aff1d054d9f24", "sample1.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample1.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample1.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", diff --git a/tests/qc_ngscheckmate.nf.test.snap b/tests/qc_ngscheckmate.nf.test.snap index cdaed6601f..bba16b79b9 100644 --- a/tests/qc_ngscheckmate.nf.test.snap +++ b/tests/qc_ngscheckmate.nf.test.snap @@ -4,7 +4,7 @@ 17, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -127,7 +127,7 @@ 17, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/save_output_as_bam.nf.test.snap b/tests/save_output_as_bam.nf.test.snap index 6ab3962df8..27a15e889b 100644 --- a/tests/save_output_as_bam.nf.test.snap +++ b/tests/save_output_as_bam.nf.test.snap @@ -4,7 +4,7 @@ 29, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -327,7 +327,7 @@ "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", - "test.strelka.variants.bcftools_stats.txt:md5,2613827870dd789fe602a8a3b739b7f2", + "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", "test.md.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", diff --git a/tests/start_from_preparerecalibration.nf.test.snap b/tests/start_from_preparerecalibration.nf.test.snap index e3926b1dac..c7260b1f8f 100644 --- a/tests/start_from_preparerecalibration.nf.test.snap +++ b/tests/start_from_preparerecalibration.nf.test.snap @@ -151,7 +151,7 @@ 10, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -256,7 +256,7 @@ ], [ "multiqc_citations.txt:md5,ac2b3cf2dfb12c40837b9bbad8112d86", - "test.strelka.variants.bcftools_stats.txt:md5,bffd4c0cf553a42c5b183220d71a1466", + "test.strelka.variants.bcftools_stats.txt:md5,e59e1411514a692fddeea663e3d1c3a5", "test.strelka.variants.FILTER.summary:md5,39ff2cc8eb7495a14a6b76e0ab627027", "test.strelka.variants.TsTv.count:md5,ee7dafc8d941b8502a04a63dc3126fff" ], @@ -279,7 +279,7 @@ 10, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -384,7 +384,7 @@ ], [ "multiqc_citations.txt:md5,ac2b3cf2dfb12c40837b9bbad8112d86", - "test.strelka.variants.bcftools_stats.txt:md5,bffd4c0cf553a42c5b183220d71a1466", + "test.strelka.variants.bcftools_stats.txt:md5,e59e1411514a692fddeea663e3d1c3a5", "test.strelka.variants.FILTER.summary:md5,39ff2cc8eb7495a14a6b76e0ab627027", "test.strelka.variants.TsTv.count:md5,ee7dafc8d941b8502a04a63dc3126fff" ], diff --git a/tests/start_from_recalibration.nf.test.snap b/tests/start_from_recalibration.nf.test.snap index cd6e64394d..4b02d0f806 100644 --- a/tests/start_from_recalibration.nf.test.snap +++ b/tests/start_from_recalibration.nf.test.snap @@ -131,7 +131,7 @@ 10, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -236,7 +236,7 @@ ], [ "multiqc_citations.txt:md5,ac2b3cf2dfb12c40837b9bbad8112d86", - "test.strelka.variants.bcftools_stats.txt:md5,bffd4c0cf553a42c5b183220d71a1466", + "test.strelka.variants.bcftools_stats.txt:md5,e59e1411514a692fddeea663e3d1c3a5", "test.strelka.variants.FILTER.summary:md5,39ff2cc8eb7495a14a6b76e0ab627027", "test.strelka.variants.TsTv.count:md5,ee7dafc8d941b8502a04a63dc3126fff" ], @@ -259,7 +259,7 @@ 10, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -364,7 +364,7 @@ ], [ "multiqc_citations.txt:md5,ac2b3cf2dfb12c40837b9bbad8112d86", - "test.strelka.variants.bcftools_stats.txt:md5,bffd4c0cf553a42c5b183220d71a1466", + "test.strelka.variants.bcftools_stats.txt:md5,e59e1411514a692fddeea663e3d1c3a5", "test.strelka.variants.FILTER.summary:md5,39ff2cc8eb7495a14a6b76e0ab627027", "test.strelka.variants.TsTv.count:md5,ee7dafc8d941b8502a04a63dc3126fff" ], diff --git a/tests/tumor-normal-pair.nf.test.snap b/tests/tumor-normal-pair.nf.test.snap index 047e90be95..2c5e8d6bba 100644 --- a/tests/tumor-normal-pair.nf.test.snap +++ b/tests/tumor-normal-pair.nf.test.snap @@ -4,7 +4,7 @@ 40, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -335,9 +335,9 @@ "samtools-stats-dp.txt:md5,13dab249f7bef935dfef234299550db8", "samtools_alignment_plot.txt:md5,44149e0c5cc4bfa58242824b300219a2", "samtools_insert_size.txt:md5,c4b5c78eeb30a8c926d1bd9506882516", - "test.strelka.variants.bcftools_stats.txt:md5,2613827870dd789fe602a8a3b739b7f2", - "test2_vs_test.strelka.somatic_indels.bcftools_stats.txt:md5,5e8f9a8fdbc765ced736d0c8c7dd3a52", - "test2_vs_test.strelka.somatic_snvs.bcftools_stats.txt:md5,edb7763fad7b6f825e47e01ffa70adbc", + "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", + "test2_vs_test.strelka.somatic_indels.bcftools_stats.txt:md5,b5d3cad82f19dd86895f5b7b38034bd2", + "test2_vs_test.strelka.somatic_snvs.bcftools_stats.txt:md5,08b597e1002f482dc549044c500eb60a", "test.md.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test.md.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.md.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", diff --git a/tests/umi_in_read_names.nf.test.snap b/tests/umi_in_read_names.nf.test.snap index 352e25861b..dad1469bb4 100644 --- a/tests/umi_in_read_names.nf.test.snap +++ b/tests/umi_in_read_names.nf.test.snap @@ -4,7 +4,7 @@ 19, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -230,7 +230,7 @@ "samtools-stats-dp.txt:md5,175b0442368f03294ef9ce9e73172c7b", "samtools_alignment_plot.txt:md5,6555bbf8c1ef12058e9a050545a9fa41", "samtools_insert_size.txt:md5,164be68813f2cb96462c152743b95cae", - "test.strelka.variants.bcftools_stats.txt:md5,5b7cff7b17c5bcde6177a188b1511986", + "test.strelka.variants.bcftools_stats.txt:md5,f4f3355bc1f101411c2fed6cf77d478e", "test.md.mosdepth.global.dist.txt:md5,0c795eadf5e5a8ea8469ba8c0ece9bdd", "test.md.mosdepth.region.dist.txt:md5,54273a37adf55f8cee822aaf92a4c321", "test.md.mosdepth.summary.txt:md5,bb12489d3d44c4e44eb5dcc8fdef636c", @@ -266,7 +266,7 @@ 30, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -596,7 +596,7 @@ "samtools-stats-dp.txt:md5,afe461017b5f2189651f29c79f6fee44", "samtools_alignment_plot.txt:md5,9d6e0d529e64404f2c24e74285e242ee", "samtools_insert_size.txt:md5,91c40430c1296fd8ce04788f2f528754", - "test.strelka.variants.bcftools_stats.txt:md5,3f4c40f17e956e4140a0432072a9dde0", + "test.strelka.variants.bcftools_stats.txt:md5,a1500be145d3bd8a1e643c8772c4406d", "test.md.mosdepth.global.dist.txt:md5,7b8a7773d5d854ae1b681b971d11bb34", "test.md.mosdepth.region.dist.txt:md5,1dd626f6fef0d1ac29fd7ffb8b1bbd95", "test.md.mosdepth.summary.txt:md5,25af78b074abf710ddd9c90cba1928bc", diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index 4962e9e856..d5c4f474d6 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -4,13 +4,13 @@ 97, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -524,15 +524,15 @@ "samtools-stats-dp.txt:md5,13dab249f7bef935dfef234299550db8", "samtools_alignment_plot.txt:md5,44149e0c5cc4bfa58242824b300219a2", "samtools_insert_size.txt:md5,c4b5c78eeb30a8c926d1bd9506882516", - "test.bcftools.bcftools_stats.txt:md5,4b2997064fb500f090639edca1ccaa6e", - "test.deepvariant.bcftools_stats.txt:md5,61ab450ed778088b9c879b8dcbbb9db8", - "test.freebayes.filtered.bcftools_stats.txt:md5,dde124ceaf6f109cd274b837b950096b", - "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,189bc07d38c2a9ae34b141cff402bda6", - "test.strelka.variants.bcftools_stats.txt:md5,2613827870dd789fe602a8a3b739b7f2", - "test2_vs_test.strelka.somatic_indels.bcftools_stats.txt:md5,5e8f9a8fdbc765ced736d0c8c7dd3a52", - "test2_vs_test.strelka.somatic_snvs.bcftools_stats.txt:md5,edb7763fad7b6f825e47e01ffa70adbc", - "test.tiddit.bcftools_stats.txt:md5,2b96446a75e1ec5d5f1310a934c0dd4c", - "test2_vs_test.tiddit_sv_merge.bcftools_stats.txt:md5,a6c45b2a2b7d8844e5536deee5c77af5", + "test.bcftools.bcftools_stats.txt:md5,9213504c6b04c6c3cdf308ad3e8b4c3a", + "test.deepvariant.bcftools_stats.txt:md5,67f779dde7f1c6b6ca5cf48f8c24ba02", + "test.freebayes.filtered.bcftools_stats.txt:md5,5b0bc956256ff340d4f7409769fa9924", + "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,47f9e44efca5ebdc059866e6bfbb0564", + "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", + "test2_vs_test.strelka.somatic_indels.bcftools_stats.txt:md5,b5d3cad82f19dd86895f5b7b38034bd2", + "test2_vs_test.strelka.somatic_snvs.bcftools_stats.txt:md5,08b597e1002f482dc549044c500eb60a", + "test.tiddit.bcftools_stats.txt:md5,c4cb4e484f95c7dbdaa3d08f0704f7b5", + "test2_vs_test.tiddit_sv_merge.bcftools_stats.txt:md5,7c527e6b2eeb8d08c37898a305f32b92", "test.md.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test.md.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.md.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", @@ -646,13 +646,13 @@ 55, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -1068,11 +1068,11 @@ "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", - "test.bcftools.bcftools_stats.txt:md5,4b2997064fb500f090639edca1ccaa6e", - "test.deepvariant.bcftools_stats.txt:md5,61ab450ed778088b9c879b8dcbbb9db8", - "test.freebayes.filtered.bcftools_stats.txt:md5,c6b6e221504c69ee75b209f4a0b2506a", - "test.strelka.variants.bcftools_stats.txt:md5,2613827870dd789fe602a8a3b739b7f2", - "test.tiddit.bcftools_stats.txt:md5,2b96446a75e1ec5d5f1310a934c0dd4c", + "test.bcftools.bcftools_stats.txt:md5,9213504c6b04c6c3cdf308ad3e8b4c3a", + "test.deepvariant.bcftools_stats.txt:md5,67f779dde7f1c6b6ca5cf48f8c24ba02", + "test.freebayes.filtered.bcftools_stats.txt:md5,60f55a391db494db3e95bd69b6b36fa3", + "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", + "test.tiddit.bcftools_stats.txt:md5,c4cb4e484f95c7dbdaa3d08f0704f7b5", "test.md.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", @@ -1141,13 +1141,13 @@ 49, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -1539,10 +1539,10 @@ "samtools-stats-dp.txt:md5,157a95de8aa4dd8947bb965f0c9ae3c7", "samtools_alignment_plot.txt:md5,46e8824724863d243a01cc239a5eff15", "samtools_insert_size.txt:md5,17c44517c58803f9c078f6d9b55aed00", - "test2.bcftools.bcftools_stats.txt:md5,c61cda67fa314ecdeac858599ce732ee", - "test2.freebayes.filtered.bcftools_stats.txt:md5,57082cdcbbe9ffb4c63b314912227afb", - "test2.mutect2.filtered.bcftools_stats.txt:md5,3ecb2b3bb668d9f808787ffaa780fc03", - "test2.tiddit.bcftools_stats.txt:md5,1122042610f0aed654c8d8b817fd1c50", + "test2.bcftools.bcftools_stats.txt:md5,fa4bd52259a3400e5d21c43b570e40a5", + "test2.freebayes.filtered.bcftools_stats.txt:md5,9bb83f7b4cad18474e47b5cee9160a32", + "test2.mutect2.filtered.bcftools_stats.txt:md5,cb2c8f2f4b0ceee60fb1243191d4f429", + "test2.tiddit.bcftools_stats.txt:md5,346588891b9ab59af56f44649421b424", "test2.md.mosdepth.global.dist.txt:md5,2020cf6dfc7ddca020c921dd9f0549b7", "test2.md.mosdepth.region.dist.txt:md5,38ff8b38c33b9231f047fea8ea830aae", "test2.md.mosdepth.summary.txt:md5,8b991358768cade225470a07cd34f573", diff --git a/tests/variant_calling_deepvariant.nf.test.snap b/tests/variant_calling_deepvariant.nf.test.snap index f109166849..916214ce27 100644 --- a/tests/variant_calling_deepvariant.nf.test.snap +++ b/tests/variant_calling_deepvariant.nf.test.snap @@ -4,7 +4,7 @@ 12, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -161,7 +161,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.deepvariant.bcftools_stats.txt:md5,a19ff85c0bc9796ace876f3a9c34c6ce", + "test.deepvariant.bcftools_stats.txt:md5,c784614aec9ed43f1d4a6149c8ae8bf3", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -189,7 +189,7 @@ 12, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -340,7 +340,7 @@ 9, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "DEEPVARIANT_RUNDEEPVARIANT": { "deepvariant": "1.10.0" @@ -484,7 +484,7 @@ 9, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "DEEPVARIANT_RUNDEEPVARIANT": { "deepvariant": "1.10.0" @@ -634,7 +634,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.deepvariant.bcftools_stats.txt:md5,a19ff85c0bc9796ace876f3a9c34c6ce", + "test.deepvariant.bcftools_stats.txt:md5,c784614aec9ed43f1d4a6149c8ae8bf3", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", diff --git a/tests/variant_calling_freebayes.nf.test.snap b/tests/variant_calling_freebayes.nf.test.snap index 79e58083b4..0b09f6ebd9 100644 --- a/tests/variant_calling_freebayes.nf.test.snap +++ b/tests/variant_calling_freebayes.nf.test.snap @@ -4,10 +4,10 @@ 19, { "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -180,7 +180,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.freebayes.filtered.bcftools_stats.txt:md5,58e57fe87d5eb8b7ccd9b1ecd2d196df", + "sample2.freebayes.filtered.bcftools_stats.txt:md5,8d125501aef859ecb64b7363d93429fe", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", @@ -215,10 +215,10 @@ 41, { "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -554,8 +554,8 @@ "samtools-stats-dp.txt:md5,7a0481b59cdd57cc0b8bc9b5641614c6", "samtools_alignment_plot.txt:md5,8e6178a26fe2a4fc4f45fac3175ba6c6", "samtools_insert_size.txt:md5,c4b5c78eeb30a8c926d1bd9506882516", - "test.freebayes.filtered.bcftools_stats.txt:md5,dde124ceaf6f109cd274b837b950096b", - "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,189bc07d38c2a9ae34b141cff402bda6", + "test.freebayes.filtered.bcftools_stats.txt:md5,5b0bc956256ff340d4f7409769fa9924", + "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,47f9e44efca5ebdc059866e6bfbb0564", "test.md.mosdepth.global.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.md.mosdepth.summary.txt:md5,0010c2396a3173c7cf4983abe2eb6a4c", "test.md.per-base.bed.gz:md5,34dfe443c0a0767562dd65272e3310ef", @@ -620,10 +620,10 @@ 33, { "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -942,7 +942,7 @@ "samtools-stats-dp.txt:md5,300b95526a211b05f18aaffd037dacd3", "samtools_alignment_plot.txt:md5,5053f650b8612fe5e8527b0bca8ab905", "samtools_insert_size.txt:md5,2b1da7c476290081135a2816f4231333", - "test.freebayes.filtered.bcftools_stats.txt:md5,5ad7fc8a51dd1dc0f827a46acbed01c4", + "test.freebayes.filtered.bcftools_stats.txt:md5,b0d8c9234a3b038c05fd14d656e43956", "test.md.mosdepth.global.dist.txt:md5,531a83245143e7975f18e1988c876138", "test.md.mosdepth.region.dist.txt:md5,d25723bdd3fec6b17d2462abfa097b9e", "test.md.mosdepth.summary.txt:md5,87be70cd1237d7af9aa40d8cd8b3a817", @@ -989,10 +989,10 @@ 24, { "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -1297,7 +1297,7 @@ "samtools-stats-dp.txt:md5,9e836f09043529495de9e1c268ee8e82", "samtools_alignment_plot.txt:md5,bcc2f176a4bc51b33a36bd4381f048a5", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", - "test.freebayes.filtered.bcftools_stats.txt:md5,c6b6e221504c69ee75b209f4a0b2506a", + "test.freebayes.filtered.bcftools_stats.txt:md5,60f55a391db494db3e95bd69b6b36fa3", "test.md.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", @@ -1340,10 +1340,10 @@ 14, { "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "FREEBAYES": { "freebayes": "1.3.10" @@ -1509,7 +1509,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.freebayes.filtered.bcftools_stats.txt:md5,b83440f3699a3258015d0ce60eea0d46", + "sample2.freebayes.filtered.bcftools_stats.txt:md5,6bc59a78f70ac18e8d69a779a7892673", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", @@ -1541,10 +1541,10 @@ 56, { "BCFTOOLS_SORT": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { "bwa": "0.7.18-r1243-dirty" @@ -1902,8 +1902,8 @@ "samtools-stats-dp.txt:md5,ff7906db0da2f9c9ba5ce85c34694124", "samtools_alignment_plot.txt:md5,89d0a6e7076223e9feadbecd794948d5", "samtools_insert_size.txt:md5,ca54b785b1d63edd61cef58cd5558aa2", - "test.freebayes.filtered.bcftools_stats.txt:md5,b313075b3e9854e0b561dd8d754bf097", - "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,42d0644fc84df43b26e8de1ad427b446", + "test.freebayes.filtered.bcftools_stats.txt:md5,49399853673a44189a06f171efb1c670", + "test2_vs_test.freebayes.filtered.bcftools_stats.txt:md5,7d4efbffe37f0a3dad729361353d32a9", "test.md.mosdepth.global.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.md.mosdepth.region.dist.txt:md5,835fdc6fa52cc33e6fb76c0c20a8a6c3", "test.md.mosdepth.summary.txt:md5,dcc9ab2bf3248903e02d8da87e678977", diff --git a/tests/variant_calling_haplotypecaller.nf.test.snap b/tests/variant_calling_haplotypecaller.nf.test.snap index e48ae8904b..fefcdc20f0 100644 --- a/tests/variant_calling_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_haplotypecaller.nf.test.snap @@ -4,7 +4,7 @@ 9, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "GATK4_HAPLOTYPECALLER": { "gatk4": "4.6.1.0" @@ -155,7 +155,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.haplotypecaller.bcftools_stats.txt:md5,1497941f37b14c39a24490a50a97e365", + "test.haplotypecaller.bcftools_stats.txt:md5,b9b8c3cb422534bdb7a45d884c121af8", "test.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "test.recal.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59", "test.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", @@ -181,7 +181,7 @@ 14, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -342,7 +342,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.haplotypecaller.bcftools_stats.txt:md5,1497941f37b14c39a24490a50a97e365", + "test.haplotypecaller.bcftools_stats.txt:md5,b9b8c3cb422534bdb7a45d884c121af8", "test.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "test.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "test.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", @@ -371,7 +371,7 @@ 11, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CNNSCOREVARIANTS": { "gatk4": "4.5.0.0" @@ -530,7 +530,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.haplotypecaller.filtered.bcftools_stats.txt:md5,bfdbcc0c0513be1e223434eefee3b90b", + "test.haplotypecaller.filtered.bcftools_stats.txt:md5,5debbaa917411dda07c7972272a95f38", "test.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "test.recal.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59", "test.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", @@ -557,7 +557,7 @@ 16, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CNNSCOREVARIANTS": { "gatk4": "4.5.0.0" @@ -726,7 +726,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.haplotypecaller.filtered.bcftools_stats.txt:md5,bfdbcc0c0513be1e223434eefee3b90b", + "test.haplotypecaller.filtered.bcftools_stats.txt:md5,5debbaa917411dda07c7972272a95f38", "test.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "test.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "test.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", diff --git a/tests/variant_calling_lofreq.nf.test.snap b/tests/variant_calling_lofreq.nf.test.snap index d53a63c2d0..8e641e9b68 100644 --- a/tests/variant_calling_lofreq.nf.test.snap +++ b/tests/variant_calling_lofreq.nf.test.snap @@ -4,7 +4,7 @@ 11, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -158,7 +158,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.lofreq.bcftools_stats.txt:md5,a8a850fdd11644fa4b770971dfe37194", + "sample2.lofreq.bcftools_stats.txt:md5,064a0729f34ff2b74a1ea619cc47ecb6", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", @@ -189,7 +189,7 @@ 9, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { "gatk4": "4.6.1.0" @@ -336,7 +336,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.lofreq.bcftools_stats.txt:md5,dd602205b6d368eb0e21d2a94c36e0de", + "sample2.lofreq.bcftools_stats.txt:md5,1aa21f81ba86f60f145934ab517fc44e", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", diff --git a/tests/variant_calling_manta.nf.test.snap b/tests/variant_calling_manta.nf.test.snap index 129517d0c9..b5b032807a 100644 --- a/tests/variant_calling_manta.nf.test.snap +++ b/tests/variant_calling_manta.nf.test.snap @@ -4,7 +4,7 @@ 11, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -130,7 +130,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.manta.diploid_sv.bcftools_stats.txt:md5,636109db283cbee4539786928c811893", + "sample1.manta.diploid_sv.bcftools_stats.txt:md5,8721040d8aa617f37498e9d89f48d503", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -157,7 +157,7 @@ 9, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MANTA_TUMORONLY": { "manta": "1.6.0" @@ -279,7 +279,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.manta.tumor_sv.bcftools_stats.txt:md5,9fbe26c75869000b526b59b454f76f6a", + "sample2.manta.tumor_sv.bcftools_stats.txt:md5,6a4c5f596d407e12449c36fe3419488f", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", @@ -306,7 +306,7 @@ 20, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MANTA_GERMLINE": { "manta": "1.6.0" @@ -454,9 +454,9 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.manta.diploid_sv.bcftools_stats.txt:md5,36a838390faba81e3eabf5ac8a093a4a", - "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,f00cf810d34ef7e5c7980f7039bb4446", - "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7af2ea2e84154ddf2a483b1bd1f0646c", + "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", + "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,7be348c7ec03195c429772b65d768d10", + "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7d7b08cfb7b97ef4949d909d3ed04e88", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -494,7 +494,7 @@ 11, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -620,7 +620,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.manta.tumor_sv.bcftools_stats.txt:md5,9fbe26c75869000b526b59b454f76f6a", + "sample2.manta.tumor_sv.bcftools_stats.txt:md5,6a4c5f596d407e12449c36fe3419488f", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", @@ -647,7 +647,7 @@ 31, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -827,10 +827,10 @@ "samtools-stats-dp.txt:md5,b446a47b182d93a9e7e74f5f7c8d41c2", "samtools_alignment_plot.txt:md5,7138a2d29f515993e1df8d745e27b757", "samtools_insert_size.txt:md5,e0c5f4ebb18a0e6bd437f0b919725b39", - "sample1.manta.diploid_sv.bcftools_stats.txt:md5,636109db283cbee4539786928c811893", - "sample2.manta.tumor_sv.bcftools_stats.txt:md5,9fbe26c75869000b526b59b454f76f6a", - "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,f00cf810d34ef7e5c7980f7039bb4446", - "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7af2ea2e84154ddf2a483b1bd1f0646c", + "sample1.manta.diploid_sv.bcftools_stats.txt:md5,8721040d8aa617f37498e9d89f48d503", + "sample2.manta.tumor_sv.bcftools_stats.txt:md5,6a4c5f596d407e12449c36fe3419488f", + "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,7be348c7ec03195c429772b65d768d10", + "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7d7b08cfb7b97ef4949d909d3ed04e88", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -881,7 +881,7 @@ 22, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -1033,9 +1033,9 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.manta.diploid_sv.bcftools_stats.txt:md5,36a838390faba81e3eabf5ac8a093a4a", - "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,f00cf810d34ef7e5c7980f7039bb4446", - "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7af2ea2e84154ddf2a483b1bd1f0646c", + "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", + "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,7be348c7ec03195c429772b65d768d10", + "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7d7b08cfb7b97ef4949d909d3ed04e88", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -1073,7 +1073,7 @@ 9, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MANTA_GERMLINE": { "manta": "1.6.0" @@ -1195,7 +1195,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.manta.diploid_sv.bcftools_stats.txt:md5,636109db283cbee4539786928c811893", + "sample1.manta.diploid_sv.bcftools_stats.txt:md5,8721040d8aa617f37498e9d89f48d503", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", diff --git a/tests/variant_calling_mpileup.nf.test.snap b/tests/variant_calling_mpileup.nf.test.snap index 2df749fd35..9cf0aebfc4 100644 --- a/tests/variant_calling_mpileup.nf.test.snap +++ b/tests/variant_calling_mpileup.nf.test.snap @@ -4,10 +4,10 @@ 11, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -160,7 +160,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.bcftools.bcftools_stats.txt:md5,3299f97352e32c873c95e43922c79147", + "sample2.bcftools.bcftools_stats.txt:md5,47ce340432efdbb38a86d8b7c3d0c2d4", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", @@ -187,10 +187,10 @@ 9, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -339,7 +339,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.bcftools.bcftools_stats.txt:md5,0659e2f55ea631b8757dd04facc286a1", + "sample1.bcftools.bcftools_stats.txt:md5,81ab4ccc0da202a814b7f99ba5c49bb4", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -366,10 +366,10 @@ 9, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -518,7 +518,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.bcftools.bcftools_stats.txt:md5,cc6063baaf7443b12b3fa1c972e804c8", + "sample2.bcftools.bcftools_stats.txt:md5,4897ad81224f076a9d7054ba865de378", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", @@ -545,10 +545,10 @@ 11, { "BCFTOOLS_MPILEUP": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -701,7 +701,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.bcftools.bcftools_stats.txt:md5,a4865cc7e9dfbea42d098f4bbbc7459d", + "sample1.bcftools.bcftools_stats.txt:md5,51bc17eed97a82f7a4a59d5f8181a1cc", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", diff --git a/tests/variant_calling_muse.nf.test.snap b/tests/variant_calling_muse.nf.test.snap index 15c1b55ede..682969c7b4 100644 --- a/tests/variant_calling_muse.nf.test.snap +++ b/tests/variant_calling_muse.nf.test.snap @@ -4,7 +4,7 @@ 17, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CRAM_TO_BAM": { "samtools": 1.21 @@ -178,7 +178,7 @@ 18, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CRAM_TO_BAM": { "samtools": 1.21 @@ -328,7 +328,7 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample4_vs_sample3.muse.bcftools_stats.txt:md5,09a0d72425a3638cbe8f1cbd254e66f3", + "sample4_vs_sample3.muse.bcftools_stats.txt:md5,78caff99ab648b7191fd74954713aef9", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", diff --git a/tests/variant_calling_mutect2.nf.test.snap b/tests/variant_calling_mutect2.nf.test.snap index c67f562fc4..1046b8b134 100644 --- a/tests/variant_calling_mutect2.nf.test.snap +++ b/tests/variant_calling_mutect2.nf.test.snap @@ -4,7 +4,7 @@ 11, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { "gatk4": "4.6.1.0" @@ -161,7 +161,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.mutect2.bcftools_stats.txt:md5,c275ee76762a37053d43f4e290485af8", + "sample2.mutect2.bcftools_stats.txt:md5,634af596519997cd802fbc8fe290342f", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", @@ -191,7 +191,7 @@ 15, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -365,7 +365,7 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,65bc65858d3dfa1d8913119850626823", + "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,c802eeeaa4ab6531bdb5d8c0b583f8b6", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", @@ -405,7 +405,7 @@ 13, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { "gatk4": "4.6.1.0" @@ -569,7 +569,7 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,65bc65858d3dfa1d8913119850626823", + "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,c802eeeaa4ab6531bdb5d8c0b583f8b6", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.summary.txt:md5,d2775eb102acc5950f7f53883dcb503d", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", @@ -603,7 +603,7 @@ 14, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "BUILD_INTERVALS": { "gawk": "5.3.0" @@ -770,7 +770,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.mutect2.bcftools_stats.txt:md5,c275ee76762a37053d43f4e290485af8", + "sample2.mutect2.bcftools_stats.txt:md5,634af596519997cd802fbc8fe290342f", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.region.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,b0b47739dcafeeb1a9e6218b8abca1e0", diff --git a/tests/variant_calling_sentieon_dnascope.nf.test.snap b/tests/variant_calling_sentieon_dnascope.nf.test.snap index 8b3c2ac350..4b4aa56f68 100644 --- a/tests/variant_calling_sentieon_dnascope.nf.test.snap +++ b/tests/variant_calling_sentieon_dnascope.nf.test.snap @@ -4,7 +4,7 @@ 12, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -163,7 +163,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.dnascope.unfiltered.bcftools_stats.txt:md5,ccd33b2c34ef09efe1fd7a86474eaa53", + "test.dnascope.unfiltered.bcftools_stats.txt:md5,e7e014ba2764fca171a3291c26cca34c", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -190,7 +190,7 @@ 13, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -354,7 +354,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.dnascope.filtered.bcftools_stats.txt:md5,ad4472e0b4767e0f3c4052ff3e3c1cdb", + "test.dnascope.filtered.bcftools_stats.txt:md5,af2789c5de131bbd90b133b9382f506f", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -381,8 +381,11 @@ "content": [ 15, { + "BCFTOOLS_SORT": { + "bcftools": "1.23.1" + }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -550,7 +553,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "joint_germline.bcftools_stats.txt:md5,b66f04fbf0ca30785d07a4d0b4156bb7", + "joint_germline.bcftools_stats.txt:md5,936ca7dc4a8d81cb73a9446057ec4b24", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", diff --git a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap index d1d0391e98..972acd6171 100644 --- a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap @@ -3,8 +3,11 @@ "content": [ 19, { + "BCFTOOLS_SORT": { + "bcftools": "1.23.1" + }, "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -186,7 +189,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "joint_germline_recalibrated_indel.bcftools_stats.txt:md5,f223948705dd87d2edcc6a44ca72df64", + "joint_germline_recalibrated_indel.bcftools_stats.txt:md5,f87581b827c876e433e51e39342379ca", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -217,7 +220,7 @@ 11, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CNNSCOREVARIANTS": { "gatk4": "4.5.0.0" @@ -377,7 +380,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.haplotyper.filtered.bcftools_stats.txt:md5,178ef0aeaef94b9de01a44d833823918", + "test.haplotyper.filtered.bcftools_stats.txt:md5,f4863054921218b7821858f5836029e4", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -405,7 +408,7 @@ 12, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -564,7 +567,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.haplotyper.unfiltered.bcftools_stats.txt:md5,a486e123a1466777f49bab8c854f0e55", + "test.haplotyper.unfiltered.bcftools_stats.txt:md5,69874476b2830366fff35b242dbfdfa5", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", @@ -591,7 +594,7 @@ 14, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CNNSCOREVARIANTS": { "gatk4": "4.5.0.0" @@ -758,7 +761,7 @@ "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", - "test.haplotyper.filtered.bcftools_stats.txt:md5,178ef0aeaef94b9de01a44d833823918", + "test.haplotyper.filtered.bcftools_stats.txt:md5,f4863054921218b7821858f5836029e4", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", diff --git a/tests/variant_calling_strelka.nf.test.snap b/tests/variant_calling_strelka.nf.test.snap index faba08c70a..058077e09f 100644 --- a/tests/variant_calling_strelka.nf.test.snap +++ b/tests/variant_calling_strelka.nf.test.snap @@ -4,7 +4,7 @@ 22, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -188,9 +188,9 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.strelka.variants.bcftools_stats.txt:md5,6d4d032ba146941cb226765aaed9d67f", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,8404ea88658fbc41d447ba20bf46dd0a", + "sample3.strelka.variants.bcftools_stats.txt:md5,2c40e667f6ee75761fe6c3b33dda0679", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,91f318ab5e6b017554f8f72866c6a5bd", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -229,7 +229,7 @@ 11, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -383,7 +383,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.strelka.variants.bcftools_stats.txt:md5,7d091579d450a6f6d6e6ed9795dce0cb", + "sample1.strelka.variants.bcftools_stats.txt:md5,bcb50cfcfefdce0d203aff1d054d9f24", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -411,7 +411,7 @@ 26, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -611,9 +611,9 @@ "samtools-stats-dp.txt:md5,b446a47b182d93a9e7e74f5f7c8d41c2", "samtools_alignment_plot.txt:md5,7138a2d29f515993e1df8d745e27b757", "samtools_insert_size.txt:md5,e0c5f4ebb18a0e6bd437f0b919725b39", - "sample1.strelka.variants.bcftools_stats.txt:md5,7d091579d450a6f6d6e6ed9795dce0cb", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,8404ea88658fbc41d447ba20bf46dd0a", + "sample1.strelka.variants.bcftools_stats.txt:md5,bcb50cfcfefdce0d203aff1d054d9f24", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,91f318ab5e6b017554f8f72866c6a5bd", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -662,7 +662,7 @@ 9, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -812,7 +812,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.strelka.variants.bcftools_stats.txt:md5,a125b261633ee5e73c4c0bfead86c77c", + "sample1.strelka.variants.bcftools_stats.txt:md5,198d97ab341f78b4c33ee345ebdfe5e2", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -840,7 +840,7 @@ 20, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -1020,9 +1020,9 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.strelka.variants.bcftools_stats.txt:md5,322c544c624565a9ab0e128bca556d81", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,eec9d410eb24068b9a67be417c41d54e", + "sample3.strelka.variants.bcftools_stats.txt:md5,9a87ae32f97121c0e033043cd6605f67", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,3cc8ac7236cc77f857f6e56a3efa27f5", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", diff --git a/tests/variant_calling_strelka_bp.nf.test.snap b/tests/variant_calling_strelka_bp.nf.test.snap index b5c6c1d974..043b22d8fe 100644 --- a/tests/variant_calling_strelka_bp.nf.test.snap +++ b/tests/variant_calling_strelka_bp.nf.test.snap @@ -4,7 +4,7 @@ 34, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "MANTA_GERMLINE": { "manta": "1.6.0" @@ -217,12 +217,12 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.manta.diploid_sv.bcftools_stats.txt:md5,36a838390faba81e3eabf5ac8a093a4a", - "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,f00cf810d34ef7e5c7980f7039bb4446", - "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7af2ea2e84154ddf2a483b1bd1f0646c", - "sample3.strelka.variants.bcftools_stats.txt:md5,322c544c624565a9ab0e128bca556d81", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,eec9d410eb24068b9a67be417c41d54e", + "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", + "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,7be348c7ec03195c429772b65d768d10", + "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7d7b08cfb7b97ef4949d909d3ed04e88", + "sample3.strelka.variants.bcftools_stats.txt:md5,9a87ae32f97121c0e033043cd6605f67", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,3cc8ac7236cc77f857f6e56a3efa27f5", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -270,7 +270,7 @@ 36, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -487,12 +487,12 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.manta.diploid_sv.bcftools_stats.txt:md5,36a838390faba81e3eabf5ac8a093a4a", - "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,f00cf810d34ef7e5c7980f7039bb4446", - "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7af2ea2e84154ddf2a483b1bd1f0646c", - "sample3.strelka.variants.bcftools_stats.txt:md5,6d4d032ba146941cb226765aaed9d67f", - "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,62c6123f6494c3cdbd42dc7230e757b3", - "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,8404ea88658fbc41d447ba20bf46dd0a", + "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", + "sample4_vs_sample3.manta.diploid_sv.bcftools_stats.txt:md5,7be348c7ec03195c429772b65d768d10", + "sample4_vs_sample3.manta.somatic_sv.bcftools_stats.txt:md5,7d7b08cfb7b97ef4949d909d3ed04e88", + "sample3.strelka.variants.bcftools_stats.txt:md5,2c40e667f6ee75761fe6c3b33dda0679", + "sample4_vs_sample3.strelka.somatic_indels.bcftools_stats.txt:md5,0092bfd1833160732c4e3180a2a8d54d", + "sample4_vs_sample3.strelka.somatic_snvs.bcftools_stats.txt:md5,91f318ab5e6b017554f8f72866c6a5bd", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", diff --git a/tests/variant_calling_tiddit.nf.test.snap b/tests/variant_calling_tiddit.nf.test.snap index ddcd96719f..40c6991379 100644 --- a/tests/variant_calling_tiddit.nf.test.snap +++ b/tests/variant_calling_tiddit.nf.test.snap @@ -4,7 +4,7 @@ 12, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -135,7 +135,7 @@ "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", - "sample1.tiddit.bcftools_stats.txt:md5,ee25406b8d3ed73eaa8a66972c805c1f", + "sample1.tiddit.bcftools_stats.txt:md5,ce8d4ce1c8fde22cf1557603caa1c4e9", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", @@ -162,7 +162,7 @@ 12, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -293,7 +293,7 @@ "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", - "sample2.tiddit.bcftools_stats.txt:md5,82343c0b28dace889f164bbb256a8461", + "sample2.tiddit.bcftools_stats.txt:md5,f49030d75a44dde7a9d068af09e89c52", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", @@ -320,7 +320,7 @@ 23, { "BCFTOOLS_STATS": { - "bcftools": 1.21 + "bcftools": "1.23.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -476,8 +476,8 @@ "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", - "sample3.tiddit.bcftools_stats.txt:md5,b8a60370884c8f2c94baa7d3e859492f", - "sample4_vs_sample3.tiddit_sv_merge.bcftools_stats.txt:md5,82f123b157211ac9b8d3b145bbea2147", + "sample3.tiddit.bcftools_stats.txt:md5,981a4170dd5a6bd6e5f51bbb169f8a17", + "sample4_vs_sample3.tiddit_sv_merge.bcftools_stats.txt:md5,6d73929bb5b17c93f98eed8db6ac7bc4", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", diff --git a/workflows/sarek.nf b/workflows/sarek.nf index e310725ea8..324c396371 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -273,7 +273,7 @@ workflow SAREK { CRAM_SAMPLEQC( cram_variant_calling, ngscheckmate_bed, - fasta, + fasta.combine(fasta_fai).map { meta_fasta_, fasta_file , _meta_fai, fai -> [meta_fasta_, fasta_file, fai] }.collect(), skip_tools.split(',').contains('baserecalibrator'), intervals_for_preprocessing, ) From 3c7da70814ab7e8ec4996425f0276ecd23fb4272 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Thu, 16 Jul 2026 12:58:42 +0200 Subject: [PATCH 09/27] Migrate local code to lowercase `channel` factory (#2232) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Part of preparing nf-core/sarek for the Nextflow **26.04/26.10** strict-syntax parser. The uppercase `Channel.` factory is deprecated in favour of the lowercase `channel.` factory. This PR replaces **all 438 uppercase `Channel.` occurrences across 42 local files** (`main.nf`, `workflows/`, `subworkflows/local/`, `modules/local/`, incl. `.nf.test` files) with lowercase `channel.`. - Pure mechanical casing change — verified that every added line is identical to its removed counterpart after normalising `Channel.` → `channel.` (no collateral edits). - Channel semantics are unchanged; `channel.empty/of/value/fromPath` behave identically to their uppercase forms. - Vendored `modules/nf-core/` and `subworkflows/nf-core/` are **not** touched (they come via `nf-core ... update`). ### Follow-ups (not in this PR, to keep it single-purpose) Other strict-syntax items surfaced during the audit, tracked separately: - `channel.from` → `channel.of` at `subworkflows/local/prepare_genome/main.nf` (`from` is itself deprecated; casing was applied here but the operator still needs changing). - Implicit closure params (`{ it.foo }` → `{ v -> v.foo }`) — ~29 occurrences. - Remove deprecated `nextflow.enable.configProcessNamesValidation` flag in `nextflow.config`. - `workflow.onComplete`/`onError` in the utils subworkflow — will come via nf-core template sync. ## PR checklist - [x] This comment contains a description of changes (with reason). - [x] `CHANGELOG.md` is updated. - [ ] Make sure your code lints (`nf-core pipelines lint`) — pre-commit (prettier) passes locally; full lint/nf-test left to CI. - [ ] Ensure the test suite passes — deferred to CI (mechanical change, semantically equivalent). 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: Maxime U Garcia --- CHANGELOG.md | 1 + .../local/bam_baserecalibrator/main.nf | 2 +- .../local/bam_baserecalibrator_spark/main.nf | 2 +- .../local/bam_convert_samtools/main.nf | 2 +- .../bam_joint_calling_germline_gatk/main.nf | 2 +- .../main.nf | 2 +- subworkflows/local/bam_markduplicates/main.nf | 4 +- .../local/bam_markduplicates_spark/main.nf | 4 +- .../local/bam_merge_index_samtools/main.nf | 2 +- subworkflows/local/bam_sentieon_dedup/main.nf | 4 +- .../local/bam_variant_calling_cnvkit/main.nf | 2 +- .../bam_variant_calling_deepvariant/main.nf | 6 +- .../bam_variant_calling_freebayes/main.nf | 2 +- .../bam_variant_calling_germline_all/main.nf | 50 +-- .../main.nf | 2 +- .../main.nf | 10 +- .../bam_variant_calling_indexcov/main.nf | 2 +- .../local/bam_variant_calling_mpileup/main.nf | 2 +- .../main.nf | 16 +- .../main.nf | 16 +- .../main.nf | 6 +- .../bam_variant_calling_somatic_ascat/main.nf | 2 +- .../bam_variant_calling_somatic_manta/main.nf | 6 +- .../main.nf | 20 +- .../main.nf | 6 +- .../main.nf | 2 +- .../main.nf | 6 +- .../main.nf | 36 +- .../main.nf | 6 +- .../main.nf | 2 +- .../main.nf | 18 +- .../main.nf | 6 +- .../local/cram_qc_mosdepth_samtools/main.nf | 4 +- .../post_variantcalling/tests/main.nf.test | 350 +++++++++--------- subworkflows/local/prepare_genome/main.nf | 90 ++--- .../prepare_genome/tests/bbsplit.nf.test | 130 +++---- subworkflows/local/prepare_intervals/main.nf | 16 +- .../local/prepare_reference_cnvkit/main.nf | 2 +- .../samplesheet_to_channel/tests/main.nf.test | 2 +- subworkflows/local/vcf_consensus/main.nf | 2 +- .../local/vcf_qc_bcftools_vcftools/main.nf | 2 +- .../local/vcf_variant_filtering_gatk/main.nf | 2 +- 42 files changed, 425 insertions(+), 424 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 118d50347a..f4e56870f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2210](https://github.com/nf-core/sarek/pull/2210) - Update bcftools to 1.23.1 - [#2229](https://github.com/nf-core/sarek/pull/2229) - Update EnsemblVEP to 116.0 +- [#2232](https://github.com/nf-core/sarek/pull/2232) - Migrate local code to the lowercase `channel` factory for Nextflow strict-syntax / 26.x readiness ### Fixed diff --git a/subworkflows/local/bam_baserecalibrator/main.nf b/subworkflows/local/bam_baserecalibrator/main.nf index 9535c6463e..70563ab461 100644 --- a/subworkflows/local/bam_baserecalibrator/main.nf +++ b/subworkflows/local/bam_baserecalibrator/main.nf @@ -18,7 +18,7 @@ workflow BAM_BASERECALIBRATOR { known_sites_tbi // channel: [optional] [ known_sites_tbi ] main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) diff --git a/subworkflows/local/bam_baserecalibrator_spark/main.nf b/subworkflows/local/bam_baserecalibrator_spark/main.nf index 98f597ff43..26a881b313 100644 --- a/subworkflows/local/bam_baserecalibrator_spark/main.nf +++ b/subworkflows/local/bam_baserecalibrator_spark/main.nf @@ -18,7 +18,7 @@ workflow BAM_BASERECALIBRATOR_SPARK { known_sites_tbi // channel: [optional] [ known_sites_tbi ] main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) diff --git a/subworkflows/local/bam_convert_samtools/main.nf b/subworkflows/local/bam_convert_samtools/main.nf index c20001d087..d101f34b45 100644 --- a/subworkflows/local/bam_convert_samtools/main.nf +++ b/subworkflows/local/bam_convert_samtools/main.nf @@ -19,7 +19,7 @@ workflow BAM_CONVERT_SAMTOOLS { interleaved // value: true/false main: - versions = Channel.empty() + versions = channel.empty() // Index File if not PROVIDED -> this also requires updates to samtools view possibly URGH diff --git a/subworkflows/local/bam_joint_calling_germline_gatk/main.nf b/subworkflows/local/bam_joint_calling_germline_gatk/main.nf index ef4a4426ed..d7d04fc094 100644 --- a/subworkflows/local/bam_joint_calling_germline_gatk/main.nf +++ b/subworkflows/local/bam_joint_calling_germline_gatk/main.nf @@ -31,7 +31,7 @@ workflow BAM_JOINT_CALLING_GERMLINE_GATK { known_snps_vqsr main: - versions = Channel.empty() + versions = channel.empty() // Map input for GenomicsDBImport // Rename based on num_intervals, group all samples by their interval_name/interval_file and restructure for channel diff --git a/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf b/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf index 3816a2470f..a364876c6b 100644 --- a/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf +++ b/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf @@ -30,7 +30,7 @@ workflow BAM_JOINT_CALLING_GERMLINE_SENTIEON { variant_caller main: - versions = Channel.empty() + versions = channel.empty() sentieon_input = input .map{ meta, gvcf, tbi, intervals -> [ [ id:'joint_variant_calling', intervals_name:intervals.baseName, num_intervals:meta.num_intervals ], gvcf, tbi, intervals ] } diff --git a/subworkflows/local/bam_markduplicates/main.nf b/subworkflows/local/bam_markduplicates/main.nf index cd9973b837..baed8ec73e 100644 --- a/subworkflows/local/bam_markduplicates/main.nf +++ b/subworkflows/local/bam_markduplicates/main.nf @@ -15,8 +15,8 @@ workflow BAM_MARKDUPLICATES { intervals_bed_combined // channel: [optional] [ intervals_bed ] main: - versions = Channel.empty() - reports = Channel.empty() + versions = channel.empty() + reports = channel.empty() // RUN MARKUPDUPLICATES // --CREATE_INDEX true is set via ext.args when --save_output_as_bam, so the diff --git a/subworkflows/local/bam_markduplicates_spark/main.nf b/subworkflows/local/bam_markduplicates_spark/main.nf index cc0a7167ce..e897b6088b 100644 --- a/subworkflows/local/bam_markduplicates_spark/main.nf +++ b/subworkflows/local/bam_markduplicates_spark/main.nf @@ -18,8 +18,8 @@ workflow BAM_MARKDUPLICATES_SPARK { intervals_bed_combined // channel: [optional] intervals_bed main: - versions = Channel.empty() - reports = Channel.empty() + versions = channel.empty() + reports = channel.empty() // RUN MARKUPDUPLICATES SPARK GATK4SPARK_MARKDUPLICATES(bam, fasta.map{ meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ meta, fasta_fai_ -> [ fasta_fai_ ] }, dict.map{ meta, dict_ -> [ dict_ ] }) diff --git a/subworkflows/local/bam_merge_index_samtools/main.nf b/subworkflows/local/bam_merge_index_samtools/main.nf index d8b1657a00..61d252d226 100644 --- a/subworkflows/local/bam_merge_index_samtools/main.nf +++ b/subworkflows/local/bam_merge_index_samtools/main.nf @@ -12,7 +12,7 @@ workflow BAM_MERGE_INDEX_SAMTOOLS { bam // channel: [mandatory] meta, bam main: - versions = Channel.empty() + versions = channel.empty() // Figuring out if there is one or more bam(s) from the same sample bam_to_merge = bam.branch{ meta, bam_ -> diff --git a/subworkflows/local/bam_sentieon_dedup/main.nf b/subworkflows/local/bam_sentieon_dedup/main.nf index b15f7dc32b..33ffffd79d 100644 --- a/subworkflows/local/bam_sentieon_dedup/main.nf +++ b/subworkflows/local/bam_sentieon_dedup/main.nf @@ -13,8 +13,8 @@ workflow BAM_SENTIEON_DEDUP { intervals_bed_combined // channel: [optional] [ intervals_bed ] main: - versions = Channel.empty() - reports = Channel.empty() + versions = channel.empty() + reports = channel.empty() bam = bam.map{ meta, bam_ -> [ meta - meta.subMap('data_type'), bam_ ] } bai = bai.map{ meta, bai_ -> [ meta - meta.subMap('data_type'), bai_ ] } diff --git a/subworkflows/local/bam_variant_calling_cnvkit/main.nf b/subworkflows/local/bam_variant_calling_cnvkit/main.nf index 20d0fe3fd1..2567f0042c 100644 --- a/subworkflows/local/bam_variant_calling_cnvkit/main.nf +++ b/subworkflows/local/bam_variant_calling_cnvkit/main.nf @@ -18,7 +18,7 @@ workflow BAM_VARIANT_CALLING_CNVKIT { reference // channel: [optional] meta, cnn main: - versions = Channel.empty() + versions = channel.empty() generate_pon = false CNVKIT_BATCH(cram, fasta, fasta_fai, targets, reference, generate_pon) diff --git a/subworkflows/local/bam_variant_calling_deepvariant/main.nf b/subworkflows/local/bam_variant_calling_deepvariant/main.nf index aadb816710..9047358866 100644 --- a/subworkflows/local/bam_variant_calling_deepvariant/main.nf +++ b/subworkflows/local/bam_variant_calling_deepvariant/main.nf @@ -55,16 +55,16 @@ workflow BAM_VARIANT_CALLING_DEEPVARIANT { } // Mix intervals and no_intervals channels together - gvcf = Channel.empty().mix(MERGE_DEEPVARIANT_GVCF.out.vcf, gvcf_out.no_intervals) + gvcf = channel.empty().mix(MERGE_DEEPVARIANT_GVCF.out.vcf, gvcf_out.no_intervals) // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'deepvariant' ], vcf ] } // Mix intervals and no_intervals channels together - vcf = Channel.empty().mix(MERGE_DEEPVARIANT_VCF.out.vcf, vcf_out.no_intervals) + vcf = channel.empty().mix(MERGE_DEEPVARIANT_VCF.out.vcf, vcf_out.no_intervals) // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'deepvariant' ], vcf ] } - tbi = Channel.empty().mix(MERGE_DEEPVARIANT_VCF.out.tbi, tbi_out.no_intervals) + tbi = channel.empty().mix(MERGE_DEEPVARIANT_VCF.out.tbi, tbi_out.no_intervals) // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'deepvariant' ], tbi ] } diff --git a/subworkflows/local/bam_variant_calling_freebayes/main.nf b/subworkflows/local/bam_variant_calling_freebayes/main.nf index 4708d06750..a078c157a7 100644 --- a/subworkflows/local/bam_variant_calling_freebayes/main.nf +++ b/subworkflows/local/bam_variant_calling_freebayes/main.nf @@ -20,7 +20,7 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { ch_intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = ch_cram.combine(ch_intervals) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 5da093ab4b..7e9b5c9469 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -52,31 +52,31 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { sentieon_dnascope_model // channel: [mandatory] value channel with string main: - versions = Channel.empty() + versions = channel.empty() //TODO: Temporary until the if's can be removed and printing to terminal is prevented with "when" in the modules.config - gvcf_sentieon_dnascope = Channel.empty() - gvcf_sentieon_haplotyper = Channel.empty() - - out_indexcov = Channel.empty() - vcf_deepvariant = Channel.empty() - vcf_freebayes = Channel.empty() - vcf_haplotypecaller = Channel.empty() - vcf_manta = Channel.empty() - vcf_mpileup = Channel.empty() - vcf_sentieon_dnascope = Channel.empty() - vcf_sentieon_haplotyper = Channel.empty() - vcf_strelka = Channel.empty() - vcf_tiddit = Channel.empty() - tbi_deepvariant = Channel.empty() - tbi_freebayes = Channel.empty() - tbi_haplotypecaller = Channel.empty() - tbi_manta = Channel.empty() - tbi_mpileup = Channel.empty() - tbi_sentieon_dnascope = Channel.empty() - tbi_sentieon_haplotyper = Channel.empty() - tbi_strelka = Channel.empty() - tbi_tiddit = Channel.empty() + gvcf_sentieon_dnascope = channel.empty() + gvcf_sentieon_haplotyper = channel.empty() + + out_indexcov = channel.empty() + vcf_deepvariant = channel.empty() + vcf_freebayes = channel.empty() + vcf_haplotypecaller = channel.empty() + vcf_manta = channel.empty() + vcf_mpileup = channel.empty() + vcf_sentieon_dnascope = channel.empty() + vcf_sentieon_haplotyper = channel.empty() + vcf_strelka = channel.empty() + vcf_tiddit = channel.empty() + tbi_deepvariant = channel.empty() + tbi_freebayes = channel.empty() + tbi_haplotypecaller = channel.empty() + tbi_manta = channel.empty() + tbi_mpileup = channel.empty() + tbi_sentieon_dnascope = channel.empty() + tbi_sentieon_haplotyper = channel.empty() + tbi_strelka = channel.empty() + tbi_tiddit = channel.empty() // BCFTOOLS MPILEUP if (tools && tools.split(',').contains('mpileup')) { @@ -373,7 +373,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { versions = versions.mix(BAM_VARIANT_CALLING_SINGLE_TIDDIT.out.versions) } - vcf_all = Channel.empty().mix( + vcf_all = channel.empty().mix( vcf_deepvariant, vcf_freebayes, vcf_sentieon_dnascope, @@ -385,7 +385,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_tiddit ) - tbi_all = Channel.empty().mix( + tbi_all = channel.empty().mix( tbi_deepvariant, tbi_freebayes, tbi_sentieon_dnascope, diff --git a/subworkflows/local/bam_variant_calling_germline_manta/main.nf b/subworkflows/local/bam_variant_calling_germline_manta/main.nf index be68cc9114..1c086ec6ca 100644 --- a/subworkflows/local/bam_variant_calling_germline_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_manta/main.nf @@ -15,7 +15,7 @@ workflow BAM_VARIANT_CALLING_GERMLINE_MANTA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi] or [ [], []] if no intervals; intervals file contains all intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals, account for 0 intervals cram_intervals = cram.combine(intervals).map{ it -> diff --git a/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf b/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf index d2555144c9..c700d29cfd 100644 --- a/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf +++ b/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf @@ -19,10 +19,10 @@ workflow BAM_VARIANT_CALLING_HAPLOTYPECALLER { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() - vcf = Channel.empty() - realigned_bam = Channel.empty() + vcf = channel.empty() + realigned_bam = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) @@ -75,11 +75,11 @@ workflow BAM_VARIANT_CALLING_HAPLOTYPECALLER { // Only when using intervals MERGE_HAPLOTYPECALLER(haplotypecaller_vcf.intervals.map{ meta, vcf_ -> [ groupKey(meta, meta.num_intervals), vcf_ ] }.groupTuple(), dict) - haplotypecaller_vcf = Channel.empty().mix( + haplotypecaller_vcf = channel.empty().mix( MERGE_HAPLOTYPECALLER.out.vcf, haplotypecaller_vcf.no_intervals) - haplotypecaller_tbi = Channel.empty().mix( + haplotypecaller_tbi = channel.empty().mix( MERGE_HAPLOTYPECALLER.out.tbi, haplotypecaller_tbi.no_intervals) diff --git a/subworkflows/local/bam_variant_calling_indexcov/main.nf b/subworkflows/local/bam_variant_calling_indexcov/main.nf index d1bc9f39a9..2f13b44f56 100644 --- a/subworkflows/local/bam_variant_calling_indexcov/main.nf +++ b/subworkflows/local/bam_variant_calling_indexcov/main.nf @@ -15,7 +15,7 @@ workflow BAM_VARIANT_CALLING_INDEXCOV { fasta_fai // channel: [mandatory] [ meta, fasta_fai ] main: - versions = Channel.empty() + versions = channel.empty() // generate a cleaner bam index without duplicate, supplementary, etc. (Small workload because the bam itself is not re-generated) reindex_ch = SAMTOOLS_REINDEX_BAM( diff --git a/subworkflows/local/bam_variant_calling_mpileup/main.nf b/subworkflows/local/bam_variant_calling_mpileup/main.nf index 5e21480c21..1c601a4993 100644 --- a/subworkflows/local/bam_variant_calling_mpileup/main.nf +++ b/subworkflows/local/bam_variant_calling_mpileup/main.nf @@ -18,7 +18,7 @@ workflow BAM_VARIANT_CALLING_MPILEUP { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram diff --git a/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf b/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf index fb409dd4d1..92570194dd 100644 --- a/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf +++ b/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf @@ -24,11 +24,11 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { sentieon_dnascope_model // channel main: - versions = Channel.empty() + versions = channel.empty() - gvcf = Channel.empty() - vcf = Channel.empty() - genotype_intervals = Channel.empty() + gvcf = channel.empty() + vcf = channel.empty() + genotype_intervals = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals_for_sentieon = cram.combine(intervals) @@ -114,11 +114,11 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { // Only when using intervals MERGE_SENTIEON_DNASCOPE_VCFS(vcfs_for_merging, dict) - dnascope_vcf = Channel.empty().mix( + dnascope_vcf = channel.empty().mix( MERGE_SENTIEON_DNASCOPE_VCFS.out.vcf, dnascope_vcf_branch.no_intervals) - haplotyper_tbi = Channel.empty().mix( + haplotyper_tbi = channel.empty().mix( MERGE_SENTIEON_DNASCOPE_VCFS.out.tbi, dnascope_vcf_tbi_branch.no_intervals) @@ -134,11 +134,11 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { MERGE_SENTIEON_DNASCOPE_GVCFS(gvcfs_for_merging, dict) - gvcf = Channel.empty().mix( + gvcf = channel.empty().mix( MERGE_SENTIEON_DNASCOPE_GVCFS.out.vcf, haplotyper_gvcf_branch.no_intervals) - gvcf_tbi = Channel.empty().mix( + gvcf_tbi = channel.empty().mix( MERGE_SENTIEON_DNASCOPE_GVCFS.out.tbi, haplotyper_gvcf_tbi_branch.no_intervals) diff --git a/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf b/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf index cf30aaaf30..a2aba1ade3 100644 --- a/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf +++ b/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf @@ -22,11 +22,11 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { sentieon_haplotyper_emit_mode main: - versions = Channel.empty() + versions = channel.empty() - gvcf = Channel.empty() - vcf = Channel.empty() - genotype_intervals = Channel.empty() + gvcf = channel.empty() + vcf = channel.empty() + genotype_intervals = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals_for_sentieon = cram.combine(intervals) @@ -111,11 +111,11 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { // Only when using intervals MERGE_SENTIEON_HAPLOTYPER_VCFS(vcfs_for_merging, dict) - haplotyper_vcf = Channel.empty().mix( + haplotyper_vcf = channel.empty().mix( MERGE_SENTIEON_HAPLOTYPER_VCFS.out.vcf, haplotyper_vcf_branch.no_intervals) - haplotyper_tbi = Channel.empty().mix( + haplotyper_tbi = channel.empty().mix( MERGE_SENTIEON_HAPLOTYPER_VCFS.out.tbi, haplotyper_vcf_tbi_branch.no_intervals) @@ -131,11 +131,11 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { MERGE_SENTIEON_HAPLOTYPER_GVCFS(gvcfs_for_merging, dict) - gvcf = Channel.empty().mix( + gvcf = channel.empty().mix( MERGE_SENTIEON_HAPLOTYPER_GVCFS.out.vcf, haplotyper_gvcf_branch.no_intervals) - gvcf_tbi = Channel.empty().mix( + gvcf_tbi = channel.empty().mix( MERGE_SENTIEON_HAPLOTYPER_GVCFS.out.tbi, haplotyper_gvcf_tbi_branch.no_intervals) diff --git a/subworkflows/local/bam_variant_calling_single_strelka/main.nf b/subworkflows/local/bam_variant_calling_single_strelka/main.nf index 2255a1bbda..6c469651e2 100644 --- a/subworkflows/local/bam_variant_calling_single_strelka/main.nf +++ b/subworkflows/local/bam_variant_calling_single_strelka/main.nf @@ -17,7 +17,7 @@ workflow BAM_VARIANT_CALLING_SINGLE_STRELKA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi, num_intervals ] or [ [], [], 0 ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) @@ -56,11 +56,11 @@ workflow BAM_VARIANT_CALLING_SINGLE_STRELKA { // Mix intervals and no_intervals channels together // Only strelka variant vcf should get annotated - vcf = Channel.empty().mix(MERGE_STRELKA.out.vcf, vcf_out.no_intervals) + vcf = channel.empty().mix(MERGE_STRELKA.out.vcf, vcf_out.no_intervals) // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], vcf ] } - tbi = Channel.empty().mix(MERGE_STRELKA.out.tbi, tbi_out.no_intervals) + tbi = channel.empty().mix(MERGE_STRELKA.out.tbi, tbi_out.no_intervals) // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], tbi ] } diff --git a/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf b/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf index 22802cfb58..f771726eed 100644 --- a/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf @@ -19,7 +19,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ASCAT { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() ASCAT(cram_pair, allele_files, loci_files, intervals_bed, fasta, gc_file, rt_file) diff --git a/subworkflows/local/bam_variant_calling_somatic_manta/main.nf b/subworkflows/local/bam_variant_calling_somatic_manta/main.nf index 4d1edfaf59..e4ab083fca 100644 --- a/subworkflows/local/bam_variant_calling_somatic_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_manta/main.nf @@ -14,7 +14,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MANTA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi ] or [ [], [] ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals, account for 0 intervals cram_intervals = cram.combine(intervals).map{ it -> @@ -36,8 +36,8 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MANTA { // Only diploid and somatic SV should get annotated // add variantcaller to meta map - vcf = Channel.empty().mix(diploid_sv_vcf, somatic_sv_vcf).map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } - tbi = Channel.empty().mix(diploid_sv_vcf_tbi, somatic_sv_vcf_tbi).map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + vcf = channel.empty().mix(diploid_sv_vcf, somatic_sv_vcf).map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + tbi = channel.empty().mix(diploid_sv_vcf_tbi, somatic_sv_vcf_tbi).map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } versions = versions.mix(MANTA_SOMATIC.out.versions) diff --git a/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf b/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf index 95e7397f37..e8e9dea649 100644 --- a/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf @@ -28,10 +28,10 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { joint_mutect2 // boolean: [mandatory] [default: false] run mutect2 in joint mode main: - versions = Channel.empty() + versions = channel.empty() // If no germline resource is provided, then create an empty channel to avoid GetPileupsummaries from being run - // Handle Channel.value([]) input from prepare_genome by converting to proper empty channel + // Handle channel.value([]) input from prepare_genome by converting to proper empty channel germline_resource_pileup = germline_resource.filter { it != [] } germline_resource_pileup_tbi = germline_resource_tbi.filter { it != [] } @@ -100,22 +100,22 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { MERGEMUTECTSTATS(stats_to_merge) // Mix intervals and no_intervals channels together and remove no longer necessary field: normal_id, tumor_id, num_intervals - vcf = Channel.empty() + vcf = channel.empty() .mix(MERGE_MUTECT2.out.vcf, vcf_branch.no_intervals) .map { meta, vcf -> [joint_mutect2 ? meta - meta.subMap('normal_id', 'num_intervals') : meta - meta.subMap('num_intervals'), vcf] } - tbi = Channel.empty() + tbi = channel.empty() .mix(MERGE_MUTECT2.out.tbi, tbi_branch.no_intervals) .map { meta, tbi -> [joint_mutect2 ? meta - meta.subMap('normal_id', 'num_intervals') : meta - meta.subMap('num_intervals'), tbi] } - stats = Channel.empty() + stats = channel.empty() .mix(MERGEMUTECTSTATS.out.stats, stats_branch.no_intervals) .map { meta, stats -> [joint_mutect2 ? meta - meta.subMap('normal_id', 'num_intervals') : meta - meta.subMap('num_intervals'), stats] } - f1r2 = Channel.empty() + f1r2 = channel.empty() .mix(f1r2_to_merge, f1r2_branch.no_intervals) .map { meta, f1r2 -> [joint_mutect2 ? meta - meta.subMap('normal_id', 'num_intervals') : meta - meta.subMap('num_intervals'), f1r2] @@ -162,8 +162,8 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { // Do some channel magic to generate tumor-normal pairs again. // This is necessary because we generated one normal pileup summary for each patient but we need run calculate contamination for each tumor-normal pair. - pileup_table_tumor = Channel.empty().mix(GATHERPILEUPSUMMARIES_TUMOR.out.table, pileup_table_tumor_branch.no_intervals).map { meta, table -> [meta - meta.subMap('normal_id', 'tumor_id', 'num_intervals') + [id: meta.patient], meta.id, table] } - pileup_table_normal = Channel.empty().mix(GATHERPILEUPSUMMARIES_NORMAL.out.table, pileup_table_normal_branch.no_intervals).map { meta, table -> [meta - meta.subMap('normal_id', 'tumor_id', 'num_intervals') + [id: meta.patient], meta.id, table] } + pileup_table_tumor = channel.empty().mix(GATHERPILEUPSUMMARIES_TUMOR.out.table, pileup_table_tumor_branch.no_intervals).map { meta, table -> [meta - meta.subMap('normal_id', 'tumor_id', 'num_intervals') + [id: meta.patient], meta.id, table] } + pileup_table_normal = channel.empty().mix(GATHERPILEUPSUMMARIES_NORMAL.out.table, pileup_table_normal_branch.no_intervals).map { meta, table -> [meta - meta.subMap('normal_id', 'tumor_id', 'num_intervals') + [id: meta.patient], meta.id, table] } ch_calculatecontamination_in_tables = pileup_table_tumor .combine( @@ -183,8 +183,8 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { CALCULATECONTAMINATION(ch_calculatecontamination_in_tables) // Initialize empty channel: Contamination calculation is run on pileup table, pileup is not run if germline resource is not provided - calculatecontamination_out_seg = Channel.empty() - calculatecontamination_out_cont = Channel.empty() + calculatecontamination_out_seg = channel.empty() + calculatecontamination_out_cont = channel.empty() if (joint_mutect2) { // Reduce the meta to only patient name diff --git a/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf b/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf index 7a983af722..eb960e5131 100644 --- a/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf @@ -17,7 +17,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_STRELKA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi, num_intervals ] or [ [], [], 0 ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) @@ -62,11 +62,11 @@ workflow BAM_VARIANT_CALLING_SOMATIC_STRELKA { } // Mix intervals and no_intervals channels together - vcf = Channel.empty().mix(MERGE_STRELKA_INDELS.out.vcf, MERGE_STRELKA_SNVS.out.vcf, vcf_indels.no_intervals, vcf_snvs.no_intervals) + vcf = channel.empty().mix(MERGE_STRELKA_INDELS.out.vcf, MERGE_STRELKA_SNVS.out.vcf, vcf_indels.no_intervals, vcf_snvs.no_intervals) // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], vcf ] } - tbi = Channel.empty().mix(MERGE_STRELKA_INDELS.out.tbi, MERGE_STRELKA_SNVS.out.tbi, tbi_indels.no_intervals, tbi_snvs.no_intervals) + tbi = channel.empty().mix(MERGE_STRELKA_INDELS.out.tbi, MERGE_STRELKA_SNVS.out.tbi, tbi_indels.no_intervals, tbi_snvs.no_intervals) // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], tbi ] } diff --git a/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf b/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf index f768c42791..30eed94927 100644 --- a/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf @@ -17,7 +17,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_TIDDIT { main: - versions = Channel.empty() + versions = channel.empty() TIDDIT_NORMAL(cram_normal, fasta, bwa) TIDDIT_TUMOR(cram_tumor, fasta, bwa) diff --git a/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf b/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf index 7a306fffa3..8f0e083a59 100644 --- a/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf @@ -19,7 +19,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_TNSCOPE { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine input and intervals for spread and gather strategy input_intervals = input.combine(intervals) @@ -57,11 +57,11 @@ workflow BAM_VARIANT_CALLING_SOMATIC_TNSCOPE { // Mix intervals and no_intervals channels together // Remove unnecessary metadata and add variantcaller - vcf = Channel.empty() + vcf = channel.empty() .mix(MERGE_TNSCOPE.out.vcf, vcf_branch.no_intervals) .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'sentieon_tnscope' ], vcf ] } - index = Channel.empty() + index = channel.empty() .mix(MERGE_TNSCOPE.out.tbi, tbi_branch.no_intervals) .map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'sentieon_tnscope' ], tbi ] } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 0613a74b8b..1a478957b1 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -45,26 +45,26 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { // Channels are often remapped to match module/subworkflow // Gather all versions - versions = Channel.empty() + versions = channel.empty() //TODO: Temporary until the if's can be removed and printing to terminal is prevented with "when" in the modules.config - out_msisensor2 = Channel.empty() - vcf_freebayes = Channel.empty() - vcf_lofreq = Channel.empty() - vcf_manta = Channel.empty() - vcf_mpileup = Channel.empty() - vcf_mutect2 = Channel.empty() - vcf_tiddit = Channel.empty() - vcf_tnscope = Channel.empty() + out_msisensor2 = channel.empty() + vcf_freebayes = channel.empty() + vcf_lofreq = channel.empty() + vcf_manta = channel.empty() + vcf_mpileup = channel.empty() + vcf_mutect2 = channel.empty() + vcf_tiddit = channel.empty() + vcf_tnscope = channel.empty() // Initialize empty TBI channels - tbi_freebayes = Channel.empty() - tbi_lofreq = Channel.empty() - tbi_manta = Channel.empty() - tbi_mpileup = Channel.empty() - tbi_mutect2 = Channel.empty() - tbi_tiddit = Channel.empty() - tbi_tnscope = Channel.empty() + tbi_freebayes = channel.empty() + tbi_lofreq = channel.empty() + tbi_manta = channel.empty() + tbi_mpileup = channel.empty() + tbi_mutect2 = channel.empty() + tbi_tiddit = channel.empty() + tbi_tnscope = channel.empty() // MPILEUP if (tools && tools.split(',').contains('mpileup') || tools.split(',').contains('controlfreec')) { @@ -218,7 +218,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE.out.versions) } - vcf_all = Channel.empty() + vcf_all = channel.empty() .mix( vcf_freebayes, vcf_lofreq, @@ -229,7 +229,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { vcf_tnscope, ) - tbi_all = Channel.empty() + tbi_all = channel.empty() .mix( tbi_freebayes, tbi_lofreq, diff --git a/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf index 681232a39b..702d6361c8 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf @@ -10,7 +10,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ { dict // channel: /path/to/reference/fasta/dictionary main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals for spread and gather strategy input_intervals = input.combine(intervals) @@ -40,8 +40,8 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ { // Mix intervals and no_intervals channels together // Remove unnecessary metadata - vcf = Channel.empty().mix(MERGE_LOFREQ.out.vcf, vcf_branch.no_intervals).map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'lofreq' ], vcf ] } - tbi = Channel.empty().mix(MERGE_LOFREQ.out.tbi, tbi_branch.no_intervals).map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'lofreq' ], tbi ] } + vcf = channel.empty().mix(MERGE_LOFREQ.out.vcf, vcf_branch.no_intervals).map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'lofreq' ], vcf ] } + tbi = channel.empty().mix(MERGE_LOFREQ.out.tbi, tbi_branch.no_intervals).map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'lofreq' ], tbi ] } versions = versions.mix(LOFREQ.out.versions) diff --git a/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf index b451c3962d..9fc89e931c 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf @@ -15,7 +15,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi ] or [ [], [] ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine cram and intervals, account for 0 intervals cram_intervals = cram.combine(intervals).map{ it -> diff --git a/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf index f3228c9a86..bfd4c278ac 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf @@ -27,10 +27,10 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { joint_mutect2 // boolean: [mandatory] [default: false] run mutect2 in joint mode main: - versions = Channel.empty() + versions = channel.empty() // If no germline resource is provided, then create an empty channel to avoid GetPileupsummaries from being run - // Handle Channel.value([]) input from prepare_genome by converting to proper empty channel + // Handle channel.value([]) input from prepare_genome by converting to proper empty channel germline_resource_pileup = germline_resource.filter { it != [] } germline_resource_pileup_tbi = germline_resource_tbi.filter { it != [] } @@ -91,10 +91,10 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { // Mix intervals and no_intervals channels together // Remove unnecessary metadata - vcf = Channel.empty().mix(MERGE_MUTECT2.out.vcf, vcf_branch.no_intervals).map { meta, vcf -> [meta - meta.subMap('num_intervals'), vcf] } - tbi = Channel.empty().mix(MERGE_MUTECT2.out.tbi, tbi_branch.no_intervals).map { meta, tbi -> [meta - meta.subMap('num_intervals'), tbi] } - stats = Channel.empty().mix(MERGEMUTECTSTATS.out.stats, stats_branch.no_intervals).map { meta, stats -> [meta - meta.subMap('num_intervals'), stats] } - f1r2 = Channel.empty().mix(f1r2_to_merge, f1r2_branch.no_intervals).map { meta, f1r2 -> [meta - meta.subMap('num_intervals'), f1r2] } + vcf = channel.empty().mix(MERGE_MUTECT2.out.vcf, vcf_branch.no_intervals).map { meta, vcf -> [meta - meta.subMap('num_intervals'), vcf] } + tbi = channel.empty().mix(MERGE_MUTECT2.out.tbi, tbi_branch.no_intervals).map { meta, tbi -> [meta - meta.subMap('num_intervals'), tbi] } + stats = channel.empty().mix(MERGEMUTECTSTATS.out.stats, stats_branch.no_intervals).map { meta, stats -> [meta - meta.subMap('num_intervals'), stats] } + f1r2 = channel.empty().mix(f1r2_to_merge, f1r2_branch.no_intervals).map { meta, f1r2 -> [meta - meta.subMap('num_intervals'), f1r2] } // Generate artifactpriors using learnreadorientationmodel on the f1r2 output of mutect2 LEARNREADORIENTATIONMODEL(f1r2) @@ -116,14 +116,14 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { GATHERPILEUPSUMMARIES(pileup_table_to_merge, dict.map { _meta, dict_ -> [dict_] }) // Mix intervals and no_intervals channels together - pileup_table = Channel.empty().mix(GATHERPILEUPSUMMARIES.out.table, pileup_table_branch.no_intervals).map { meta, table -> [meta - meta.subMap('num_intervals') + [id: meta.sample], table] } + pileup_table = channel.empty().mix(GATHERPILEUPSUMMARIES.out.table, pileup_table_branch.no_intervals).map { meta, table -> [meta - meta.subMap('num_intervals') + [id: meta.sample], table] } // Contamination and segmentation tables created using calculatecontamination on the pileup summary table CALCULATECONTAMINATION(pileup_table.map { meta, table -> [meta, table, []] }) // Initialize empty channel: Contamination calculation is run on pileup table, pileup is not run if germline resource is not provided - calculatecontamination_out_seg = Channel.empty() - calculatecontamination_out_cont = Channel.empty() + calculatecontamination_out_seg = channel.empty() + calculatecontamination_out_cont = channel.empty() if (joint_mutect2) { // Group tables by samples diff --git a/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf index 4f86b0d2c4..91ec26a72b 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf @@ -19,7 +19,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = Channel.empty() + versions = channel.empty() // Combine input and intervals for spread and gather strategy input_intervals = input.combine(intervals) @@ -57,11 +57,11 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE { // Mix intervals and no_intervals channels together // Remove unnecessary metadata and add variantcaller - vcf = Channel.empty() + vcf = channel.empty() .mix(MERGE_TNSCOPE.out.vcf, vcf_branch.no_intervals) .map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'sentieon_tnscope' ], vcf ] } - index = Channel.empty() + index = channel.empty() .mix(MERGE_TNSCOPE.out.tbi, tbi_branch.no_intervals) .map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'sentieon_tnscope' ], tbi ] } diff --git a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf index e53e69360e..02985a7939 100644 --- a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf +++ b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf @@ -14,8 +14,8 @@ workflow CRAM_QC_MOSDEPTH_SAMTOOLS { intervals main: - versions = Channel.empty() - reports = Channel.empty() + versions = channel.empty() + reports = channel.empty() // Reports run on cram SAMTOOLS_STATS(cram, fasta) diff --git a/subworkflows/local/post_variantcalling/tests/main.nf.test b/subworkflows/local/post_variantcalling/tests/main.nf.test index b19b1117e9..934420065d 100644 --- a/subworkflows/local/post_variantcalling/tests/main.nf.test +++ b/subworkflows/local/post_variantcalling/tests/main.nf.test @@ -19,15 +19,15 @@ nextflow_workflow { cram_germline = [[:],[]] germline_vcfs = channel.of([[id: 'test_normal'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)]) - germline_tbis = Channel.empty() + germline_tbis = channel.empty() cram_tumor_only = [[:],[]] tumor_only_vcfs = channel.of([[id: 'test_tumor'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)]) - tumor_only_tbis = Channel.empty() + tumor_only_tbis = channel.empty() cram_somatic = [[:],[]] somatic_vcfs = channel.of([[id: 'test_somatic'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)]) - somatic_tbis = Channel.empty() + somatic_tbis = channel.empty() fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) fai = [[:],[]] @@ -84,20 +84,20 @@ nextflow_workflow { """ // Input setup tools = '' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample', num: '1'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)], [[id: 'test_sample', num: '2'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = true filter_vcfs = false snv_consensus_calling = false @@ -151,20 +151,20 @@ nextflow_workflow { """ // Input setup tools = '' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample', num: '1'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)], [[id: 'test_sample', num: '2'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = true filter_vcfs = false snv_consensus_calling = false @@ -218,19 +218,19 @@ nextflow_workflow { """ // Input setup tools = 'strelka' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false @@ -283,19 +283,19 @@ nextflow_workflow { """ // Input setup tools = 'strelka' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false @@ -351,19 +351,19 @@ nextflow_workflow { """ // Input setup tools = 'haplotypecaller,strelka' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = true filter_vcfs = false snv_consensus_calling = false @@ -421,29 +421,29 @@ nextflow_workflow { """ // Input setup with real test data tools = 'varlociraptor' - cram_germline = Channel.of( + cram_germline = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists:true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists:true)] ) - germline_vcfs = Channel.of( + germline_vcfs = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false normalize_vcfs = false varlociraptor_chunk_size = params.varlociraptor_chunk_size - varlociraptor_scenario_germline = Channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() - varlociraptor_scenario_somatic = Channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() - varlociraptor_scenario_tumor_only = Channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() + varlociraptor_scenario_germline = channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() + varlociraptor_scenario_somatic = channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() + varlociraptor_scenario_tumor_only = channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() input[0] = tools input[1] = cram_germline @@ -492,29 +492,29 @@ nextflow_workflow { """ // Input setup tools = 'varlociraptor' - cram_germline = Channel.of( + cram_germline = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists:true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists:true)] ) - germline_vcfs = Channel.of( + germline_vcfs = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false normalize_vcfs = false varlociraptor_chunk_size = 2 - varlociraptor_scenario_germline = Channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() - varlociraptor_scenario_somatic = Channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() - varlociraptor_scenario_tumor_only = Channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() + varlociraptor_scenario_germline = channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() + varlociraptor_scenario_somatic = channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() + varlociraptor_scenario_tumor_only = channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() input[0] = tools input[1] = cram_germline @@ -564,29 +564,29 @@ nextflow_workflow { """ // Input setup with real test data tools = 'varlociraptor' - cram_germline = Channel.empty() - germline_vcfs = Channel.empty() - germline_tbis = Channel.empty() - cram_tumor_only = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.empty() + germline_tbis = channel.empty() + cram_tumor_only = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XY', status: 1, contamination: 0.0], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists:true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists:true)] ) - tumor_only_vcfs = Channel.of( + tumor_only_vcfs = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XY', status: 1, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false normalize_vcfs = false varlociraptor_chunk_size = params.varlociraptor_chunk_size - varlociraptor_scenario_germline = Channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() - varlociraptor_scenario_somatic = Channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() - varlociraptor_scenario_tumor_only = Channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() + varlociraptor_scenario_germline = channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() + varlociraptor_scenario_somatic = channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() + varlociraptor_scenario_tumor_only = channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() input[0] = tools input[1] = cram_germline @@ -634,29 +634,29 @@ nextflow_workflow { """ // Input setup tools = 'varlociraptor' - cram_germline = Channel.empty() - germline_vcfs = Channel.empty() - germline_tbis = Channel.empty() - cram_tumor_only = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.empty() + germline_tbis = channel.empty() + cram_tumor_only = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XY', status: 1, contamination: 0.0], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists:true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists:true)] ) - tumor_only_vcfs = Channel.of( + tumor_only_vcfs = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XY', status: 1, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false normalize_vcfs = false varlociraptor_chunk_size = 2 - varlociraptor_scenario_germline = Channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() - varlociraptor_scenario_somatic = Channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() - varlociraptor_scenario_tumor_only = Channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() + varlociraptor_scenario_germline = channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() + varlociraptor_scenario_somatic = channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() + varlociraptor_scenario_tumor_only = channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() input[0] = tools input[1] = cram_germline @@ -706,15 +706,15 @@ nextflow_workflow { """ // Input setup with real test data tools = 'varlociraptor' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'normal_sample', patient: 'test', sample: 'normal', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.of( + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XX', status: 1, normal_id: 'normal_sample', contamination: 0.0], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists:true), @@ -722,21 +722,21 @@ nextflow_workflow { file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.recalibrated.sorted.cram', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test2.paired_end.recalibrated.sorted.cram.crai', checkIfExists: true)] ) - somatic_vcfs = Channel.of( + somatic_vcfs = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XX', status: 1, normal_id: 'normal_sample', variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_filtered_mutect2_calls.vcf.gz', checkIfExists: true)] ) - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true)]) + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false normalize_vcfs = false varlociraptor_chunk_size = params.varlociraptor_chunk_size - varlociraptor_scenario_germline = Channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() - varlociraptor_scenario_somatic = Channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() - varlociraptor_scenario_tumor_only = Channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() + varlociraptor_scenario_germline = channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() + varlociraptor_scenario_somatic = channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() + varlociraptor_scenario_tumor_only = channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() input[0] = tools input[1] = cram_germline @@ -786,35 +786,35 @@ nextflow_workflow { """ // Input setup tools = 'varlociraptor' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'normal_sample', patient: 'test', sample: 'normal', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.empty() - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.of( + germline_tbis = channel.empty() + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XX', status: 1, normal_id: 'normal_sample', contamination: 0.0], 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)] ) - somatic_vcfs = Channel.of( + somatic_vcfs = channel.of( [[id: 'tumor_sample', patient: 'test', sample: 'tumor', sex: 'XX', status: 1, normal_id: 'normal_sample', variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_filtered_mutect2_calls.vcf.gz', checkIfExists: true)] ) - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true)]) + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = false normalize_vcfs = false varlociraptor_chunk_size = 2 - varlociraptor_scenario_germline = Channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() - varlociraptor_scenario_somatic = Channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() - varlociraptor_scenario_tumor_only = Channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() + varlociraptor_scenario_germline = channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect() + varlociraptor_scenario_somatic = channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect() + varlociraptor_scenario_tumor_only = channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect() input[0] = tools input[1] = cram_germline @@ -859,27 +859,27 @@ nextflow_workflow { """ // Input setup for consensus calling - requires multiple VCFs with different variantcallers tools = '' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'freebayes'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)], [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.of( + germline_tbis = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'freebayes'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true)], [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true)] ) - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = true @@ -932,27 +932,27 @@ nextflow_workflow { """ // Input setup for full post-processing pipeline tools = '' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'freebayes'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)], [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'haplotypecaller'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.of( + germline_tbis = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'freebayes'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true)], [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'haplotypecaller'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true)] ) - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = true snv_consensus_calling = true @@ -1007,27 +1007,27 @@ nextflow_workflow { """ // Input setup for consensus stub test tools = '' - cram_germline = Channel.empty() - germline_vcfs = Channel.of( + cram_germline = channel.empty() + germline_vcfs = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'freebayes'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)], [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true)] ) - germline_tbis = Channel.of( + germline_tbis = channel.of( [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'freebayes'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true)], [[id: 'test_sample', patient: 'test', sample: 'test', sex: 'XX', status: 0, variantcaller: 'strelka'], file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true)] ) - cram_tumor_only = Channel.empty() - tumor_only_vcfs = Channel.empty() - tumor_only_tbis = Channel.empty() - cram_somatic = Channel.empty() - somatic_vcfs = Channel.empty() - somatic_tbis = Channel.empty() - fasta = Channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) - fai = Channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) + cram_tumor_only = channel.empty() + tumor_only_vcfs = channel.empty() + tumor_only_tbis = channel.empty() + cram_somatic = channel.empty() + somatic_vcfs = channel.empty() + somatic_tbis = channel.empty() + fasta = channel.of([[id: 'fasta'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) + fai = channel.of([[id: 'fai'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)]) concatenate_vcfs = false filter_vcfs = false snv_consensus_calling = true diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 5460704157..a78e0706da 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -54,10 +54,10 @@ workflow PREPARE_GENOME { vep_include_fasta // params.vep_include_fasta main: - versions = Channel.empty() + versions = channel.empty() // TODO: EXTRACT FASTA FILE? - fasta = fasta_in ? Channel.fromPath(fasta_in).map { fasta -> [[id: fasta.baseName], fasta] }.collect() : Channel.empty() + fasta = fasta_in ? channel.fromPath(fasta_in).map { fasta -> [[id: fasta.baseName], fasta] }.collect() : channel.empty() vep_fasta = vep_include_fasta ? fasta : [[id: 'null'], []] if (step == 'mapping') { @@ -67,7 +67,7 @@ workflow PREPARE_GENOME { versions = versions.mix(BWAMEM1_INDEX.out.versions) } else if (aligner == "bwa-mem" || aligner == "sentieon-bwamem" || aligner == "parabricks") { - index_alignment = Channel.fromPath(bwa_in).map { index -> [[id: 'bwa'], index] }.collect() + index_alignment = channel.fromPath(bwa_in).map { index -> [[id: 'bwa'], index] }.collect() } else if (!bwamem2_in && aligner == 'bwa-mem2') { BWAMEM2_INDEX(fasta) @@ -75,7 +75,7 @@ workflow PREPARE_GENOME { versions = versions.mix(BWAMEM2_INDEX.out.versions) } else if (aligner == 'bwa-mem2') { - index_alignment = Channel.fromPath(bwamem2_in).map { index -> [[id: 'bwamem2'], index] }.collect() + index_alignment = channel.fromPath(bwamem2_in).map { index -> [[id: 'bwamem2'], index] }.collect() } else if (!dragmap_in && aligner == 'dragmap') { DRAGMAP_HASHTABLE(fasta) @@ -83,11 +83,11 @@ workflow PREPARE_GENOME { versions = versions.mix(DRAGMAP_HASHTABLE.out.versions) } else if (aligner == 'dragmap') { - index_alignment = Channel.fromPath(dragmap_in).map { index -> [[id: 'dragmap'], index] }.collect() + index_alignment = channel.fromPath(dragmap_in).map { index -> [[id: 'dragmap'], index] }.collect() } } else { - index_alignment = Channel.empty() + index_alignment = channel.empty() } if (!dict_in && step != "annotate") { @@ -96,10 +96,10 @@ workflow PREPARE_GENOME { versions = versions.mix(GATK4_CREATESEQUENCEDICTIONARY.out.versions) } else if (dict_in) { - dict = Channel.fromPath(dict_in).map { it -> [[id: 'dict'], it] }.collect() + dict = channel.fromPath(dict_in).map { it -> [[id: 'dict'], it] }.collect() } else { - dict = Channel.empty() + dict = channel.empty() } if (!fasta_fai_in && step != "annotate") { @@ -108,14 +108,14 @@ workflow PREPARE_GENOME { versions = versions.mix(SAMTOOLS_FAIDX.out.versions) } else if (fasta_fai_in) { - fasta_fai = Channel.fromPath(fasta_fai_in).map { it -> [[id: 'fai'], it] }.collect() + fasta_fai = channel.fromPath(fasta_fai_in).map { it -> [[id: 'fai'], it] }.collect() } else { - fasta_fai = Channel.empty() + fasta_fai = channel.empty() } // Prepare genome for BBSplit contamination filtering - bbsplit_index = Channel.empty() + bbsplit_index = channel.empty() if (tools && tools.split(',').contains('bbsplit')) { if (bbsplit_index_in) { // Use user-provided bbsplit index @@ -124,12 +124,12 @@ workflow PREPARE_GENOME { versions = versions.mix(UNTAR_BBSPLIT_INDEX.out.versions) } else { - bbsplit_index = Channel.value(file(bbsplit_index_in, checkIfExists: true)) + bbsplit_index = channel.value(file(bbsplit_index_in, checkIfExists: true)) } } else if (bbsplit_fasta_list_in) { // Build it from scratch if we have FASTA - Channel.from(file(bbsplit_fasta_list_in, checkIfExists: true)) + channel.from(file(bbsplit_fasta_list_in, checkIfExists: true)) .splitCsv(header: false, sep: ',') .flatMap { id, fafile -> [['id', id], ['fasta', file(fafile, checkIfExists: true)]] } .groupTuple() @@ -147,8 +147,8 @@ workflow PREPARE_GENOME { } } - bcftools_annotations = bcftools_annotations_in ? Channel.fromPath(bcftools_annotations_in).collect() : Channel.value([]) - bcftools_annotations_tbi = bcftools_annotations_tbi_in ? Channel.fromPath(bcftools_annotations_tbi_in).collect() : Channel.value([]) + bcftools_annotations = bcftools_annotations_in ? channel.fromPath(bcftools_annotations_in).collect() : channel.value([]) + bcftools_annotations_tbi = bcftools_annotations_tbi_in ? channel.fromPath(bcftools_annotations_tbi_in).collect() : channel.value([]) if (!bcftools_annotations_tbi_in && bcftools_annotations_in) { TABIX_BCFTOOLS_ANNOTATIONS(bcftools_annotations.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) @@ -156,8 +156,8 @@ workflow PREPARE_GENOME { } - dbsnp = dbsnp_in ? Channel.fromPath(dbsnp_in).collect() : Channel.value([]) - dbsnp_tbi = dbsnp_tbi_in ? Channel.fromPath(dbsnp_tbi_in).collect() : Channel.value([]) + dbsnp = dbsnp_in ? channel.fromPath(dbsnp_in).collect() : channel.value([]) + dbsnp_tbi = dbsnp_tbi_in ? channel.fromPath(dbsnp_tbi_in).collect() : channel.value([]) if (!dbsnp_tbi_in && dbsnp_in && ((step == "mapping" || step == "markduplicates" || step == "prepare_recalibration") || (tools.split(',').contains('controlfreec') || tools.split(',').contains('haplotypecaller') || tools.split(',').contains('sentieon_haplotyper') || tools.split(',').contains('sentieon_dnascope') || tools.split(',').contains('muse') || tools.split(',').contains('mutect2')))) { TABIX_DBSNP(dbsnp.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) @@ -165,8 +165,8 @@ workflow PREPARE_GENOME { versions = versions.mix(TABIX_DBSNP.out.versions) } - germline_resource = germline_resource_in ? Channel.fromPath(germline_resource_in).collect() : Channel.value([]) - germline_resource_tbi = germline_resource_tbi_in ? Channel.fromPath(germline_resource_tbi_in).collect() : Channel.value([]) + germline_resource = germline_resource_in ? channel.fromPath(germline_resource_in).collect() : channel.value([]) + germline_resource_tbi = germline_resource_tbi_in ? channel.fromPath(germline_resource_tbi_in).collect() : channel.value([]) if (!germline_resource_tbi_in && germline_resource_in && (tools.split(',').contains('mutect2') || tools.split(',').contains('sentieon_tnscope'))) { TABIX_GERMLINE_RESOURCE(germline_resource.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) @@ -174,8 +174,8 @@ workflow PREPARE_GENOME { versions = versions.mix(TABIX_GERMLINE_RESOURCE.out.versions) } - known_indels = known_indels_in ? Channel.fromPath(known_indels_in).collect() : Channel.value([]) - known_indels_tbi = known_indels_tbi_in ? Channel.fromPath(known_indels_tbi_in).collect() : Channel.value([]) + known_indels = known_indels_in ? channel.fromPath(known_indels_in).collect() : channel.value([]) + known_indels_tbi = known_indels_tbi_in ? channel.fromPath(known_indels_tbi_in).collect() : channel.value([]) if (!known_indels_tbi_in && known_indels_in && (step == 'mapping' || step == "markduplicates" || step == 'prepare_recalibration' || (tools.split(',').contains('haplotypecaller') || tools.split(',').contains('sentieon_haplotyper') || tools.split(',').contains('sentieon_dnascope')))) { TABIX_KNOWN_INDELS(known_indels.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) @@ -183,8 +183,8 @@ workflow PREPARE_GENOME { versions = versions.mix(TABIX_KNOWN_INDELS.out.versions) } - known_snps = known_snps_in ? Channel.fromPath(known_snps_in).collect() : Channel.value([]) - known_snps_tbi = known_snps_tbi_in ? Channel.fromPath(known_snps_tbi_in).collect() : Channel.value([]) + known_snps = known_snps_in ? channel.fromPath(known_snps_in).collect() : channel.value([]) + known_snps_tbi = known_snps_tbi_in ? channel.fromPath(known_snps_tbi_in).collect() : channel.value([]) if (!known_snps_tbi_in && known_snps_in && (step == 'mapping' || step == "markduplicates" || step == 'prepare_recalibration' || (tools.split(',').contains('haplotypecaller') || tools.split(',').contains('sentieon_haplotyper')))) { TABIX_KNOWN_SNPS(known_snps.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) @@ -192,8 +192,8 @@ workflow PREPARE_GENOME { versions = versions.mix(TABIX_KNOWN_SNPS.out.versions) } - pon = pon_in ? Channel.fromPath(pon_in).collect() : Channel.value([]) - pon_tbi = pon_tbi_in ? Channel.fromPath(pon_tbi_in).collect() : Channel.value([]) + pon = pon_in ? channel.fromPath(pon_in).collect() : channel.value([]) + pon_tbi = pon_tbi_in ? channel.fromPath(pon_tbi_in).collect() : channel.value([]) if (!pon_tbi_in && pon_in && tools.split(',').contains('mutect2')) { TABIX_PON(pon.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) @@ -210,19 +210,19 @@ workflow PREPARE_GENOME { // MSI if (msisensor2_models_in && msisensor2_models_in.endsWith(".tar.gz") && tools.split(',').contains('msisensor2')) { - UNTAR_MSISENSOR2_MODELS(Channel.fromPath(file(msisensor2_models_in)).map { archive -> [[id: archive.baseName], archive] }) + UNTAR_MSISENSOR2_MODELS(channel.fromPath(file(msisensor2_models_in)).map { archive -> [[id: archive.baseName], archive] }) msisensor2_models = UNTAR_MSISENSOR2_MODELS.out.untar.collect() versions = versions.mix(UNTAR_MSISENSOR2_MODELS.out.versions) } else if (msisensor2_models_in && tools.split(',').contains('msisensor2')) { - msisensor2_models = Channel.fromPath(msisensor2_models_in).map { model -> [[id:model.baseName], model] }.collect() + msisensor2_models = channel.fromPath(msisensor2_models_in).map { model -> [[id:model.baseName], model] }.collect() } else { - msisensor2_models = Channel.value([]) + msisensor2_models = channel.value([]) } if (msisensorpro_scan_in) { - msisensorpro_scan = Channel.fromPath(msisensorpro_scan_in) + msisensorpro_scan = channel.fromPath(msisensorpro_scan_in) } else if (tools.split(',').contains('msisensorpro')) { MSISENSORPRO_SCAN(fasta) @@ -230,68 +230,68 @@ workflow PREPARE_GENOME { versions = versions.mix(MSISENSORPRO_SCAN.out.versions) } else { - msisensorpro_scan = Channel.value([]) + msisensorpro_scan = channel.value([]) } // prepare ascat and controlfreec reference files if (!ascat_alleles_in) { - ascat_alleles = Channel.empty() + ascat_alleles = channel.empty() } else if (ascat_alleles_in.endsWith(".zip") && tools.split(',').contains('ascat')) { - UNZIP_ALLELES(Channel.fromPath(file(ascat_alleles_in)).map { archive -> [[id: archive.baseName], archive] }) + UNZIP_ALLELES(channel.fromPath(file(ascat_alleles_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_alleles = UNZIP_ALLELES.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() versions = versions.mix(UNZIP_ALLELES.out.versions) } else { - ascat_alleles = Channel.fromPath(ascat_alleles_in).collect() + ascat_alleles = channel.fromPath(ascat_alleles_in).collect() } if (!ascat_loci_in) { - ascat_loci = Channel.empty() + ascat_loci = channel.empty() } else if (ascat_loci_in.endsWith(".zip") && tools.split(',').contains('ascat')) { - UNZIP_LOCI(Channel.fromPath(file(ascat_loci_in)).map { archive -> [[id: archive.baseName], archive] }) + UNZIP_LOCI(channel.fromPath(file(ascat_loci_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_loci = UNZIP_LOCI.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() versions = versions.mix(UNZIP_LOCI.out.versions) } else { - ascat_loci = Channel.fromPath(ascat_loci_in).collect() + ascat_loci = channel.fromPath(ascat_loci_in).collect() } if (!ascat_loci_gc_in) { - ascat_loci_gc = Channel.value([]) + ascat_loci_gc = channel.value([]) } else if (ascat_loci_gc_in.endsWith(".zip") && tools.split(',').contains('ascat')) { - UNZIP_GC(Channel.fromPath(file(ascat_loci_gc_in)).map { archive -> [[id: archive.baseName], archive] }) + UNZIP_GC(channel.fromPath(file(ascat_loci_gc_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_loci_gc = UNZIP_GC.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() versions = versions.mix(UNZIP_GC.out.versions) } else { - ascat_loci_gc = Channel.fromPath(ascat_loci_gc_in).collect() + ascat_loci_gc = channel.fromPath(ascat_loci_gc_in).collect() } if (!ascat_loci_rt_in) { - ascat_loci_rt = Channel.value([]) + ascat_loci_rt = channel.value([]) } else if (ascat_loci_rt_in.endsWith(".zip") && tools.split(',').contains('ascat')) { - UNZIP_RT(Channel.fromPath(file(ascat_loci_rt_in)).map { archive -> [[id: archive.baseName], archive] }) + UNZIP_RT(channel.fromPath(file(ascat_loci_rt_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_loci_rt = UNZIP_RT.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() versions = versions.mix(UNZIP_RT.out.versions) } else { - ascat_loci_rt = Channel.fromPath(ascat_loci_rt_in).collect() + ascat_loci_rt = channel.fromPath(ascat_loci_rt_in).collect() } if (!chr_dir_in) { - chr_dir = Channel.value([]) + chr_dir = channel.value([]) } else if (chr_dir_in.endsWith(".tar.gz") && tools.split(',').contains('controlfreec')) { - UNTAR_CHR_DIR(Channel.fromPath(file(chr_dir_in)).map { archive -> [[id: archive.baseName], archive] }) + UNTAR_CHR_DIR(channel.fromPath(file(chr_dir_in)).map { archive -> [[id: archive.baseName], archive] }) chr_dir = UNTAR_CHR_DIR.out.untar.map { _meta, extracted_archive -> extracted_archive }.collect() versions = versions.mix(UNTAR_CHR_DIR.out.versions) } else { - chr_dir = Channel.fromPath(chr_dir_in).collect() + chr_dir = channel.fromPath(chr_dir_in).collect() } emit: diff --git a/subworkflows/local/prepare_genome/tests/bbsplit.nf.test b/subworkflows/local/prepare_genome/tests/bbsplit.nf.test index ca96469853..026ed1dd9c 100644 --- a/subworkflows/local/prepare_genome/tests/bbsplit.nf.test +++ b/subworkflows/local/prepare_genome/tests/bbsplit.nf.test @@ -25,27 +25,27 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = "${projectDir}/tests/csv/bbsplit_fasta_list.csv" // bbsplit_fasta_list input[5] = null // bbsplit_index - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = channel.empty() // bcftools_annotations + input[7] = channel.empty() // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = channel.empty() // dbsnp + input[12] = channel.empty() // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = channel.empty() // germline_resource + input[18] = channel.empty() // germline_resource_tbi + input[19] = channel.empty() // known_indels + input[20] = channel.empty() // known_indels_tbi + input[21] = channel.empty() // known_snps + input[22] = channel.empty() // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = channel.empty() // pon + input[26] = channel.empty() // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit @@ -81,27 +81,27 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = null // bbsplit_fasta_list input[5] = null // bbsplit_index - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = channel.empty() // bcftools_annotations + input[7] = channel.empty() // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = channel.empty() // dbsnp + input[12] = channel.empty() // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = channel.empty() // germline_resource + input[18] = channel.empty() // germline_resource_tbi + input[19] = channel.empty() // known_indels + input[20] = channel.empty() // known_indels_tbi + input[21] = channel.empty() // known_snps + input[22] = channel.empty() // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = channel.empty() // pon + input[26] = channel.empty() // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "no_tools" // tools - bbsplit not enabled @@ -138,27 +138,27 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = null // bbsplit_fasta_list input[5] = mock_index_dir.toString() // bbsplit_index (directory) - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = channel.empty() // bcftools_annotations + input[7] = channel.empty() // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = channel.empty() // dbsnp + input[12] = channel.empty() // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = channel.empty() // germline_resource + input[18] = channel.empty() // germline_resource_tbi + input[19] = channel.empty() // known_indels + input[20] = channel.empty() // known_indels_tbi + input[21] = channel.empty() // known_snps + input[22] = channel.empty() // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = channel.empty() // pon + input[26] = channel.empty() // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit @@ -197,27 +197,27 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = "${projectDir}/tests/csv/bbsplit_fasta_list.csv" // bbsplit_fasta_list input[5] = null // bbsplit_index - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = channel.empty() // bcftools_annotations + input[7] = channel.empty() // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = channel.empty() // dbsnp + input[12] = channel.empty() // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = channel.empty() // germline_resource + input[18] = channel.empty() // germline_resource_tbi + input[19] = channel.empty() // known_indels + input[20] = channel.empty() // known_indels_tbi + input[21] = channel.empty() // known_snps + input[22] = channel.empty() // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = channel.empty() // pon + input[26] = channel.empty() // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit @@ -259,27 +259,27 @@ nextflow_workflow { input[3] = null // ascat_loci_rt input[4] = null // bbsplit_fasta_list input[5] = dummy_tar.toString() // bbsplit_index (tar.gz file) - input[6] = Channel.empty() // bcftools_annotations - input[7] = Channel.empty() // bcftools_annotations_tbi + input[6] = channel.empty() // bcftools_annotations + input[7] = channel.empty() // bcftools_annotations_tbi input[8] = null // bwa input[9] = null // bwamem2 input[10] = null // chr_dir - input[11] = Channel.empty() // dbsnp - input[12] = Channel.empty() // dbsnp_tbi + input[11] = channel.empty() // dbsnp + input[12] = channel.empty() // dbsnp_tbi input[13] = null // dict input[14] = null // dragmap - input[15] = Channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta + input[15] = channel.of([[id: "fasta"], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)]) // fasta input[16] = null // fasta_fai - input[17] = Channel.empty() // germline_resource - input[18] = Channel.empty() // germline_resource_tbi - input[19] = Channel.empty() // known_indels - input[20] = Channel.empty() // known_indels_tbi - input[21] = Channel.empty() // known_snps - input[22] = Channel.empty() // known_snps_tbi + input[17] = channel.empty() // germline_resource + input[18] = channel.empty() // germline_resource_tbi + input[19] = channel.empty() // known_indels + input[20] = channel.empty() // known_indels_tbi + input[21] = channel.empty() // known_snps + input[22] = channel.empty() // known_snps_tbi input[23] = null // msisensor2_models input[24] = null // msisensorpro_scan - input[25] = Channel.empty() // pon - input[26] = Channel.empty() // pon_tbi + input[25] = channel.empty() // pon + input[26] = channel.empty() // pon_tbi input[27] = 'bwa-mem' // aligner input[28] = 'mapping' // step input[29] = "bbsplit" // tools - enable bbsplit diff --git a/subworkflows/local/prepare_intervals/main.nf b/subworkflows/local/prepare_intervals/main.nf index 8b7d2eff19..581612e465 100644 --- a/subworkflows/local/prepare_intervals/main.nf +++ b/subworkflows/local/prepare_intervals/main.nf @@ -22,20 +22,20 @@ workflow PREPARE_INTERVALS { step main: - versions = Channel.empty() + versions = channel.empty() - intervals_bed = Channel.empty() // List of [ bed, num_intervals ], one for each region - intervals_bed_gz_tbi = Channel.empty() // List of [ bed.gz, bed,gz.tbi, num_intervals ], one for each region - intervals_combined = Channel.empty() // Single bed file containing all intervals + intervals_bed = channel.empty() // List of [ bed, num_intervals ], one for each region + intervals_bed_gz_tbi = channel.empty() // List of [ bed.gz, bed,gz.tbi, num_intervals ], one for each region + intervals_combined = channel.empty() // Single bed file containing all intervals if (no_intervals) { file("${outdir}/no_intervals.bed").text = "no_intervals\n" file("${outdir}/no_intervals.bed.gz").text = "no_intervals\n" file("${outdir}/no_intervals.bed.gz.tbi").text = "no_intervals\n" - intervals_bed = Channel.fromPath(file("${outdir}/no_intervals.bed")).map{ it -> [ it, 0 ] } - intervals_bed_gz_tbi = Channel.fromPath(file("${outdir}/no_intervals.bed.{gz,gz.tbi}")).collect().map{ it -> [ it, 0 ] } - intervals_combined = Channel.fromPath(file("${outdir}/no_intervals.bed")).map{ it -> [ [ id:it.simpleName ], it ] } + intervals_bed = channel.fromPath(file("${outdir}/no_intervals.bed")).map{ it -> [ it, 0 ] } + intervals_bed_gz_tbi = channel.fromPath(file("${outdir}/no_intervals.bed.{gz,gz.tbi}")).collect().map{ it -> [ it, 0 ] } + intervals_combined = channel.fromPath(file("${outdir}/no_intervals.bed")).map{ it -> [ [ id:it.simpleName ], it ] } } else if (step != 'annotate' && step != 'controlfreec') { // If no interval/target file is provided, then generated intervals from FASTA file if (!intervals) { @@ -50,7 +50,7 @@ workflow PREPARE_INTERVALS { versions = versions.mix(BUILD_INTERVALS.out.versions) versions = versions.mix(CREATE_INTERVALS_BED.out.versions) } else { - intervals_combined = Channel.fromPath(file(intervals)).map{it -> [ [ id:it.baseName ], it ] } + intervals_combined = channel.fromPath(file(intervals)).map{it -> [ [ id:it.baseName ], it ] } CREATE_INTERVALS_BED(file(intervals), nucleotides_per_second) intervals_bed = CREATE_INTERVALS_BED.out.bed diff --git a/subworkflows/local/prepare_reference_cnvkit/main.nf b/subworkflows/local/prepare_reference_cnvkit/main.nf index 13bbef5f6b..9eaca9eff7 100644 --- a/subworkflows/local/prepare_reference_cnvkit/main.nf +++ b/subworkflows/local/prepare_reference_cnvkit/main.nf @@ -7,7 +7,7 @@ workflow PREPARE_REFERENCE_CNVKIT { intervals_bed_combined // channel: [] main: - versions = Channel.empty() + versions = channel.empty() // prepare a antitarget reference files for tumor_only mode of cnvkit CNVKIT_ANTITARGET(intervals_bed_combined.flatten().map { it -> [[id: 'intervals'], it] }) diff --git a/subworkflows/local/samplesheet_to_channel/tests/main.nf.test b/subworkflows/local/samplesheet_to_channel/tests/main.nf.test index 32bbb3a8e8..21483b1861 100644 --- a/subworkflows/local/samplesheet_to_channel/tests/main.nf.test +++ b/subworkflows/local/samplesheet_to_channel/tests/main.nf.test @@ -11,7 +11,7 @@ nextflow_workflow { workflow { """ // define inputs of the workflow here. Example: - input[0] = Channel.of([ + input[0] = channel.of([ ['patient':'test', 'sample':'test', 'sex':'XX', 'status':0, 'lane':'test_L1'], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz', checkIfExists: true), diff --git a/subworkflows/local/vcf_consensus/main.nf b/subworkflows/local/vcf_consensus/main.nf index 0b9dbb028f..291d360684 100644 --- a/subworkflows/local/vcf_consensus/main.nf +++ b/subworkflows/local/vcf_consensus/main.nf @@ -12,7 +12,7 @@ workflow CONSENSUS { vcfs // [meta, vcf ,tbi] main: - ch_versions = Channel.empty() + ch_versions = channel.empty() ch_vcfs = vcfs .branch{ meta, vcf, tbi -> diff --git a/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf b/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf index 21e4ce927a..85aa418968 100644 --- a/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf +++ b/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf @@ -10,7 +10,7 @@ workflow VCF_QC_BCFTOOLS_VCFTOOLS { main: - versions = Channel.empty() + versions = channel.empty() BCFTOOLS_STATS(vcf.map{ meta, vcf_ -> [ meta, vcf_, [] ] }, [[:],[]], [[:],[]], [[:],[]], [[:],[]], [[:],[]]) VCFTOOLS_TSTV_COUNT(vcf, target_bed, []) diff --git a/subworkflows/local/vcf_variant_filtering_gatk/main.nf b/subworkflows/local/vcf_variant_filtering_gatk/main.nf index ce2b749c35..de98177777 100644 --- a/subworkflows/local/vcf_variant_filtering_gatk/main.nf +++ b/subworkflows/local/vcf_variant_filtering_gatk/main.nf @@ -14,7 +14,7 @@ workflow VCF_VARIANT_FILTERING_GATK { main: - versions = Channel.empty() + versions = channel.empty() // Don't scatter/gather by intervals, because especially for small regions (targeted or WGS), it easily fails with 0 SNPS in region cnn_in = vcf.combine(intervals_bed_combined).map{ meta, vcf_, tbi, intervals -> [ meta, vcf_, tbi, [], intervals ] } From e17a658185de12849e7ec6448b07c363f731c6dd Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Thu, 16 Jul 2026 16:29:22 +0200 Subject: [PATCH 10/27] Replace deprecated `channel.from` with `channel.of` in prepare_genome (#2233) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Replace the last remaining `channel.from` call with `channel.of` in `subworkflows/local/prepare_genome/main.nf`. `channel.from` is deprecated in favour of `channel.of`/`channel.fromList` and prints a runtime deprecation warning. It is not flagged by `nextflow lint` (only the capital-`Channel` namespace is), and it does not break on 25.10 or 26.x — this is deprecation cleanup, not a compatibility fix: [https://docs.seqera.io/nextflow/tutorials/static-types#avoid-deprecated-patterns](https://docs.seqera.io/nextflow/tutorials/static-types#avoid-deprecated-patterns) ## Changes - `subworkflows/local/prepare_genome/main.nf` line 132: `channel.from(...)` → `channel.of(...)` - `CHANGELOG.md`: added entry under `### Changed` ## Semantics The argument is a single file object (`file(bbsplit_fasta_list_in, checkIfExists: true)` returns a single Path), so `channel.of` is a direct drop-in with identical behaviour. The downstream `.splitCsv()` chain is unaffected. --- CHANGELOG.md | 1 + subworkflows/local/prepare_genome/main.nf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4e56870f5..26e44d9763 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2178](https://github.com/nf-core/sarek/pull/2178) - Template update for nf-core/tools v4.0.2 - [#2225](https://github.com/nf-core/sarek/pull/2225) - Back to dev (3.9.1dev) - [#2229](https://github.com/nf-core/sarek/pull/2229) - Update nft-utils to 1.0.0, migrate `getAllFilesFromDir` to `getAllFilesFromPath` in test utilities +- [#2233](https://github.com/nf-core/sarek/pull/2233) - Replace the last remaining deprecated `channel.from` with `channel.of` in `prepare_genome` #### Fixed diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index a78e0706da..192383baa7 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -129,7 +129,7 @@ workflow PREPARE_GENOME { } else if (bbsplit_fasta_list_in) { // Build it from scratch if we have FASTA - channel.from(file(bbsplit_fasta_list_in, checkIfExists: true)) + channel.of(file(bbsplit_fasta_list_in, checkIfExists: true)) .splitCsv(header: false, sep: ',') .flatMap { id, fafile -> [['id', id], ['fasta', file(fafile, checkIfExists: true)]] } .groupTuple() From e3d53c53b88bca2927b017597bfd072b03bdb8d0 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Fri, 17 Jul 2026 11:34:26 +0200 Subject: [PATCH 11/27] Replace `.set {}` with plain assignment for strict-syntax readiness (#2234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Replaces the deprecated `.set {}` channel terminator with plain leading assignment in four local subworkflows. This pattern still runs in Nextflow 26.x but is flagged by the static-types type checker, so this is part of the granular strict-syntax cleanup series. Pure mechanical, semantics-preserving change (`.set { name }` → `name = `): - `subworkflows/local/prepare_snpsift_databases/main.nf` — `ch_branched` - `subworkflows/local/fastq_preprocess_gatk/main.nf` — `reads_grouping_key` - `subworkflows/local/fastq_preprocess_parabricks/main.nf` — `reads_grouping_key` - `subworkflows/local/prepare_genome/main.nf` — `ch_bbsplit_fasta_list` ## PR checklist - [x] Targets the `dev` branch - [x] `CHANGELOG.md` updated (Developer section) - [ ] No functional/output changes — no tests or docs affected 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + subworkflows/local/fastq_preprocess_gatk/main.nf | 3 +-- subworkflows/local/fastq_preprocess_parabricks/main.nf | 4 ++-- subworkflows/local/prepare_genome/main.nf | 3 +-- subworkflows/local/prepare_snpsift_databases/main.nf | 4 ++-- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26e44d9763..568e07f50f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2225](https://github.com/nf-core/sarek/pull/2225) - Back to dev (3.9.1dev) - [#2229](https://github.com/nf-core/sarek/pull/2229) - Update nft-utils to 1.0.0, migrate `getAllFilesFromDir` to `getAllFilesFromPath` in test utilities - [#2233](https://github.com/nf-core/sarek/pull/2233) - Replace the last remaining deprecated `channel.from` with `channel.of` in `prepare_genome` +- [#2234](https://github.com/nf-core/sarek/pull/2234) - Replace deprecated `.set {}` channel terminator with plain assignment in local subworkflows for Nextflow strict-syntax / 26.x readiness #### Fixed diff --git a/subworkflows/local/fastq_preprocess_gatk/main.nf b/subworkflows/local/fastq_preprocess_gatk/main.nf index 80dad07bdd..f1ea54f64e 100644 --- a/subworkflows/local/fastq_preprocess_gatk/main.nf +++ b/subworkflows/local/fastq_preprocess_gatk/main.nf @@ -157,14 +157,13 @@ workflow FASTQ_PREPROCESS_GATK { // First, we must calculate number of lanes for each sample (meta.n_fastq) // This is needed to group reads from the same sample together using groupKey to avoid stalling the workflow // when reads from different samples are mixed together - reads_for_alignment.map { meta, reads -> + reads_grouping_key = reads_for_alignment.map { meta, reads -> [ meta.subMap('patient', 'sample', 'sex', 'status'), reads ] } .groupTuple() .map { meta, reads -> meta + [ n_fastq: reads.size() ] // We can drop the FASTQ files now that we know how many there are } - .set { reads_grouping_key } reads_for_alignment = reads_for_alignment.map{ meta, reads -> // Update meta.id to meta.sample no multiple lanes or splitted fastqs diff --git a/subworkflows/local/fastq_preprocess_parabricks/main.nf b/subworkflows/local/fastq_preprocess_parabricks/main.nf index 805bc5af59..8886d0611f 100644 --- a/subworkflows/local/fastq_preprocess_parabricks/main.nf +++ b/subworkflows/local/fastq_preprocess_parabricks/main.nf @@ -21,13 +21,13 @@ workflow FASTQ_PREPROCESS_PARABRICKS { ch_versions = channel.empty() ch_reports = channel.empty() - ch_reads.map { meta, reads -> + reads_grouping_key = ch_reads.map { meta, reads -> [ meta.subMap('patient', 'sample', 'sex', 'status'), reads ] } .groupTuple() .map { meta, reads -> meta + [ n_fastq: reads.size() ] // We can drop the FASTQ files now that we know how many there are - }.set { reads_grouping_key } + } ch_reads = ch_reads.map{ meta, reads -> // Update meta.id to meta.sample no multiple lanes or splitted fastqs diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 192383baa7..d05b1f980b 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -129,13 +129,12 @@ workflow PREPARE_GENOME { } else if (bbsplit_fasta_list_in) { // Build it from scratch if we have FASTA - channel.of(file(bbsplit_fasta_list_in, checkIfExists: true)) + ch_bbsplit_fasta_list = channel.of(file(bbsplit_fasta_list_in, checkIfExists: true)) .splitCsv(header: false, sep: ',') .flatMap { id, fafile -> [['id', id], ['fasta', file(fafile, checkIfExists: true)]] } .groupTuple() .map { it -> it[1] } .collect { [it] } - .set { ch_bbsplit_fasta_list } bbsplit_index = BBMAP_INDEX( [[id: "build_index"], []], diff --git a/subworkflows/local/prepare_snpsift_databases/main.nf b/subworkflows/local/prepare_snpsift_databases/main.nf index 581a62d020..e524212d72 100644 --- a/subworkflows/local/prepare_snpsift_databases/main.nf +++ b/subworkflows/local/prepare_snpsift_databases/main.nf @@ -12,10 +12,10 @@ workflow PREPARE_SNPSIFT_DATABASES { ch_configs = channel.fromList(val_db_configs) // Branch: create vardb if not provided - ch_configs.branch { + ch_branched = ch_configs.branch { has_vardb: it.vardb != null needs_vardb: true - }.set { ch_branched } + } // Create vardbs for databases that need them // Convert semicolon-separated fields to comma-separated (SnpSift expects commas) From abb83ad196f235dc860f82ef5c6481c59522564f Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Tue, 21 Jul 2026 17:34:27 +0200 Subject: [PATCH 12/27] Nextflow strict-syntax readiness for local code (+ Manta output & germline CNVKIT cleanups) (#2235) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What changed & why Nextflow **strict-syntax / 26.x readiness** for sarek's own code, plus two small functional improvements that surfaced along the way. `nextflow lint` is now clean for all local `.nf` and `conf/` files (only vendored `modules/nf-core/` warnings remain — those clear via module updates). ### 🟢 Mechanical — no behaviour change (safe to skim) - **Closures now have explicit, named parameters** across `subworkflows/local/`, `workflows/`, `main.nf` — replacing implicit/generic `it` (e.g. `.branch { meta, vcf -> … }`; single-channel maps named after the source channel, `dbsnp.map { dbsnp_ -> … }`). *Why: strict syntax deprecates implicit `it`.* - **`publishDir` `saveAs` closures** in `conf/modules/*.config` use an explicit `{ filename -> … }`. *Why: same.* - **Unused closure params prefixed `_`; 5 genuinely-unused `take:` inputs removed** (`bam`, `dbsnp_vqsr` ×2, `intervals_bed_gz_tbi`, `bcftools_columns`) with their call args. *Why: dead inputs / lint.* ### 🟡 Functional — worth a look - **germline CNVKit now consumes the shared BAM instead of CRAM.** *Why: `CNVKIT_BATCH` internally re-converts CRAM→BAM (slow), duplicating the pipeline's `CRAM_TO_BAM`; germline now reuses that single conversion — one conversion instead of two on paired runs.* Analysis output content is unchanged. - **`CRAM_TO_BAM` sets `ext.prefix` to the input basename** so the converted BAM (and therefore the CNVKit output filenames) mirror the source CRAM name. *Why: without it the BAM switch above would have renamed cnvkit outputs to `meta.id`, dropping the `…recalibrated…` provenance from the filenames. This keeps the existing naming.* - **Manta now emits complete candidate VCF + tbi pairs** (`candidate_small_indels_vcf(_tbi)`, `candidate_sv_vcf(_tbi)`) with `variantcaller:'manta'` on all outputs, and names SV outputs by type (`diploid_sv_vcf`, `tumor_sv_vcf`). *Why: candidates were previously assigned but never emitted (some missing their tbi / variantcaller tag).* Strelka's annotation input is unchanged. ### 🔵 Snapshots - Updated cnvkit snapshots (`variant_calling_cnvkit`, `variant_calling_all`): cnvkit output filenames now follow the source-CRAM basename, and `samtools` is dropped from `CNVKIT_BATCH` versions (both consequences of the BAM switch). **Filename renames only — file md5 content is unchanged.** `save_output_as_bam` is unaffected (its cnvkit input basename was already the source name). **No new parameters. No output-path changes; cnvkit output filenames are preserved via the `ext.prefix` above.** Pairs with #2232 (the `channel` factory migration) as the closure-`it` half of the strict-syntax work. ## PR checklist - [x] Description of changes (with reason) above. - [x] Code lints (`nextflow lint` — 0 errors, 0 local warnings). - [x] `CHANGELOG.md` updated. - [ ] Test suite: cnvkit snapshots updated for the BAM switch + `ext.prefix` naming; CI re-running to confirm green. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 2 + conf/modules/aligner.config | 6 +- conf/modules/aligner_parabricks.config | 8 +- conf/modules/annotate.config | 6 +- conf/modules/contamination.config | 2 +- conf/modules/deepvariant.config | 2 +- conf/modules/freebayes.config | 2 +- conf/modules/haplotypecaller.config | 2 +- conf/modules/lofreq.config | 2 +- conf/modules/markduplicates.config | 16 +- conf/modules/modules.config | 3 + conf/modules/mpileup.config | 2 +- conf/modules/mutect2.config | 4 +- conf/modules/prepare_genome.config | 36 +-- conf/modules/prepare_intervals.config | 6 +- conf/modules/prepare_recalibration.config | 2 +- conf/modules/recalibrate.config | 14 +- conf/modules/sentieon_dedup.config | 6 +- conf/modules/sentieon_dnascope.config | 2 +- conf/modules/sentieon_haplotyper.config | 2 +- conf/modules/sentieon_tnscope.config | 2 +- conf/modules/strelka.config | 2 +- docs/output.md | 3 + main.nf | 8 +- modules/local/consensus_from_sites/main.nf | 1 - .../local/bam_baserecalibrator/main.nf | 6 +- .../local/bam_baserecalibrator_spark/main.nf | 8 +- .../bam_joint_calling_germline_gatk/main.nf | 2 +- subworkflows/local/bam_markduplicates/main.nf | 2 +- .../local/bam_markduplicates_spark/main.nf | 4 +- .../bam_variant_calling_deepvariant/main.nf | 18 +- .../bam_variant_calling_freebayes/main.nf | 6 +- .../bam_variant_calling_germline_all/main.nf | 41 +-- .../main.nf | 30 ++- .../main.nf | 20 +- .../bam_variant_calling_indexcov/main.nf | 2 +- .../local/bam_variant_calling_mpileup/main.nf | 18 +- .../main.nf | 35 ++- .../main.nf | 29 +-- .../main.nf | 18 +- .../bam_variant_calling_single_tiddit/main.nf | 4 +- .../bam_variant_calling_somatic_all/main.nf | 7 +- .../main.nf | 4 +- .../bam_variant_calling_somatic_manta/main.nf | 35 +-- .../main.nf | 44 ++-- .../main.nf | 24 +- .../main.nf | 12 +- .../main.nf | 7 +- .../main.nf | 12 +- .../main.nf | 30 ++- .../main.nf | 38 +-- .../main.nf | 12 +- .../local/cram_qc_mosdepth_samtools/main.nf | 2 +- subworkflows/local/prepare_genome/main.nf | 8 +- subworkflows/local/prepare_intervals/main.nf | 24 +- .../local/prepare_reference_cnvkit/main.nf | 2 +- .../local/prepare_snpsift_databases/main.nf | 20 +- .../local/samplesheet_to_channel/main.nf | 21 +- .../local/utils_nfcore_sarek_pipeline/main.nf | 1 - subworkflows/local/vcf_consensus/main.nf | 8 +- .../local/vcf_varlociraptor_somatic/main.nf | 12 +- tests/variant_calling_all.nf.test.snap | 6 +- tests/variant_calling_cnvkit.nf.test.snap | 246 +++++++++--------- tests/variant_calling_muse.nf.test.snap | 2 +- workflows/sarek.nf | 37 ++- 65 files changed, 501 insertions(+), 497 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 568e07f50f..122f2710a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2210](https://github.com/nf-core/sarek/pull/2210) - Update bcftools to 1.23.1 - [#2229](https://github.com/nf-core/sarek/pull/2229) - Update EnsemblVEP to 116.0 - [#2232](https://github.com/nf-core/sarek/pull/2232) - Migrate local code to the lowercase `channel` factory for Nextflow strict-syntax / 26.x readiness +- [#2235](https://github.com/nf-core/sarek/pull/2235) - Nextflow strict-syntax / 26.x readiness for local code: explicit, named closure parameters (replacing implicit/generic `it`), `_`-prefixed unused parameters, and removal of unused `take:` inputs. Previously-dropped Manta candidate VCFs and Sentieon gVCF indices are now emitted. +- [#2235](https://github.com/nf-core/sarek/pull/2235) - germline CNVKIT reuses the shared `CRAM_TO_BAM` conversion instead of re-converting CRAM internally, avoiding a duplicate conversion. Side effect: with `--step variant_calling` (user-supplied CRAM/BAM), CNVKit output files are named after the input file rather than the sample; runs from FASTQ are unaffected. ### Fixed diff --git a/conf/modules/aligner.config b/conf/modules/aligner.config index 2af1fa8047..7ae23be9f3 100644 --- a/conf/modules/aligner.config +++ b/conf/modules/aligner.config @@ -41,14 +41,14 @@ process { // Only save if save_output_as_bam AND // (save_mapped OR no_markduplicates OR sentieon_dedup) AND // only a single BAM file per sample - saveAs: { + saveAs: { filename -> if (params.save_output_as_bam && ( params.save_mapped || (params.skip_tools && params.skip_tools.split(',').contains('markduplicates')) && !(params.tools && params.tools.split(',').contains('sentieon_dedup')) ) && (meta.size * meta.num_lanes == 1) - ) { "mapped/${meta.id}/${it}" } + ) { "mapped/${meta.id}/${filename}" } else { null } } ] @@ -78,7 +78,7 @@ process { path: { "${params.outdir}/preprocessing/" }, pattern: "*{bam,bai}", // Only save if (save_output_as_bam AND (no_markduplicates OR save_mapped )) - saveAs: { (params.save_output_as_bam && (params.save_mapped || params.skip_tools && params.skip_tools.split(',').contains('markduplicates'))) ? "mapped/${meta.id}/${it}" : null } + saveAs: { filename -> (params.save_output_as_bam && (params.save_mapped || params.skip_tools && params.skip_tools.split(',').contains('markduplicates'))) ? "mapped/${meta.id}/${filename}" : null } ] } diff --git a/conf/modules/aligner_parabricks.config b/conf/modules/aligner_parabricks.config index 4d680e907a..adc7c7d91a 100644 --- a/conf/modules/aligner_parabricks.config +++ b/conf/modules/aligner_parabricks.config @@ -28,7 +28,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/parabricks/${meta.id}/" }, pattern: "*{cram,crai}", - saveAs: { params.save_mapped ? it : null } + saveAs: { filename -> params.save_mapped ? filename : null } ] } @@ -38,7 +38,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/parabricks/${meta.id}/" }, pattern: "*cram", - saveAs: { params.save_mapped ? it : null } + saveAs: { filename -> params.save_mapped ? filename : null } ] } @@ -47,7 +47,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/parabricks/${meta.id}/" }, pattern: "*{cram,crai}", - saveAs: { params.save_mapped ? it : null } + saveAs: { filename -> params.save_mapped ? filename : null } ] } @@ -56,7 +56,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/parabricks/${meta.id}/" }, pattern: "*{bam,bam.bai}", - saveAs: { params.save_output_as_bam ? it : null } + saveAs: { filename -> params.save_output_as_bam ? filename : null } ] } } diff --git a/conf/modules/annotate.config b/conf/modules/annotate.config index 00ae12a2f8..35a160b4d2 100644 --- a/conf/modules/annotate.config +++ b/conf/modules/annotate.config @@ -24,7 +24,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reports/snpeff/${meta.variantcaller}/${meta.id}/" }, pattern: "*{csv,html,genes.txt}", - saveAs: { params.tools.split(',').contains('snpeff') ? it : null } + saveAs: { filename -> params.tools.split(',').contains('snpeff') ? filename : null } ] ] } @@ -85,7 +85,7 @@ process { publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/snpsift" }, - saveAs: { params.save_reference ? it : null } + saveAs: { filename -> params.save_reference ? filename : null } ] } @@ -123,7 +123,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/annotation/${meta.variantcaller}/${meta.id}/" }, pattern: "*{gz,gz.tbi}", - saveAs: { params.tools.split(',').contains('snpeff') ? it : null } + saveAs: { filename -> params.tools.split(',').contains('snpeff') ? filename : null } ] } } diff --git a/conf/modules/contamination.config b/conf/modules/contamination.config index 0cb9406519..f2f5929839 100644 --- a/conf/modules/contamination.config +++ b/conf/modules/contamination.config @@ -14,7 +14,7 @@ process { path: { params.save_bbsplit_reads ? "${params.outdir}/preprocessing/bbsplit/${meta.id}" : params.outdir }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - saveAs: { params.save_bbsplit_reads ? it : null } + saveAs: { filename -> params.save_bbsplit_reads ? filename : null } ] ] } diff --git a/conf/modules/deepvariant.config b/conf/modules/deepvariant.config index 6d97477550..6f75489482 100644 --- a/conf/modules/deepvariant.config +++ b/conf/modules/deepvariant.config @@ -26,7 +26,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : "deepvariant/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "deepvariant/${meta.id}/${filename}" } ] } diff --git a/conf/modules/freebayes.config b/conf/modules/freebayes.config index 7a1ec2a1c5..26deda7b42 100644 --- a/conf/modules/freebayes.config +++ b/conf/modules/freebayes.config @@ -40,7 +40,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, pattern: "*vcf.gz", - saveAs: { meta.num_intervals > 1 ? null : "freebayes/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "freebayes/${meta.id}/${filename}" } ] } diff --git a/conf/modules/haplotypecaller.config b/conf/modules/haplotypecaller.config index 7d652e8082..f3b83ece33 100644 --- a/conf/modules/haplotypecaller.config +++ b/conf/modules/haplotypecaller.config @@ -26,7 +26,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : "haplotypecaller/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "haplotypecaller/${meta.id}/${filename}" } ] } diff --git a/conf/modules/lofreq.config b/conf/modules/lofreq.config index 5517fa0157..fde84fdb59 100644 --- a/conf/modules/lofreq.config +++ b/conf/modules/lofreq.config @@ -23,7 +23,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : "lofreq/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "lofreq/${meta.id}/${filename}" } ] } diff --git a/conf/modules/markduplicates.config b/conf/modules/markduplicates.config index ce69d39994..9a0b81245b 100644 --- a/conf/modules/markduplicates.config +++ b/conf/modules/markduplicates.config @@ -39,7 +39,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/mapped/${meta.id}/" }, pattern: "*{cram,crai}", - saveAs: { !params.save_output_as_bam ? it : null } + saveAs: { filename -> !params.save_output_as_bam ? filename : null } ] } @@ -71,7 +71,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/markduplicates/${meta.id}/" }, pattern: "*{cram,crai}", - saveAs: { !params.save_output_as_bam ? it : null } + saveAs: { filename -> !params.save_output_as_bam ? filename : null } ], [ mode: params.publish_dir_mode, @@ -79,13 +79,13 @@ process { // not samtools-style (test.md.bam.bai); rename on publish so users see the standard naming. path: { "${params.outdir}/preprocessing/markduplicates/${meta.id}/" }, pattern: "*{md.bam,md.bai}", - saveAs: { params.save_output_as_bam ? (it.endsWith('.md.bai') ? it.replace('.md.bai', '.md.bam.bai') : it) : null } + saveAs: { filename -> params.save_output_as_bam ? (filename.endsWith('.md.bai') ? filename.replace('.md.bai', '.md.bam.bai') : filename) : null } ], [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*metrics", - saveAs: { !(params.skip_tools && params.skip_tools.split(',').contains('markduplicates_report')) ? "markduplicates/${meta.id}/${it}" : null} + saveAs: { filename -> !(params.skip_tools && params.skip_tools.split(',').contains('markduplicates_report')) ? "markduplicates/${meta.id}/${filename}" : null} ] ] } @@ -99,13 +99,13 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/markduplicates/${meta.id}/" }, pattern: "*{cram,crai}", - saveAs: { !params.save_output_as_bam ? it : null } + saveAs: { filename -> !params.save_output_as_bam ? filename : null } ], [ mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/markduplicates/${meta.id}/" }, pattern: "*{md.bam,md.bam.bai}", - saveAs: { params.save_output_as_bam ? it : null } + saveAs: { filename -> params.save_output_as_bam ? filename : null } ] ] } @@ -116,13 +116,13 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/markduplicates/${meta.id}/" }, pattern: "*{cram,crai}", - saveAs: { !params.save_output_as_bam ? it : null } + saveAs: { filename -> !params.save_output_as_bam ? filename : null } ], [ mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/markduplicates/${meta.id}/" }, pattern: "*{bam,bai}", - saveAs: { params.save_output_as_bam ? it : null } + saveAs: { filename -> params.save_output_as_bam ? filename : null } ] ] } diff --git a/conf/modules/modules.config b/conf/modules/modules.config index 4251f71403..a74b22254e 100644 --- a/conf/modules/modules.config +++ b/conf/modules/modules.config @@ -30,6 +30,9 @@ process { } withName: 'NFCORE_SAREK:SAREK:CRAM_TO_BAM' { + // Name the converted BAM after the source CRAM (minus suffix) so downstream + // tools that derive names from the input file (e.g. CNVKit) keep their naming + ext.prefix = { "${input.baseName}" } publishDir = [ enabled: params.save_output_as_bam, path: { "${params.outdir}/preprocessing/converted/cram_to_bam/${meta.id}" }, diff --git a/conf/modules/mpileup.config b/conf/modules/mpileup.config index edd2199354..c808137333 100644 --- a/conf/modules/mpileup.config +++ b/conf/modules/mpileup.config @@ -30,7 +30,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/bcftools/${meta.id}/" }, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : it } + saveAs: { filename -> meta.num_intervals > 1 ? null : filename } ] } diff --git a/conf/modules/mutect2.config b/conf/modules/mutect2.config index d12c476e17..c2fabb657b 100644 --- a/conf/modules/mutect2.config +++ b/conf/modules/mutect2.config @@ -23,7 +23,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, pattern: "*{vcf.gz,vcf.gz.tbi,stats}", - saveAs: { meta.num_intervals > 1 ? null : "mutect2/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "mutect2/${meta.id}/${filename}" } ] } @@ -95,7 +95,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, pattern: "*.table", - saveAs: { meta.num_intervals > 1 ? null : "mutect2/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "mutect2/${meta.id}/${filename}" } ] } diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index 5a84ea0a1f..cf045029f5 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -18,7 +18,7 @@ process { publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -28,7 +28,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "bwa", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -37,7 +37,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "bwamem2", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -47,7 +47,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "*{bed}", - saveAs: { params.save_reference || params.build_only_index ? "cnvkit/${it}" : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? "cnvkit/${filename}" : null } ] } @@ -58,7 +58,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "*{cnn}", - saveAs: { params.save_reference || params.build_only_index ? "cnvkit/${it}" : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? "cnvkit/${filename}" : null } ] } @@ -67,7 +67,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "dragmap", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -76,7 +76,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/dict" }, pattern: "*dict", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -85,7 +85,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/msisensor2" }, pattern: "*scan", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -94,7 +94,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/msisensorpro" }, pattern: "*list", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -103,7 +103,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/fai" }, pattern: "*fai", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -112,7 +112,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/bcfann" }, pattern: "*vcf.gz.tbi", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -121,7 +121,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/dbsnp" }, pattern: "*vcf.gz.tbi", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -130,7 +130,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/germline_resource" }, pattern: "*vcf.gz.tbi", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -139,7 +139,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/known_indels" }, pattern: "*vcf.gz.tbi", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -148,7 +148,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/known_snps" }, pattern: "*vcf.gz.tbi", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -157,7 +157,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/pon" }, pattern: "*vcf.gz.tbi", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } @@ -172,7 +172,7 @@ process { publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/" }, - saveAs: { (params.save_reference || params.build_only_index) && !it.equals('versions.yml') ? it : null } + saveAs: { filename -> (params.save_reference || params.build_only_index) && !filename.equals('versions.yml') ? filename : null } ] } @@ -183,7 +183,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference/msisensor2" }, pattern: "models", - saveAs: { params.save_reference || params.build_only_index ? it : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? filename : null } ] } } diff --git a/conf/modules/prepare_intervals.config b/conf/modules/prepare_intervals.config index 815903b996..1c3810435b 100644 --- a/conf/modules/prepare_intervals.config +++ b/conf/modules/prepare_intervals.config @@ -25,7 +25,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "*bed", - saveAs: { params.save_reference || params.build_only_index ? "intervals/${it}" : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? "intervals/${filename}" : null } ] } @@ -34,7 +34,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "*bed", - saveAs: { params.save_reference || params.build_only_index ? "intervals/${it}" : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? "intervals/${filename}" : null } ] } @@ -44,7 +44,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/reference" }, pattern: "*bed.gz", - saveAs: { params.save_reference || params.build_only_index ? "intervals/${it}" : null } + saveAs: { filename -> params.save_reference || params.build_only_index ? "intervals/${filename}" : null } ] } } diff --git a/conf/modules/prepare_recalibration.config b/conf/modules/prepare_recalibration.config index d9c74fe044..98bcd9408d 100644 --- a/conf/modules/prepare_recalibration.config +++ b/conf/modules/prepare_recalibration.config @@ -22,7 +22,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/" }, pattern: "*table", - saveAs: { meta.num_intervals > 1 ? null : "recal_table/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "recal_table/${meta.id}/${filename}" } ] } diff --git a/conf/modules/recalibrate.config b/conf/modules/recalibrate.config index 779c7aefde..9342cc2e9c 100644 --- a/conf/modules/recalibrate.config +++ b/conf/modules/recalibrate.config @@ -25,19 +25,19 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/" }, pattern: "*recal.cram", - saveAs: { !params.save_output_as_bam ? meta.num_intervals > 1 ? null : "recalibrated/${meta.id}/${it}" : null } + saveAs: { filename -> !params.save_output_as_bam ? meta.num_intervals > 1 ? null : "recalibrated/${meta.id}/${filename}" : null } ], [ mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/" }, pattern: "*recal.bam", - saveAs: { params.save_output_as_bam ? meta.num_intervals > 1 ? null : "recalibrated/${meta.id}/${it}" : null } + saveAs: { filename -> params.save_output_as_bam ? meta.num_intervals > 1 ? null : "recalibrated/${meta.id}/${filename}" : null } ], [ mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/" }, pattern: "*recal.bai", - saveAs: { params.save_output_as_bam ? meta.num_intervals > 1 ? null : "recalibrated/${meta.id}/${it.replace('.bai', '.bam.bai')}" : null } + saveAs: { filename -> params.save_output_as_bam ? meta.num_intervals > 1 ? null : "recalibrated/${meta.id}/${filename.replace('.bai', '.bam.bai')}" : null } ]] } @@ -47,7 +47,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/recalibrated/${meta.id}/" }, pattern: "*cram", - saveAs: { !params.save_output_as_bam ? it : null } + saveAs: { filename -> !params.save_output_as_bam ? filename : null } ] } @@ -56,7 +56,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/recalibrated/${meta.id}/" }, pattern: "*{recal.cram,recal.cram.crai}", - saveAs: { !params.save_output_as_bam ? it : null } + saveAs: { filename -> !params.save_output_as_bam ? filename : null } ] } @@ -66,7 +66,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/preprocessing/recalibrated/${meta.id}/" }, pattern: "*bam", - saveAs: { params.save_output_as_bam ? it : null } + saveAs: { filename -> params.save_output_as_bam ? filename : null } ] } @@ -76,7 +76,7 @@ process { path: { "${params.outdir}/preprocessing/recalibrated/${meta.id}/" }, pattern: "*{recal.bam,recal.bam.bai}", // single-interval BAM is already published by GATK4_APPLYBQSR; only publish the merged output here - saveAs: { (params.save_output_as_bam && meta.num_intervals > 1) ? it : null } + saveAs: { filename -> (params.save_output_as_bam && meta.num_intervals > 1) ? filename : null } ] } } diff --git a/conf/modules/sentieon_dedup.config b/conf/modules/sentieon_dedup.config index d0ff1add47..e514ad1164 100644 --- a/conf/modules/sentieon_dedup.config +++ b/conf/modules/sentieon_dedup.config @@ -32,19 +32,19 @@ process { mode: params.publish_dir_mode, path: { params.sentieon_consensus ? "${params.outdir}/preprocessing/sentieon_consensus/${meta.id}/" : "${params.outdir}/preprocessing/sentieon_dedup/${meta.id}/" }, pattern: "*{cram,crai}", - saveAs: { !params.save_output_as_bam ? it : null } + saveAs: { filename -> !params.save_output_as_bam ? filename : null } ], [ mode: params.publish_dir_mode, path: { params.sentieon_consensus ? "${params.outdir}/preprocessing/sentieon_consensus/${meta.id}/" : "${params.outdir}/preprocessing/sentieon_dedup/${meta.id}/" }, pattern: "*{bam,bai}", - saveAs: { params.save_output_as_bam ? it : null } + saveAs: { filename -> params.save_output_as_bam ? filename : null } ], [ mode: params.publish_dir_mode, path: { "${params.outdir}/reports/" }, pattern: "*{metrics,metrics.multiqc.tsv}", - saveAs: { !(params.skip_tools && params.skip_tools.split(',').contains('sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${it}" : null} + saveAs: { filename -> !(params.skip_tools && params.skip_tools.split(',').contains('sentieon_dedup_report')) ? "sentieon_dedup/${meta.id}/${filename}" : null} ] ] } diff --git a/conf/modules/sentieon_dnascope.config b/conf/modules/sentieon_dnascope.config index 50cf373ea8..42207dcec1 100644 --- a/conf/modules/sentieon_dnascope.config +++ b/conf/modules/sentieon_dnascope.config @@ -22,7 +22,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : "sentieon_dnascope/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "sentieon_dnascope/${meta.id}/${filename}" } ] } diff --git a/conf/modules/sentieon_haplotyper.config b/conf/modules/sentieon_haplotyper.config index e3ce58194a..522ec70bd4 100644 --- a/conf/modules/sentieon_haplotyper.config +++ b/conf/modules/sentieon_haplotyper.config @@ -22,7 +22,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : "sentieon_haplotyper/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "sentieon_haplotyper/${meta.id}/${filename}" } ] } diff --git a/conf/modules/sentieon_tnscope.config b/conf/modules/sentieon_tnscope.config index 6c9ded0a80..e8b185d27c 100644 --- a/conf/modules/sentieon_tnscope.config +++ b/conf/modules/sentieon_tnscope.config @@ -25,7 +25,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/"}, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : "sentieon_tnscope/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "sentieon_tnscope/${meta.id}/${filename}" } ] } diff --git a/conf/modules/strelka.config b/conf/modules/strelka.config index badffb5df8..177ec0fb77 100644 --- a/conf/modules/strelka.config +++ b/conf/modules/strelka.config @@ -23,7 +23,7 @@ process { mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/" }, pattern: "*{vcf.gz,vcf.gz.tbi}", - saveAs: { meta.num_intervals > 1 ? null : "strelka/${meta.id}/${it}" } + saveAs: { filename -> meta.num_intervals > 1 ? null : "strelka/${meta.id}/${filename}" } ] } diff --git a/docs/output.md b/docs/output.md index 95c71913be..613966cb85 100644 --- a/docs/output.md +++ b/docs/output.md @@ -827,6 +827,9 @@ The file `.cnvs.txt` contains all segments predicte [CNVKit](https://cnvkit.readthedocs.io/en/stable/) is a toolkit to infer and visualize copy number from high-throughput DNA sequencing data. It is designed for use with hybrid capture, including both whole-exome and custom target panels, and short-read sequencing platforms such as Illumina. For further reading and documentation, see the [CNVKit Documentation](https://cnvkit.readthedocs.io/en/stable/plots.html) +> [!NOTE] +> When starting from `--step variant_calling` with a pre-aligned CRAM/BAM, CNVKit output **file names** follow the base name of the input file rather than the sample ID. Runs starting from FASTQ are unaffected — the sample-based names listed below apply. Output **directories** are always named after the sample (`` / `_vs_`). +
Output files for normal and tumor-only samples diff --git a/main.nf b/main.nf index c03cc52266..2316687d8d 100755 --- a/main.nf +++ b/main.nf @@ -138,7 +138,7 @@ workflow NFCORE_SAREK { // For QC during preprocessing, we don't need any intervals (MOSDEPTH doesn't take them for WGS) intervals_for_preprocessing = params.wes - ? intervals_bed_combined.map { it -> [[id: it.baseName], it] }.collect() + ? intervals_bed_combined.map { bed -> [[id: bed.baseName], bed] }.collect() : channel.value([[id: 'null'], []]) // [ interval, num_intervals ] multiple interval.bed files, divided by useful intervals for scatter/gather intervals = PREPARE_INTERVALS.out.intervals_bed @@ -327,9 +327,9 @@ workflow NFCORE_SAREK { params.varlociraptor_events_somatic, params.varlociraptor_events_tumor_only, params.varlociraptor_fdr, - params.varlociraptor_scenario_germline ? channel.fromPath(params.varlociraptor_scenario_germline).map { it -> [[id: it.baseName - '.yte'], it] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect(), - params.varlociraptor_scenario_somatic ? channel.fromPath(params.varlociraptor_scenario_somatic).map { it -> [[id: it.baseName - '.yte'], it] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect(), - params.varlociraptor_scenario_tumor_only ? channel.fromPath(params.varlociraptor_scenario_tumor_only).map { it -> [[id: it.baseName - '.yte'], it] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect(), + params.varlociraptor_scenario_germline ? channel.fromPath(params.varlociraptor_scenario_germline).map { scenario -> [[id: scenario.baseName - '.yte'], scenario] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_germline.yte.yaml").collect(), + params.varlociraptor_scenario_somatic ? channel.fromPath(params.varlociraptor_scenario_somatic).map { scenario -> [[id: scenario.baseName - '.yte'], scenario] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_somatic.yte.yaml").collect(), + params.varlociraptor_scenario_tumor_only ? channel.fromPath(params.varlociraptor_scenario_tumor_only).map { scenario -> [[id: scenario.baseName - '.yte'], scenario] }.collect() : channel.fromPath("${projectDir}/assets/varlociraptor_tumor_only.yte.yaml").collect(), snpeff_cache, params.snpeff_db, vep_cache, diff --git a/modules/local/consensus_from_sites/main.nf b/modules/local/consensus_from_sites/main.nf index 510cf045e7..254e7cf056 100644 --- a/modules/local/consensus_from_sites/main.nf +++ b/modules/local/consensus_from_sites/main.nf @@ -24,7 +24,6 @@ process CONSENSUS_FROM_SITES { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" def callers = meta.callers.join(',') """ diff --git a/subworkflows/local/bam_baserecalibrator/main.nf b/subworkflows/local/bam_baserecalibrator/main.nf index 70563ab461..cc6f833a2d 100644 --- a/subworkflows/local/bam_baserecalibrator/main.nf +++ b/subworkflows/local/bam_baserecalibrator/main.nf @@ -36,10 +36,10 @@ workflow BAM_BASERECALIBRATOR { ) // Figuring out if there is one or more table(s) from the same sample - table_to_merge = GATK4_BASERECALIBRATOR.out.table.map{ meta, table -> [ groupKey(meta, meta.num_intervals), table ] }.groupTuple().branch{ + table_to_merge = GATK4_BASERECALIBRATOR.out.table.map{ meta, table -> [ groupKey(meta, meta.num_intervals), table ] }.groupTuple().branch{ meta, _table -> // Use meta.num_intervals to asses number of intervals - single: it[0].num_intervals <= 1 - multiple: it[0].num_intervals > 1 + single: meta.num_intervals <= 1 + multiple: meta.num_intervals > 1 } // Only when using intervals diff --git a/subworkflows/local/bam_baserecalibrator_spark/main.nf b/subworkflows/local/bam_baserecalibrator_spark/main.nf index 26a881b313..39ff897bed 100644 --- a/subworkflows/local/bam_baserecalibrator_spark/main.nf +++ b/subworkflows/local/bam_baserecalibrator_spark/main.nf @@ -26,13 +26,13 @@ workflow BAM_BASERECALIBRATOR_SPARK { .map{ meta, cram_, crai, intervals_, num_intervals -> [ meta + [ num_intervals:num_intervals ], cram_, crai, intervals_ ] } // RUN BASERECALIBRATOR SPARK - GATK4SPARK_BASERECALIBRATOR(cram_intervals, fasta.map{ meta, it -> [ it ] }, fasta_fai.map{ meta, it -> [ it ] }, dict.map{ meta, it -> [ it ] }, known_sites, known_sites_tbi) + GATK4SPARK_BASERECALIBRATOR(cram_intervals, fasta.map{ _meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }, dict.map{ _meta, dict_ -> [ dict_ ] }, known_sites, known_sites_tbi) // Figuring out if there is one or more table(s) from the same sample - table_to_merge = GATK4SPARK_BASERECALIBRATOR.out.table.map{ meta, table -> [ groupKey(meta, meta.num_intervals), table ] }.groupTuple().branch{ + table_to_merge = GATK4SPARK_BASERECALIBRATOR.out.table.map{ meta, table -> [ groupKey(meta, meta.num_intervals), table ] }.groupTuple().branch{ meta, _table -> // Use meta.num_intervals to asses number of intervals - single: it[0].num_intervals <= 1 - multiple: it[0].num_intervals > 1 + single: meta.num_intervals <= 1 + multiple: meta.num_intervals > 1 } // Only when using intervals diff --git a/subworkflows/local/bam_joint_calling_germline_gatk/main.nf b/subworkflows/local/bam_joint_calling_germline_gatk/main.nf index d7d04fc094..a9973ba218 100644 --- a/subworkflows/local/bam_joint_calling_germline_gatk/main.nf +++ b/subworkflows/local/bam_joint_calling_germline_gatk/main.nf @@ -52,7 +52,7 @@ workflow BAM_JOINT_CALLING_GERMLINE_GATK { // Joint genotyping performed using GenotypeGVCFs // Sort vcfs called by interval within each VCF - GATK4_GENOTYPEGVCFS(genotype_input, fasta, fai, dict, dbsnp.map{ it -> [ [:], it ] }, dbsnp_tbi.map{ it -> [ [:], it ] }) + GATK4_GENOTYPEGVCFS(genotype_input, fasta, fai, dict, dbsnp.map{ dbsnp_ -> [ [:], dbsnp_ ] }, dbsnp_tbi.map{ dbsnp_tbi_ -> [ [:], dbsnp_tbi_ ] }) BCFTOOLS_SORT(GATK4_GENOTYPEGVCFS.out.vcf) gvcf_to_merge = BCFTOOLS_SORT.out.vcf.map{ meta, vcf -> [ meta.subMap('num_intervals') + [ id:'joint_variant_calling', patient:'all_samples', variantcaller:'haplotypecaller' ], vcf ]}.groupTuple() diff --git a/subworkflows/local/bam_markduplicates/main.nf b/subworkflows/local/bam_markduplicates/main.nf index baed8ec73e..d3fb73f0f7 100644 --- a/subworkflows/local/bam_markduplicates/main.nf +++ b/subworkflows/local/bam_markduplicates/main.nf @@ -21,7 +21,7 @@ workflow BAM_MARKDUPLICATES { // RUN MARKUPDUPLICATES // --CREATE_INDEX true is set via ext.args when --save_output_as_bam, so the // module emits .bai inline; CRAM mode emits .crai via samtools post-conversion. - GATK4_MARKDUPLICATES(bam, fasta.map{ meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ meta, fasta_fai_ -> [ fasta_fai_ ] }) + GATK4_MARKDUPLICATES(bam, fasta.map{ _meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }) // Unified alignment output — BAM or CRAM depending on save_output_as_bam alignment = GATK4_MARKDUPLICATES.out.bam diff --git a/subworkflows/local/bam_markduplicates_spark/main.nf b/subworkflows/local/bam_markduplicates_spark/main.nf index e897b6088b..96de5aef24 100644 --- a/subworkflows/local/bam_markduplicates_spark/main.nf +++ b/subworkflows/local/bam_markduplicates_spark/main.nf @@ -22,7 +22,7 @@ workflow BAM_MARKDUPLICATES_SPARK { reports = channel.empty() // RUN MARKUPDUPLICATES SPARK - GATK4SPARK_MARKDUPLICATES(bam, fasta.map{ meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ meta, fasta_fai_ -> [ fasta_fai_ ] }, dict.map{ meta, dict_ -> [ dict_ ] }) + GATK4SPARK_MARKDUPLICATES(bam, fasta.map{ _meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }, dict.map{ _meta, dict_ -> [ dict_ ] }) // Index output (BAM or CRAM depending on ext.prefix) INDEX_MARKDUPLICATES(GATK4SPARK_MARKDUPLICATES.out.output) @@ -35,7 +35,7 @@ workflow BAM_MARKDUPLICATES_SPARK { CRAM_QC_MOSDEPTH_SAMTOOLS(alignment, fasta, intervals_bed_combined) // When running Marduplicates spark, and saving reports - GATK4_ESTIMATELIBRARYCOMPLEXITY(bam, fasta.map{ meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ meta, fasta_fai_ -> [ fasta_fai_ ] }, dict.map{ meta, dict_ -> [ dict_ ] }) + GATK4_ESTIMATELIBRARYCOMPLEXITY(bam, fasta.map{ _meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }, dict.map{ _meta, dict_ -> [ dict_ ] }) // Gather all reports generated reports = reports.mix(GATK4_ESTIMATELIBRARYCOMPLEXITY.out.metrics) diff --git a/subworkflows/local/bam_variant_calling_deepvariant/main.nf b/subworkflows/local/bam_variant_calling_deepvariant/main.nf index 9047358866..b5bd8d4f64 100644 --- a/subworkflows/local/bam_variant_calling_deepvariant/main.nf +++ b/subworkflows/local/bam_variant_calling_deepvariant/main.nf @@ -27,17 +27,17 @@ workflow BAM_VARIANT_CALLING_DEEPVARIANT { DEEPVARIANT_RUNDEEPVARIANT(cram_intervals, fasta, fasta_fai, [ [ id:'null' ], [] ], [ [ id:'null' ], [] ]) // Figuring out if there is one or more vcf(s) from the same sample - vcf_out = DEEPVARIANT_RUNDEEPVARIANT.out.vcf.branch{ + vcf_out = DEEPVARIANT_RUNDEEPVARIANT.out.vcf.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more gvcf(s) from the same sample - gvcf_out = DEEPVARIANT_RUNDEEPVARIANT.out.gvcf.branch{ + gvcf_out = DEEPVARIANT_RUNDEEPVARIANT.out.gvcf.branch{ meta, _gvcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals @@ -48,10 +48,10 @@ workflow BAM_VARIANT_CALLING_DEEPVARIANT { MERGE_DEEPVARIANT_VCF(vcf_to_merge, dict) // Figuring out if there is one or more tbi(s) from the same sample - tbi_out = DEEPVARIANT_RUNDEEPVARIANT.out.vcf_index.branch{ + tbi_out = DEEPVARIANT_RUNDEEPVARIANT.out.vcf_index.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Mix intervals and no_intervals channels together diff --git a/subworkflows/local/bam_variant_calling_freebayes/main.nf b/subworkflows/local/bam_variant_calling_freebayes/main.nf index a078c157a7..e2a8d4d452 100644 --- a/subworkflows/local/bam_variant_calling_freebayes/main.nf +++ b/subworkflows/local/bam_variant_calling_freebayes/main.nf @@ -32,10 +32,10 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { BCFTOOLS_SORT(FREEBAYES.out.vcf) // Figuring out if there is one or more vcf(s) from the same sample - bcftools_vcf_out = BCFTOOLS_SORT.out.vcf.branch{ + bcftools_vcf_out = BCFTOOLS_SORT.out.vcf.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 7e9b5c9469..d0ff46289a 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -55,8 +55,10 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { versions = channel.empty() //TODO: Temporary until the if's can be removed and printing to terminal is prevented with "when" in the modules.config - gvcf_sentieon_dnascope = channel.empty() - gvcf_sentieon_haplotyper = channel.empty() + gvcf_sentieon_dnascope = channel.empty() + gvcf_sentieon_haplotyper = channel.empty() + gvcf_tbi_sentieon_dnascope = channel.empty() + gvcf_tbi_sentieon_haplotyper = channel.empty() out_indexcov = channel.empty() vcf_deepvariant = channel.empty() @@ -96,11 +98,12 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { if (tools && tools.split(',').contains('cnvkit')) { BAM_VARIANT_CALLING_CNVKIT( // Remap channel to match module/subworkflow - cram.map{ meta, cram_, crai -> [ meta, [], cram_ ] }, + // Use the already-converted BAM (shared with somatic/tumor-only) instead of CRAM + bam.map{ meta, bam_, _bai -> [ meta, [], bam_ ] }, fasta, fasta_fai, - intervals_bed_combined.map{it -> it ? [[id:it[0].baseName], it]: [[id:'no_intervals'], []]}, - params.cnvkit_reference ? cnvkit_reference.map{ it -> [[id:it[0].baseName], it] } : [[:],[]] + intervals_bed_combined.map{_intervals -> _intervals ? [[id:_intervals[0].baseName], _intervals]: [[id:'no_intervals'], []]}, + params.cnvkit_reference ? cnvkit_reference.map{ reference -> [[id:reference[0].baseName], reference] } : [[:],[]] ) versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT.out.versions) } @@ -143,8 +146,8 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { fasta, fasta_fai, dict, - dbsnp.map{it -> [[:], it]}, - dbsnp_tbi.map{it -> [[:], it]}, + dbsnp.map{dbsnp_ -> [[:], dbsnp_]}, + dbsnp_tbi.map{dbsnp_tbi_ -> [[:], dbsnp_tbi_]}, intervals) vcf_haplotypecaller = BAM_VARIANT_CALLING_HAPLOTYPECALLER.out.vcf @@ -178,9 +181,9 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { VCF_VARIANT_FILTERING_GATK( vcf_haplotypecaller.join(tbi_haplotypecaller, failOnDuplicate: true, failOnMismatch: true), - fasta.map{ meta, fasta_ -> [ fasta_ ] }, - fasta_fai.map{ meta, fasta_fai_ -> [ fasta_fai_ ] }, - dict.map{ meta, dict_ -> [ dict_ ] }, + fasta.map{ _meta, fasta_ -> [ fasta_ ] }, + fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }, + dict.map{ _meta, dict_ -> [ dict_ ] }, intervals_bed_combined_haplotypec, known_sites_indels.concat(known_sites_snps).flatten().unique().collect(), known_sites_indels_tbi.concat(known_sites_snps_tbi).flatten().unique().collect()) @@ -202,8 +205,8 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { intervals_bed_gz_tbi_combined ) - vcf_manta = BAM_VARIANT_CALLING_GERMLINE_MANTA.out.vcf - tbi_manta = BAM_VARIANT_CALLING_GERMLINE_MANTA.out.tbi + vcf_manta = BAM_VARIANT_CALLING_GERMLINE_MANTA.out.diploid_sv_vcf + tbi_manta = BAM_VARIANT_CALLING_GERMLINE_MANTA.out.diploid_sv_vcf_tbi versions = versions.mix(BAM_VARIANT_CALLING_GERMLINE_MANTA.out.versions) } @@ -228,7 +231,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { dict, dbsnp, dbsnp_tbi, - dbsnp_vqsr, intervals, joint_germline, sentieon_dnascope_emit_mode, @@ -288,7 +290,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { dict, dbsnp, dbsnp_tbi, - dbsnp_vqsr, intervals, joint_germline, sentieon_haplotyper_emit_mode) @@ -327,9 +328,9 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { SENTIEON_HAPLOTYPER_VCF_VARIANT_FILTERING_GATK( vcf_sentieon_haplotyper.join(tbi_sentieon_haplotyper, failOnDuplicate: true, failOnMismatch: true), - fasta.map{ meta, it -> [ it ] }, - fasta_fai.map{ meta, it -> [ it ] }, - dict.map{ meta, dict_ -> [ dict_ ] }, + fasta.map{ _meta, fasta_ -> [ fasta_ ] }, + fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }, + dict.map{ _meta, dict_ -> [ dict_ ] }, intervals_bed_combined_haplotypec, known_sites_indels.concat(known_sites_snps).flatten().unique().collect(), known_sites_indels_tbi.concat(known_sites_snps_tbi).flatten().unique().collect()) @@ -349,8 +350,8 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { BAM_VARIANT_CALLING_SINGLE_STRELKA( cram, dict, - fasta.map{ meta, fasta_ -> [ fasta_ ] }, - fasta_fai.map{ meta, fasta_fai_ -> [ fasta_fai_ ] }, + fasta.map{ _meta, fasta_ -> [ fasta_ ] }, + fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }, intervals_bed_gz_tbi ) @@ -400,6 +401,8 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { emit: gvcf_sentieon_dnascope gvcf_sentieon_haplotyper + gvcf_tbi_sentieon_dnascope + gvcf_tbi_sentieon_haplotyper out_indexcov vcf_all vcf_deepvariant diff --git a/subworkflows/local/bam_variant_calling_germline_manta/main.nf b/subworkflows/local/bam_variant_calling_germline_manta/main.nf index 1c086ec6ca..27289fb833 100644 --- a/subworkflows/local/bam_variant_calling_germline_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_manta/main.nf @@ -18,30 +18,32 @@ workflow BAM_VARIANT_CALLING_GERMLINE_MANTA { versions = channel.empty() // Combine cram and intervals, account for 0 intervals - cram_intervals = cram.combine(intervals).map{ it -> - def bed_gz = it.size() > 3 ? it[3] : [] - def bed_tbi = it.size() > 3 ? it[4] : [] + cram_intervals = cram.combine(intervals).map{ combined -> + def bed_gz = combined.size() > 3 ? combined[3] : [] + def bed_tbi = combined.size() > 3 ? combined[4] : [] - [it[0], it[1], it[2], bed_gz, bed_tbi] + [combined[0], combined[1], combined[2], bed_gz, bed_tbi] } MANTA_GERMLINE(cram_intervals, fasta, fasta_fai, []) - small_indels_vcf = MANTA_GERMLINE.out.candidate_small_indels_vcf - sv_vcf = MANTA_GERMLINE.out.candidate_sv_vcf - diploid_sv_vcf = MANTA_GERMLINE.out.diploid_sv_vcf - diploid_sv_vcf_tbi = MANTA_GERMLINE.out.diploid_sv_vcf_tbi - - // Only diploid SV should get annotated // add variantcaller to meta map - vcf = diploid_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } - tbi = diploid_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + candidate_small_indels_vcf = MANTA_GERMLINE.out.candidate_small_indels_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + candidate_small_indels_vcf_tbi = MANTA_GERMLINE.out.candidate_small_indels_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + candidate_sv_vcf = MANTA_GERMLINE.out.candidate_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + candidate_sv_vcf_tbi = MANTA_GERMLINE.out.candidate_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + diploid_sv_vcf = MANTA_GERMLINE.out.diploid_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + diploid_sv_vcf_tbi = MANTA_GERMLINE.out.diploid_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } versions = versions.mix(MANTA_GERMLINE.out.versions) emit: - vcf - tbi + candidate_small_indels_vcf + candidate_small_indels_vcf_tbi + candidate_sv_vcf + candidate_sv_vcf_tbi + diploid_sv_vcf + diploid_sv_vcf_tbi versions } diff --git a/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf b/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf index c700d29cfd..a05ee92e4d 100644 --- a/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf +++ b/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf @@ -42,34 +42,34 @@ workflow BAM_VARIANT_CALLING_HAPLOTYPECALLER { gvcf_tbi_intervals = GATK4_HAPLOTYPECALLER.out.vcf .join(GATK4_HAPLOTYPECALLER.out.tbi, failOnMismatch: true) .join(cram_intervals, failOnMismatch: true) - .map{ meta, gvcf, tbi, _cram, _crai, intervals_, dragstr_model -> [ meta, gvcf, tbi, intervals_ ] } + .map{ meta, gvcf, tbi, _cram, _crai, intervals_, _dragstr_model -> [ meta, gvcf, tbi, intervals_ ] } // Figuring out if there is one or more vcf(s) from the same sample haplotypecaller_vcf = GATK4_HAPLOTYPECALLER.out.vcf.map{ meta, vcf_ -> [ meta - meta.subMap('interval_name'), vcf_] } - .branch{ + .branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample haplotypecaller_tbi = GATK4_HAPLOTYPECALLER.out.tbi.map{ meta, tbi -> [ meta - meta.subMap('interval_name'), tbi] - }.branch{ + }.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more bam(s) from the same sample haplotypecaller_bam = GATK4_HAPLOTYPECALLER.out.bam.map{ meta, bam -> [ meta - meta.subMap('interval_name'), bam] - }.branch{ + }.branch{ meta, _bam -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals diff --git a/subworkflows/local/bam_variant_calling_indexcov/main.nf b/subworkflows/local/bam_variant_calling_indexcov/main.nf index 2f13b44f56..4255de91cc 100644 --- a/subworkflows/local/bam_variant_calling_indexcov/main.nf +++ b/subworkflows/local/bam_variant_calling_indexcov/main.nf @@ -27,7 +27,7 @@ workflow BAM_VARIANT_CALLING_INDEXCOV { versions = versions.mix(reindex_ch.versions) // create [ [id:directory], bams, bais ] - indexcov_input_ch = reindex_ch.output.map{[[id:"indexcov"], it[1], it[2]]}.groupTuple() + indexcov_input_ch = reindex_ch.output.map{ _meta, bam, bai -> [[id:"indexcov"], bam, bai]}.groupTuple() goleft_ch = GOLEFT_INDEXCOV( indexcov_input_ch, diff --git a/subworkflows/local/bam_variant_calling_mpileup/main.nf b/subworkflows/local/bam_variant_calling_mpileup/main.nf index 1c601a4993..d46aa77b1b 100644 --- a/subworkflows/local/bam_variant_calling_mpileup/main.nf +++ b/subworkflows/local/bam_variant_calling_mpileup/main.nf @@ -38,21 +38,21 @@ workflow BAM_VARIANT_CALLING_MPILEUP { SAMTOOLS_MPILEUP(cram_intervals, fasta) // Figuring out if there is one or more vcf(s) from the same sample - vcf_mpileup = BCFTOOLS_MPILEUP.out.vcf.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + vcf_mpileup = BCFTOOLS_MPILEUP.out.vcf.branch { meta, _vcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_mpileup = BCFTOOLS_MPILEUP.out.index.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + tbi_mpileup = BCFTOOLS_MPILEUP.out.index.branch { meta, _tbi -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more mpileup(s) from the same sample - mpileup_samtools = SAMTOOLS_MPILEUP.out.mpileup.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + mpileup_samtools = SAMTOOLS_MPILEUP.out.mpileup.branch { meta, _mpileup -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Merge mpileup and natural order sort them diff --git a/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf b/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf index 92570194dd..5c4fd80957 100644 --- a/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf +++ b/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf @@ -16,7 +16,6 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { dict // channel: [mandatory] dbsnp // channel: [optional] dbsnp_tbi // channel: [optional] - dbsnp_vqsr // channel: [optional] intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals joint_germline // boolean: [mandatory] [default: false] joint calling of germline variants sentieon_dnascope_emit_mode // string @@ -44,7 +43,7 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { ] } - emit_mode_items = sentieon_dnascope_emit_mode.split(',').each{ it -> it.toLowerCase().trim() } + emit_mode_items = sentieon_dnascope_emit_mode.split(',').each{ mode -> mode.toLowerCase().trim() } lst = emit_mode_items - 'gvcf' emit_vcf = lst.size() > 0 ? lst[0] : '' @@ -52,12 +51,12 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { cram_intervals_for_sentieon, fasta, fasta_fai, - dbsnp.map{it -> [[:], it]}, - dbsnp_tbi.map{it -> [[:], it]}, - sentieon_dnascope_model.map{it -> [[:], it]}, + dbsnp.map{dbsnp_ -> [[:], dbsnp_]}, + dbsnp_tbi.map{dbsnp_tbi_ -> [[:], dbsnp_tbi_]}, + sentieon_dnascope_model.map{sentieon_dnascope_model_ -> [[:], sentieon_dnascope_model_]}, sentieon_dnascope_pcr_indel_model, emit_vcf, - emit_mode_items.any{ it.equals('gvcf') }) + emit_mode_items.any{ mode -> mode.equals('gvcf') }) if (joint_germline) { genotype_intervals = SENTIEON_DNASCOPE.out.gvcf @@ -72,33 +71,33 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { dnascope_vcf_branch = SENTIEON_DNASCOPE.out.vcf.map{ meta, vcf_ -> [ meta - meta.subMap('intervals_name'), vcf_] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _vcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } dnascope_vcf_tbi_branch = SENTIEON_DNASCOPE.out.vcf_tbi.map{ meta, vcf_tbi -> [ meta - meta.subMap('intervals_name'), vcf_tbi] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _tbi -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } haplotyper_gvcf_branch = SENTIEON_DNASCOPE.out.gvcf.map{ meta, gvcf_ -> [ meta - meta.subMap('intervals_name'), gvcf_] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _gvcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } haplotyper_gvcf_tbi_branch = SENTIEON_DNASCOPE.out.gvcf_tbi.map{ meta, gvcf_tbi -> [ meta - meta.subMap('intervals_name'), gvcf_tbi] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _tbi -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Per-sample merge. Wrap the (already-`intervals_name`-stripped) meta in diff --git a/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf b/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf index a2aba1ade3..f014af1740 100644 --- a/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf +++ b/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf @@ -16,7 +16,6 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { dict // channel: [mandatory] dbsnp // channel: [optional] dbsnp_tbi // channel: [optional] - dbsnp_vqsr // channel: [optional] intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals joint_germline // boolean: [mandatory] [default: false] joint calling of germline variants sentieon_haplotyper_emit_mode @@ -42,7 +41,7 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { ] } - emit_mode_items = sentieon_haplotyper_emit_mode.split(',').each{ it -> it.toLowerCase().trim() } + emit_mode_items = sentieon_haplotyper_emit_mode.split(',').each{ mode -> mode.toLowerCase().trim() } lst = emit_mode_items - 'gvcf' emit_vcf = lst.size() > 0 ? lst[0] : '' @@ -53,7 +52,7 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { dbsnp.map{file -> [[id:'dbsnp'], file]}, dbsnp_tbi.map{file -> [[id:'dbsnp'], file]}, emit_vcf, - emit_mode_items.any{ it.equals('gvcf') }) + emit_mode_items.any{ mode -> mode.equals('gvcf') }) if (joint_germline) { genotype_intervals = SENTIEON_HAPLOTYPER.out.gvcf @@ -68,33 +67,33 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { haplotyper_vcf_branch = SENTIEON_HAPLOTYPER.out.vcf.map{ meta, vcf_ -> [ meta - meta.subMap('intervals_name'), vcf_] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _vcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } haplotyper_vcf_tbi_branch = SENTIEON_HAPLOTYPER.out.vcf_tbi.map{ meta, vcf_tbi -> [ meta - meta.subMap('intervals_name'), vcf_tbi] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _tbi -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } haplotyper_gvcf_branch = SENTIEON_HAPLOTYPER.out.gvcf.map{ meta, gvcf_ -> [ meta - meta.subMap('intervals_name'), gvcf_] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _gvcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } haplotyper_gvcf_tbi_branch = SENTIEON_HAPLOTYPER.out.gvcf_tbi.map{ meta, gvcf_tbi -> [ meta - meta.subMap('intervals_name'), gvcf_tbi] } - .branch{ - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + .branch{ meta, _tbi -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Per-sample merge. Wrap the (already-`intervals_name`-stripped) meta in diff --git a/subworkflows/local/bam_variant_calling_single_strelka/main.nf b/subworkflows/local/bam_variant_calling_single_strelka/main.nf index 6c469651e2..004a57ca2c 100644 --- a/subworkflows/local/bam_variant_calling_single_strelka/main.nf +++ b/subworkflows/local/bam_variant_calling_single_strelka/main.nf @@ -27,24 +27,24 @@ workflow BAM_VARIANT_CALLING_SINGLE_STRELKA { STRELKA_SINGLE(cram_intervals, fasta, fasta_fai) // Figuring out if there is one or more vcf(s) from the same sample - genome_vcf = STRELKA_SINGLE.out.genome_vcf.branch{ + genome_vcf = STRELKA_SINGLE.out.genome_vcf.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more vcf(s) from the same sample - vcf_out = STRELKA_SINGLE.out.vcf.branch{ + vcf_out = STRELKA_SINGLE.out.vcf.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_out = STRELKA_SINGLE.out.vcf_tbi.branch{ + tbi_out = STRELKA_SINGLE.out.vcf_tbi.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals diff --git a/subworkflows/local/bam_variant_calling_single_tiddit/main.nf b/subworkflows/local/bam_variant_calling_single_tiddit/main.nf index ad101d1590..cea076093f 100644 --- a/subworkflows/local/bam_variant_calling_single_tiddit/main.nf +++ b/subworkflows/local/bam_variant_calling_single_tiddit/main.nf @@ -21,8 +21,8 @@ workflow BAM_VARIANT_CALLING_SINGLE_TIDDIT { TABIX_BGZIP_TIDDIT_SV(TIDDIT_SV.out.vcf) ploidy = TIDDIT_SV.out.ploidy - vcf = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, gz, tbi -> [meta + [variantcaller: 'tiddit'], gz] } - tbi = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, gz, tbi -> [meta + [variantcaller: 'tiddit'], tbi] } + vcf = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, gz, _tbi -> [meta + [variantcaller: 'tiddit'], gz] } + tbi = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, _gz, tbi -> [meta + [variantcaller: 'tiddit'], tbi] } versions = versions.mix(TIDDIT_SV.out.versions) diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index f43549b2f1..e0027be4fc 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -163,8 +163,8 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { intervals_bed_gz_tbi_combined, ) - vcf_manta = BAM_VARIANT_CALLING_SOMATIC_MANTA.out.vcf - tbi_manta = BAM_VARIANT_CALLING_SOMATIC_MANTA.out.tbi + vcf_manta = BAM_VARIANT_CALLING_SOMATIC_MANTA.out.diploid_sv_vcf.mix(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.somatic_sv_vcf) + tbi_manta = BAM_VARIANT_CALLING_SOMATIC_MANTA.out.diploid_sv_vcf_tbi.mix(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.somatic_sv_vcf_tbi) versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.versions) } @@ -186,7 +186,8 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { // STRELKA if (tools && tools.split(',').contains('strelka')) { cram_strelka = tools.split(',').contains('manta') - ? cram.join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf, failOnDuplicate: true, failOnMismatch: true).join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf_tbi, failOnDuplicate: true, failOnMismatch: true) + // Manta's candidate small indels feed Strelka; strip the manta variantcaller tag so the meta matches cram for the join + ? cram.join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf.map { meta, vcf -> [meta - meta.subMap('variantcaller'), vcf] }, failOnDuplicate: true, failOnMismatch: true).join(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.candidate_small_indels_vcf_tbi.map { meta, tbi -> [meta - meta.subMap('variantcaller'), tbi] }, failOnDuplicate: true, failOnMismatch: true) : cram.map { meta, normal_cram, normal_crai, tumor_cram, tumor_crai -> [meta, normal_cram, normal_crai, tumor_cram, tumor_crai, [], []] } BAM_VARIANT_CALLING_SOMATIC_STRELKA( diff --git a/subworkflows/local/bam_variant_calling_somatic_controlfreec/main.nf b/subworkflows/local/bam_variant_calling_somatic_controlfreec/main.nf index 43ef6a74d3..1234ec96f2 100644 --- a/subworkflows/local/bam_variant_calling_somatic_controlfreec/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_controlfreec/main.nf @@ -29,7 +29,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_CONTROLFREEC { //Creates empty channel if file is missing cnv_files = FREEC_SOMATIC.out.CNV .map{ meta, cnv -> - def tumor_file = cnv instanceof List ? cnv.find { it.toString().endsWith("gz_CNVs") } : cnv //only find if its a list, else it returns only the filename without the path + def tumor_file = cnv instanceof List ? cnv.find { cnv_file -> cnv_file.toString().endsWith("gz_CNVs") } : cnv //only find if its a list, else it returns only the filename without the path if (!tumor_file){ error("CNVs tumor file not found for sample $meta.id") } @@ -38,7 +38,7 @@ workflow BAM_VARIANT_CALLING_SOMATIC_CONTROLFREEC { ratio_files = FREEC_SOMATIC.out.ratio .map{ meta, ratio -> - def tumor_file = ratio instanceof List ? ratio.find { it.toString().endsWith("gz_ratio.txt") } : ratio //same here as cnv + def tumor_file = ratio instanceof List ? ratio.find { ratio_file -> ratio_file.toString().endsWith("gz_ratio.txt") } : ratio //same here as cnv if (!tumor_file){ error("Ratio tumor file not found for sample $meta.id") } diff --git a/subworkflows/local/bam_variant_calling_somatic_manta/main.nf b/subworkflows/local/bam_variant_calling_somatic_manta/main.nf index e4ab083fca..f1766192c8 100644 --- a/subworkflows/local/bam_variant_calling_somatic_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_manta/main.nf @@ -17,35 +17,36 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MANTA { versions = channel.empty() // Combine cram and intervals, account for 0 intervals - cram_intervals = cram.combine(intervals).map{ it -> - def bed_gz = it.size() > 5 ? it[5] : [] - def bed_tbi = it.size() > 5 ? it[6] : [] + cram_intervals = cram.combine(intervals).map{ combined -> + def bed_gz = combined.size() > 5 ? combined[5] : [] + def bed_tbi = combined.size() > 5 ? combined[6] : [] - [it[0], it[1], it[2], it[3], it[4], bed_gz, bed_tbi] + [combined[0], combined[1], combined[2], combined[3], combined[4], bed_gz, bed_tbi] } MANTA_SOMATIC(cram_intervals, fasta, fasta_fai, []) - candidate_small_indels_vcf = MANTA_SOMATIC.out.candidate_small_indels_vcf - candidate_small_indels_vcf_tbi = MANTA_SOMATIC.out.candidate_small_indels_vcf_tbi - candidate_sv_vcf = MANTA_SOMATIC.out.candidate_sv_vcf - diploid_sv_vcf = MANTA_SOMATIC.out.diploid_sv_vcf - diploid_sv_vcf_tbi = MANTA_SOMATIC.out.diploid_sv_vcf_tbi - somatic_sv_vcf = MANTA_SOMATIC.out.somatic_sv_vcf - somatic_sv_vcf_tbi = MANTA_SOMATIC.out.somatic_sv_vcf_tbi - - // Only diploid and somatic SV should get annotated // add variantcaller to meta map - vcf = channel.empty().mix(diploid_sv_vcf, somatic_sv_vcf).map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } - tbi = channel.empty().mix(diploid_sv_vcf_tbi, somatic_sv_vcf_tbi).map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + candidate_small_indels_vcf = MANTA_SOMATIC.out.candidate_small_indels_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + candidate_small_indels_vcf_tbi = MANTA_SOMATIC.out.candidate_small_indels_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + candidate_sv_vcf = MANTA_SOMATIC.out.candidate_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + candidate_sv_vcf_tbi = MANTA_SOMATIC.out.candidate_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + diploid_sv_vcf = MANTA_SOMATIC.out.diploid_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + diploid_sv_vcf_tbi = MANTA_SOMATIC.out.diploid_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + somatic_sv_vcf = MANTA_SOMATIC.out.somatic_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + somatic_sv_vcf_tbi = MANTA_SOMATIC.out.somatic_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } versions = versions.mix(MANTA_SOMATIC.out.versions) emit: candidate_small_indels_vcf candidate_small_indels_vcf_tbi - vcf - tbi + candidate_sv_vcf + candidate_sv_vcf_tbi + diploid_sv_vcf + diploid_sv_vcf_tbi + somatic_sv_vcf + somatic_sv_vcf_tbi versions } diff --git a/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf b/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf index e8e9dea649..8b65207486 100644 --- a/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf @@ -32,8 +32,8 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { // If no germline resource is provided, then create an empty channel to avoid GetPileupsummaries from being run // Handle channel.value([]) input from prepare_genome by converting to proper empty channel - germline_resource_pileup = germline_resource.filter { it != [] } - germline_resource_pileup_tbi = germline_resource_tbi.filter { it != [] } + germline_resource_pileup = germline_resource.filter { germline_resource_ -> germline_resource_ != [] } + germline_resource_pileup_tbi = germline_resource_tbi.filter { germline_resource_tbi_ -> germline_resource_tbi_ != [] } // Combine input and intervals for spread and gather strategy // Move num_intervals to meta map and reorganize channel for MUTECT2_PAIRED module @@ -68,27 +68,27 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { } // Figuring out if there is one or more vcf(s) from the same sample - vcf_branch = MUTECT2_PAIRED.out.vcf.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + vcf_branch = MUTECT2_PAIRED.out.vcf.branch { meta, _vcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_branch = MUTECT2_PAIRED.out.tbi.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + tbi_branch = MUTECT2_PAIRED.out.tbi.branch { meta, _tbi -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more vcf(s) from the same sample - stats_branch = MUTECT2_PAIRED.out.stats.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + stats_branch = MUTECT2_PAIRED.out.stats.branch { meta, _stats -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more vcf(s) from the same sample - f1r2_branch = MUTECT2_PAIRED.out.f1r2.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + f1r2_branch = MUTECT2_PAIRED.out.f1r2.branch { meta, _f1r2 -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals @@ -141,15 +141,15 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { GETPILEUPSUMMARIES_TUMOR(pileup_tumor, fasta, fai, dict, germline_resource_pileup, germline_resource_pileup_tbi) // Figuring out if there is one or more table(s) from the same sample - pileup_table_normal_branch = GETPILEUPSUMMARIES_NORMAL.out.table.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + pileup_table_normal_branch = GETPILEUPSUMMARIES_NORMAL.out.table.branch { meta, _table -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more table(s) from the same sample - pileup_table_tumor_branch = GETPILEUPSUMMARIES_TUMOR.out.table.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + pileup_table_tumor_branch = GETPILEUPSUMMARIES_TUMOR.out.table.branch { meta, _table -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals @@ -220,12 +220,12 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { vcf_mutect2 = FILTERMUTECTCALLS.out.vcf .map { meta, vcf_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], vcf_] } .concat(vcf.map { meta, vcf_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], vcf_] }) - .unique { it[0] } + .unique { meta, _vcf -> meta } tbi_mutect2 = FILTERMUTECTCALLS.out.tbi .map { meta, tbi_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], tbi_] } .concat(tbi.map { meta, tbi_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], tbi_] }) - .unique { it[0] } + .unique { meta, _tbi -> meta } versions = versions.mix(CALCULATECONTAMINATION.out.versions) versions = versions.mix(FILTERMUTECTCALLS.out.versions) diff --git a/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf b/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf index eb960e5131..ae73178155 100644 --- a/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf @@ -27,17 +27,17 @@ workflow BAM_VARIANT_CALLING_SOMATIC_STRELKA { STRELKA_SOMATIC(cram_intervals, fasta, fasta_fai ) // Figuring out if there is one or more vcf(s) from the same sample - vcf_indels = STRELKA_SOMATIC.out.vcf_indels.branch{ + vcf_indels = STRELKA_SOMATIC.out.vcf_indels.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more vcf(s) from the same sample - vcf_snvs = STRELKA_SOMATIC.out.vcf_snvs.branch{ + vcf_snvs = STRELKA_SOMATIC.out.vcf_snvs.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals @@ -48,17 +48,17 @@ workflow BAM_VARIANT_CALLING_SOMATIC_STRELKA { MERGE_STRELKA_SNVS(vcf_snvs_to_merge, dict) // Figuring out if there is one or more tbi(s) from the same sample - tbi_indels = STRELKA_SOMATIC.out.vcf_indels_tbi.branch{ + tbi_indels = STRELKA_SOMATIC.out.vcf_indels_tbi.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_snvs = STRELKA_SOMATIC.out.vcf_snvs_tbi.branch{ + tbi_snvs = STRELKA_SOMATIC.out.vcf_snvs_tbi.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Mix intervals and no_intervals channels together diff --git a/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf b/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf index 8f0e083a59..c66b1b9148 100644 --- a/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf @@ -38,16 +38,16 @@ workflow BAM_VARIANT_CALLING_SOMATIC_TNSCOPE { [[],[]] // cosmic_tbi ) // Figuring out if there is one or more vcf(s) from the same sample - vcf_branch = SENTIEON_TNSCOPE.out.vcf.branch{ + vcf_branch = SENTIEON_TNSCOPE.out.vcf.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_branch = SENTIEON_TNSCOPE.out.index.branch{ + tbi_branch = SENTIEON_TNSCOPE.out.index.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } vcf_to_merge = vcf_branch.intervals.map{ meta, vcf -> [ groupKey(meta, meta.num_intervals), vcf ] }.groupTuple() diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 1a478957b1..e878d4dff9 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -31,7 +31,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { germline_resource // channel: [optional] germline_resource germline_resource_tbi // channel: [optional] germline_resource_tbi intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals - intervals_bed_gz_tbi // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi, num_intervals ] or [ [], [], 0 ] if no intervals intervals_bed_combined // channel: [mandatory] intervals/target regions in one file unzipped intervals_bed_gz_tbi_combined // channel: [mandatory] intervals/target regions in one file zipped mappability @@ -102,7 +101,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { fasta, fasta_fai, [[id: "null"], []], - cnvkit_reference.map { it -> [[id: it[0].baseName], it] }, + cnvkit_reference.map { reference -> [[id: reference[0].baseName], reference] }, ) versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT.out.versions) @@ -181,8 +180,8 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { intervals_bed_gz_tbi_combined, ) - vcf_manta = BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.vcf - tbi_manta = BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.tbi + vcf_manta = BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.tumor_sv_vcf + tbi_manta = BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.tumor_sv_vcf_tbi versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.versions) } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf index 702d6361c8..fd38480bbc 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf @@ -20,17 +20,17 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ { LOFREQ(input_intervals, fasta, fai) // Call variants with LoFreq // Figuring out if there is one or more vcf(s) from the same sample - vcf_branch = LOFREQ.out.vcf.branch{ + vcf_branch = LOFREQ.out.vcf.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_branch = LOFREQ.out.tbi.branch{ + tbi_branch = LOFREQ.out.tbi.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals diff --git a/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf index 9fc89e931c..380121ef9b 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf @@ -18,30 +18,32 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA { versions = channel.empty() // Combine cram and intervals, account for 0 intervals - cram_intervals = cram.combine(intervals).map{ it -> - def bed_gz = it.size() > 3 ? it[3] : [] - def bed_tbi = it.size() > 3 ? it[4] : [] + cram_intervals = cram.combine(intervals).map{ combined -> + def bed_gz = combined.size() > 3 ? combined[3] : [] + def bed_tbi = combined.size() > 3 ? combined[4] : [] - [it[0], it[1], it[2], bed_gz, bed_tbi] + [combined[0], combined[1], combined[2], bed_gz, bed_tbi] } MANTA_TUMORONLY(cram_intervals, fasta, fasta_fai, []) - small_indels_vcf = MANTA_TUMORONLY.out.candidate_small_indels_vcf - candidate_sv_vcf = MANTA_TUMORONLY.out.candidate_sv_vcf - tumor_sv_vcf = MANTA_TUMORONLY.out.tumor_sv_vcf - tumor_sv_vcf_tbi = MANTA_TUMORONLY.out.tumor_sv_vcf_tbi - - // Only tumor sv should get annotated // add variantcaller to meta map - vcf = tumor_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } - tbi = tumor_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + candidate_small_indels_vcf = MANTA_TUMORONLY.out.candidate_small_indels_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + candidate_small_indels_vcf_tbi = MANTA_TUMORONLY.out.candidate_small_indels_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + candidate_sv_vcf = MANTA_TUMORONLY.out.candidate_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + candidate_sv_vcf_tbi = MANTA_TUMORONLY.out.candidate_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } + tumor_sv_vcf = MANTA_TUMORONLY.out.tumor_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } + tumor_sv_vcf_tbi = MANTA_TUMORONLY.out.tumor_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } versions = versions.mix(MANTA_TUMORONLY.out.versions) emit: - vcf - tbi + candidate_small_indels_vcf + candidate_small_indels_vcf_tbi + candidate_sv_vcf + candidate_sv_vcf_tbi + tumor_sv_vcf + tumor_sv_vcf_tbi versions } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf index bfd4c278ac..b895920247 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf @@ -31,8 +31,8 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { // If no germline resource is provided, then create an empty channel to avoid GetPileupsummaries from being run // Handle channel.value([]) input from prepare_genome by converting to proper empty channel - germline_resource_pileup = germline_resource.filter { it != [] } - germline_resource_pileup_tbi = germline_resource_tbi.filter { it != [] } + germline_resource_pileup = germline_resource.filter { germline_resource_ -> germline_resource_ != [] } + germline_resource_pileup_tbi = germline_resource_tbi.filter { germline_resource_tbi_ -> germline_resource_tbi_ != [] } // Combine input and intervals for spread and gather strategy input_intervals = input @@ -58,27 +58,27 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { } // Figuring out if there is one or more vcf(s) from the same sample - vcf_branch = MUTECT2.out.vcf.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + vcf_branch = MUTECT2.out.vcf.branch { meta, _vcf -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_branch = MUTECT2.out.tbi.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + tbi_branch = MUTECT2.out.tbi.branch { meta, _tbi -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more stats(s) from the same sample - stats_branch = MUTECT2.out.stats.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + stats_branch = MUTECT2.out.stats.branch { meta, _stats -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more f1r2(s) from the same sample - f1r2_branch = MUTECT2.out.f1r2.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + f1r2_branch = MUTECT2.out.f1r2.branch { meta, _f1r2 -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals @@ -105,9 +105,9 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { GETPILEUPSUMMARIES(pileup_input, fasta, fai, dict, germline_resource_pileup, germline_resource_pileup_tbi) // Figuring out if there is one or more table(s) from the same sample - pileup_table_branch = GETPILEUPSUMMARIES.out.table.branch { - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + pileup_table_branch = GETPILEUPSUMMARIES.out.table.branch { meta, _table -> + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Only when using intervals @@ -157,12 +157,12 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { vcf_mutect2 = FILTERMUTECTCALLS.out.vcf .map { meta, vcf_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], vcf_] } .concat(vcf.map { meta, vcf_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], vcf_] }) - .unique { it[0] } + .unique { meta, _vcf -> meta } tbi_mutect2 = FILTERMUTECTCALLS.out.tbi .map { meta, tbi_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], tbi_] } .concat(tbi.map { meta, tbi_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], tbi_] }) - .unique { it[0] } + .unique { meta, _tbi -> meta } versions = versions.mix(CALCULATECONTAMINATION.out.versions) versions = versions.mix(FILTERMUTECTCALLS.out.versions) diff --git a/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf index 91ec26a72b..0c233bad0e 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf @@ -38,16 +38,16 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE { [[],[]] // cosmic_tbi ) // Figuring out if there is one or more vcf(s) from the same sample - vcf_branch = SENTIEON_TNSCOPE.out.vcf.branch{ + vcf_branch = SENTIEON_TNSCOPE.out.vcf.branch{ meta, _vcf -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } // Figuring out if there is one or more tbi(s) from the same sample - tbi_branch = SENTIEON_TNSCOPE.out.index.branch{ + tbi_branch = SENTIEON_TNSCOPE.out.index.branch{ meta, _tbi -> // Use meta.num_intervals to asses number of intervals - intervals: it[0].num_intervals > 1 - no_intervals: it[0].num_intervals <= 1 + intervals: meta.num_intervals > 1 + no_intervals: meta.num_intervals <= 1 } vcf_to_merge = vcf_branch.intervals.map{ meta, vcf -> [ groupKey(meta, meta.num_intervals), vcf ] }.groupTuple() diff --git a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf index 02985a7939..15b1e97c4d 100644 --- a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf +++ b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf @@ -20,7 +20,7 @@ workflow CRAM_QC_MOSDEPTH_SAMTOOLS { // Reports run on cram SAMTOOLS_STATS(cram, fasta) - MOSDEPTH(cram.combine(intervals.map { meta, bed -> [bed ?: []] }), fasta) + MOSDEPTH(cram.combine(intervals.map { _meta, bed -> [bed ?: []] }), fasta) // Gather all reports generated reports = reports.mix(SAMTOOLS_STATS.out.stats) diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index d05b1f980b..3aa61c69fc 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -96,7 +96,7 @@ workflow PREPARE_GENOME { versions = versions.mix(GATK4_CREATESEQUENCEDICTIONARY.out.versions) } else if (dict_in) { - dict = channel.fromPath(dict_in).map { it -> [[id: 'dict'], it] }.collect() + dict = channel.fromPath(dict_in).map { dict_ -> [[id: 'dict'], dict_] }.collect() } else { dict = channel.empty() @@ -108,7 +108,7 @@ workflow PREPARE_GENOME { versions = versions.mix(SAMTOOLS_FAIDX.out.versions) } else if (fasta_fai_in) { - fasta_fai = channel.fromPath(fasta_fai_in).map { it -> [[id: 'fai'], it] }.collect() + fasta_fai = channel.fromPath(fasta_fai_in).map { fai -> [[id: 'fai'], fai] }.collect() } else { fasta_fai = channel.empty() @@ -133,8 +133,8 @@ workflow PREPARE_GENOME { .splitCsv(header: false, sep: ',') .flatMap { id, fafile -> [['id', id], ['fasta', file(fafile, checkIfExists: true)]] } .groupTuple() - .map { it -> it[1] } - .collect { [it] } + .map { group -> group[1] } + .collect { fasta_group -> [fasta_group] } bbsplit_index = BBMAP_INDEX( [[id: "build_index"], []], diff --git a/subworkflows/local/prepare_intervals/main.nf b/subworkflows/local/prepare_intervals/main.nf index 581612e465..f6899250d0 100644 --- a/subworkflows/local/prepare_intervals/main.nf +++ b/subworkflows/local/prepare_intervals/main.nf @@ -33,9 +33,9 @@ workflow PREPARE_INTERVALS { file("${outdir}/no_intervals.bed.gz").text = "no_intervals\n" file("${outdir}/no_intervals.bed.gz.tbi").text = "no_intervals\n" - intervals_bed = channel.fromPath(file("${outdir}/no_intervals.bed")).map{ it -> [ it, 0 ] } - intervals_bed_gz_tbi = channel.fromPath(file("${outdir}/no_intervals.bed.{gz,gz.tbi}")).collect().map{ it -> [ it, 0 ] } - intervals_combined = channel.fromPath(file("${outdir}/no_intervals.bed")).map{ it -> [ [ id:it.simpleName ], it ] } + intervals_bed = channel.fromPath(file("${outdir}/no_intervals.bed")).map{ bed -> [ bed, 0 ] } + intervals_bed_gz_tbi = channel.fromPath(file("${outdir}/no_intervals.bed.{gz,gz.tbi}")).collect().map{ files -> [ files, 0 ] } + intervals_combined = channel.fromPath(file("${outdir}/no_intervals.bed")).map{ bed -> [ [ id:bed.simpleName ], bed ] } } else if (step != 'annotate' && step != 'controlfreec') { // If no interval/target file is provided, then generated intervals from FASTA file if (!intervals) { @@ -43,14 +43,14 @@ workflow PREPARE_INTERVALS { intervals_combined = BUILD_INTERVALS.out.output - CREATE_INTERVALS_BED(intervals_combined.map{ meta, path -> path }, nucleotides_per_second) + CREATE_INTERVALS_BED(intervals_combined.map{ _meta, path -> path }, nucleotides_per_second) intervals_bed = CREATE_INTERVALS_BED.out.bed versions = versions.mix(BUILD_INTERVALS.out.versions) versions = versions.mix(CREATE_INTERVALS_BED.out.versions) } else { - intervals_combined = channel.fromPath(file(intervals)).map{it -> [ [ id:it.baseName ], it ] } + intervals_combined = channel.fromPath(file(intervals)).map{bed -> [ [ id:bed.baseName ], bed ] } CREATE_INTERVALS_BED(file(intervals), nucleotides_per_second) intervals_bed = CREATE_INTERVALS_BED.out.bed @@ -84,24 +84,24 @@ workflow PREPARE_INTERVALS { } [ duration, intervalFile ] }.toSortedList({ a, b -> b[0] <=> a[0] }) - .flatten().collate(2).map{ duration, intervalFile -> intervalFile }.collect() + .flatten().collate(2).map{ _duration, intervalFile -> intervalFile }.collect() // Adding number of intervals as elements - .map{ it -> [ it, it.size() ] } + .map{ files -> [ files, files.size() ] } .transpose() // 2. Create bed.gz and bed.gz.tbi for each interval file. They are split by region (see above) - TABIX_BGZIPTABIX_INTERVAL_SPLIT(intervals_bed.map{ file, num_intervals -> [ [ id:file.baseName], file ] }) + TABIX_BGZIPTABIX_INTERVAL_SPLIT(intervals_bed.map{ file, _num_intervals -> [ [ id:file.baseName], file ] }) - intervals_bed_gz_tbi = TABIX_BGZIPTABIX_INTERVAL_SPLIT.out.gz_index.map{ meta, bed, tbi -> [ bed, tbi ] }.toList() + intervals_bed_gz_tbi = TABIX_BGZIPTABIX_INTERVAL_SPLIT.out.gz_index.map{ _meta, bed, tbi -> [ bed, tbi ] }.toList() // Adding number of intervals as elements - .map{ it -> [ it, it.size() ] } + .map{ files -> [ files, files.size() ] } .transpose() } TABIX_BGZIPTABIX_INTERVAL_COMBINED(intervals_combined) - intervals_bed_combined = intervals_combined.map{meta, bed -> bed }.collect() - intervals_bed_gz_tbi_combined = TABIX_BGZIPTABIX_INTERVAL_COMBINED.out.gz_index.map{meta, gz, tbi -> [gz, tbi] }.collect() + intervals_bed_combined = intervals_combined.map{_meta, bed -> bed }.collect() + intervals_bed_gz_tbi_combined = TABIX_BGZIPTABIX_INTERVAL_COMBINED.out.gz_index.map{_meta, gz, tbi -> [gz, tbi] }.collect() emit: // Intervals split for parallel execution diff --git a/subworkflows/local/prepare_reference_cnvkit/main.nf b/subworkflows/local/prepare_reference_cnvkit/main.nf index 9eaca9eff7..74b8b3694c 100644 --- a/subworkflows/local/prepare_reference_cnvkit/main.nf +++ b/subworkflows/local/prepare_reference_cnvkit/main.nf @@ -10,7 +10,7 @@ workflow PREPARE_REFERENCE_CNVKIT { versions = channel.empty() // prepare a antitarget reference files for tumor_only mode of cnvkit - CNVKIT_ANTITARGET(intervals_bed_combined.flatten().map { it -> [[id: 'intervals'], it] }) + CNVKIT_ANTITARGET(intervals_bed_combined.flatten().map { bed -> [[id: 'intervals'], bed] }) CNVKIT_REFERENCE(fasta.map { _meta, fasta_ -> [fasta_] }, intervals_bed_combined, CNVKIT_ANTITARGET.out.bed.map { _meta, bed -> [bed] }) versions = versions.mix(CNVKIT_ANTITARGET.out.versions) diff --git a/subworkflows/local/prepare_snpsift_databases/main.nf b/subworkflows/local/prepare_snpsift_databases/main.nf index e524212d72..30ac7c0373 100644 --- a/subworkflows/local/prepare_snpsift_databases/main.nf +++ b/subworkflows/local/prepare_snpsift_databases/main.nf @@ -12,26 +12,26 @@ workflow PREPARE_SNPSIFT_DATABASES { ch_configs = channel.fromList(val_db_configs) // Branch: create vardb if not provided - ch_branched = ch_configs.branch { - has_vardb: it.vardb != null + ch_branched = ch_configs.branch { config -> + has_vardb: config.vardb != null needs_vardb: true } // Create vardbs for databases that need them // Convert semicolon-separated fields to comma-separated (SnpSift expects commas) SNPSIFT_ANNMEMCREATE( - ch_branched.needs_vardb.map { [[id: it.vcf.baseName], it.vcf, it.tbi, it.fields ? it.fields.replace(';', ',') : ''] } + ch_branched.needs_vardb.map { config -> [[id: config.vcf.baseName], config.vcf, config.tbi, config.fields ? config.fields.replace(';', ',') : ''] } ) // Join created vardbs back with their configs ch_created = SNPSIFT_ANNMEMCREATE.out.database .map { meta, vardb -> [meta.id, vardb] } - .join(ch_branched.needs_vardb.map { [it.vcf.baseName, it] }) + .join(ch_branched.needs_vardb.map { config -> [config.vcf.baseName, config] }) .map { _id, vardb, config -> [config.vcf, config.tbi, vardb, config.fields ? config.fields.replace(';', ',') : '', config.prefix ?: ''] } // Configs with pre-built vardb ch_prebuilt = ch_branched.has_vardb - .map { [it.vcf, it.tbi, it.vardb, it.fields ? it.fields.replace(';', ',') : '', it.prefix ?: ''] } + .map { config -> [config.vcf, config.tbi, config.vardb, config.fields ? config.fields.replace(';', ',') : '', config.prefix ?: ''] } // Collect all into output tuple ch_db_tuple = ch_prebuilt @@ -39,11 +39,11 @@ workflow PREPARE_SNPSIFT_DATABASES { .toList() .map { list -> [ - list.collect { it[0] }, // db_vcf - list.collect { it[1] }, // db_vcf_tbi - list.collect { it[2] }, // db_vardb - list.collect { it[3] }, // db_fields - list.collect { it[4] } // db_prefixes + list.collect { row -> row[0] }, // db_vcf + list.collect { row -> row[1] }, // db_vcf_tbi + list.collect { row -> row[2] }, // db_vardb + list.collect { row -> row[3] }, // db_fields + list.collect { row -> row[4] } // db_prefixes ] } diff --git a/subworkflows/local/samplesheet_to_channel/main.nf b/subworkflows/local/samplesheet_to_channel/main.nf index 6bbde0f514..92e76472be 100644 --- a/subworkflows/local/samplesheet_to_channel/main.nf +++ b/subworkflows/local/samplesheet_to_channel/main.nf @@ -10,7 +10,6 @@ workflow SAMPLESHEET_TO_CHANNEL { ascat_loci_rt // Path: ascat loci rt bcftools_annotations // Path: bcftools annotations bcftools_annotations_tbi // Path: bcftools annotations tbi - bcftools_columns // Path: bcftools columns bcftools_header_lines // Path: bcftools header lines build_only_index // Boolean: build only index dbsnp // Path: dbsnp @@ -50,8 +49,8 @@ workflow SAMPLESHEET_TO_CHANNEL { .groupTuple() .map { patient, samples -> // Count samples with status 0 and status 1 - def status0_count = samples.count { it.status == 0 } - def status1_count = samples.count { it.status == 1 } + def status0_count = samples.count { sample -> sample.status == 0 } + def status1_count = samples.count { sample -> sample.status == 1 } // Check the condition and exit with an error if met if (status1_count == 1 && status0_count > 1) { @@ -67,7 +66,7 @@ workflow SAMPLESHEET_TO_CHANNEL { [combination_key, [meta.patient, meta.sample, meta.status, meta.lane]] } .groupTuple() - .map { combination_key, combination_list -> + .map { _combination_key, combination_list -> if (combination_list.size() > 1) { def patient = combination_list[0][0] def sample = combination_list[0][1] @@ -87,7 +86,7 @@ workflow SAMPLESHEET_TO_CHANNEL { .groupTuple() .map { patient, samples -> // Return the patient and the list of sample ids - [patient, samples.collect { it.sample }] + [patient, samples.collect { sample -> sample.sample }] } // Flatten to [sample_id, patient] pairs .flatMap { patient, sample_ids -> sample_ids.collect { sample_id -> [sample_id, patient] } } @@ -242,7 +241,7 @@ workflow SAMPLESHEET_TO_CHANNEL { // 1. the sample-sheet only contains normal-samples, but some of the requested tools require tumor-samples, and // 2. the sample-sheet only contains tumor-samples, but some of the requested tools require normal-samples. input_sample - .filter { it[0].status == 1 } + .filter { sample -> sample[0].status == 1 } .ifEmpty { // In this case, the sample-sheet contains no tumor-samples if (!build_only_index) { @@ -260,7 +259,7 @@ workflow SAMPLESHEET_TO_CHANNEL { } input_sample - .filter { it[0].status == 0 } + .filter { sample -> sample[0].status == 0 } .ifEmpty { // In this case, the sample-sheet contains no normal/germline-samples def tools_requiring_normal_samples = ['ascat', 'deepvariant', 'haplotypecaller', 'msisensorpro'] @@ -433,8 +432,8 @@ workflow SAMPLESHEET_TO_CHANNEL { // Fails when missing sex information for CNV tools or varlociraptor if (tools && (tools.split(',').contains('ascat') || tools.split(',').contains('controlfreec') || tools.split(',').contains('varlociraptor'))) { - input_sample.map { - if (it[0].sex == 'NA') { + input_sample.map { sample -> + if (sample[0].sex == 'NA') { error("Please specify sex information for each sample in your samplesheet when using '--tools' with 'ascat' or 'controlfreec' or 'varlociraptor'.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") } } @@ -442,8 +441,8 @@ workflow SAMPLESHEET_TO_CHANNEL { // Fails when varlociraptor is enable for tumor samples but no contamination is provided if (tools && tools.split(',').contains('varlociraptor')) { - input_sample.map { - if (it[0].status == 1 && !it[0].containsKey('contamination')) { + input_sample.map { sample -> + if (sample[0].status == 1 && !sample[0].containsKey('contamination')) { error("Please specify contamination information for each tumor sample in your samplesheet when using '--tools' with 'varlociraptor'.\nhttps://nf-co.re/sarek/usage#input-samplesheet-configurations") } } diff --git a/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf b/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf index 0aa70f656c..0142d6e3bd 100644 --- a/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf @@ -160,7 +160,6 @@ workflow PIPELINE_INITIALISATION { params.ascat_loci_rt, params.bcftools_annotations, params.bcftools_annotations_tbi, - params.bcftools_columns, params.bcftools_header_lines, params.build_only_index, params.dbsnp, diff --git a/subworkflows/local/vcf_consensus/main.nf b/subworkflows/local/vcf_consensus/main.nf index 291d360684..8cedb412b2 100644 --- a/subworkflows/local/vcf_consensus/main.nf +++ b/subworkflows/local/vcf_consensus/main.nf @@ -15,7 +15,7 @@ workflow CONSENSUS { ch_versions = channel.empty() ch_vcfs = vcfs - .branch{ meta, vcf, tbi -> + .branch{ meta, _vcf, _tbi -> // Somatic Strelka samples have tumor_id field (tumor-normal pairs) // This is semantically equivalent to checking status == '1' (tumor) but more explicit strelka_somatic: meta.variantcaller == 'strelka' && meta.tumor_id @@ -50,8 +50,8 @@ workflow CONSENSUS { // Sort by vcf name for predictable isec input order // callers list will match isec output order in sites.txt def sorted_pairs = vcf_caller_pairs.sort { a, b -> a[0].name <=> b[0].name } - def sorted_vcfs = sorted_pairs.collect { it[0] } - def callers = sorted_pairs.collect { it[1] } + def sorted_vcfs = sorted_pairs.collect { pair -> pair[0] } + def callers = sorted_pairs.collect { pair -> pair[1] } // file_list, targets_file, regions_file are unused: VCFs are passed positionally // and consensus is computed genome-wide (no region/target restriction) [meta + [callers: callers], sorted_vcfs, tbis, [], [], []] @@ -62,7 +62,7 @@ workflow CONSENSUS { // Filter out empty isec results (no consensus variants found) ch_isec_with_results = BCFTOOLS_ISEC.out.results - .filter { meta, dir -> + .filter { _meta, dir -> def sites_file = dir.resolve('sites.txt') sites_file.exists() && sites_file.size() > 0 } diff --git a/subworkflows/local/vcf_varlociraptor_somatic/main.nf b/subworkflows/local/vcf_varlociraptor_somatic/main.nf index 292c18b340..7234a5d072 100644 --- a/subworkflows/local/vcf_varlociraptor_somatic/main.nf +++ b/subworkflows/local/vcf_varlociraptor_somatic/main.nf @@ -62,9 +62,9 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { ch_somatic_vcf_tbi = ch_somatic_vcf.join(TABIX_SOMATIC.out.tbi, by: [0]) // CONCAT SNV / INDEL VCFs COMING FROM STRELKA - ch_somatic_branched = ch_somatic_vcf_tbi.branch { items -> - strelka: items[0].variantcaller == 'strelka' - other: items[0].variantcaller != 'strelka' + ch_somatic_branched = ch_somatic_vcf_tbi.branch { meta, _vcf, _tbi -> + strelka: meta.variantcaller == 'strelka' + other: meta.variantcaller != 'strelka' } // Group somatic strelka SNVs and INDELs by sample for concatenation @@ -100,9 +100,9 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { def matching_pairs = somatic_with_key.join(germline_with_key, failOnMismatch: false) // Branch based on whether a matching germline VCF was found - def branched = matching_pairs.branch { items -> - matched: items.size() == 7 - unmatched: items.size() == 4 + def branched = matching_pairs.branch { pair -> + matched: pair.size() == 7 + unmatched: pair.size() == 4 } MERGE_GERMLINE_SOMATIC_VCFS( diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index d5c4f474d6..7a0c71fea2 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -23,8 +23,7 @@ "cnvkit": "0.9.11" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10", - "samtools": 1.17 + "cnvkit": "0.9.10" }, "CNVKIT_CALL": { "cnvkit": "0.9.10" @@ -665,8 +664,7 @@ "cnvkit": "0.9.11" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10", - "samtools": 1.17 + "cnvkit": "0.9.10" }, "CNVKIT_CALL": { "cnvkit": "0.9.10" diff --git a/tests/variant_calling_cnvkit.nf.test.snap b/tests/variant_calling_cnvkit.nf.test.snap index 057cff2288..e37886a5b3 100644 --- a/tests/variant_calling_cnvkit.nf.test.snap +++ b/tests/variant_calling_cnvkit.nf.test.snap @@ -7,8 +7,7 @@ "cnvkit": "0.9.11" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10", - "samtools": 1.17 + "cnvkit": "0.9.10" }, "CNVKIT_CALL": { "cnvkit": "0.9.10" @@ -134,19 +133,19 @@ "variant_calling/cnvkit/sample4_vs_sample3/multi_intervals.antitarget.bed", "variant_calling/cnvkit/sample4_vs_sample3/multi_intervals.target.bed", "variant_calling/cnvkit/sample4_vs_sample3/reference.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample3.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample3.targetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4-diagram.pdf", - "variant_calling/cnvkit/sample4_vs_sample3/sample4-scatter.png", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.bintest.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.call.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.cnr", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.genemetrics.tsv", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.somatic.call.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.targetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4_vs_sample3.cnvcall.vcf" + "variant_calling/cnvkit/sample4_vs_sample3/sample4_vs_sample3.cnvcall.vcf", + "variant_calling/cnvkit/sample4_vs_sample3/test.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test.paired_end.recalibrated.sorted.targetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted-diagram.pdf", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted-scatter.png", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.bintest.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.call.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.cnr", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.genemetrics.tsv", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.somatic.call.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.targetcoverage.cnn" ], [ "mosdepth-coverage-per-contig-single.txt:md5,336d786b273c4d4e714d51c44207ff56", @@ -180,16 +179,16 @@ "multi_intervals.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "multi_intervals.target.bed:md5,f9e727147a7cbca46c2b9b2de3ecae91", "reference.cnn:md5,e0aefc1c8a40e6919dc9cfb686e51f7c", - "sample3.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", - "sample3.targetcoverage.cnn:md5,826087b08d380135a271e2774c94084c", - "sample4.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", - "sample4.bintest.cns:md5,b5ccf48e99562082026e94f8d8aa1133", - "sample4.call.cns:md5,8202ec610e834c58bb7199761fccd9e5", - "sample4.cnr:md5,47d799d37af7ca8022fcac0ec705a3b8", - "sample4.cns:md5,50352818fd705424a7ab770d7707c312", - "sample4.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", - "sample4.somatic.call.cns:md5,1cb4febd5c88d306277f3c4c3117d68c", - "sample4.targetcoverage.cnn:md5,62c2d1f8765618c454bf4455c2298344" + "test.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", + "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,826087b08d380135a271e2774c94084c", + "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", + "test2.paired_end.recalibrated.sorted.bintest.cns:md5,b5ccf48e99562082026e94f8d8aa1133", + "test2.paired_end.recalibrated.sorted.call.cns:md5,8202ec610e834c58bb7199761fccd9e5", + "test2.paired_end.recalibrated.sorted.cnr:md5,47d799d37af7ca8022fcac0ec705a3b8", + "test2.paired_end.recalibrated.sorted.cns:md5,50352818fd705424a7ab770d7707c312", + "test2.paired_end.recalibrated.sorted.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", + "test2.paired_end.recalibrated.sorted.somatic.call.cns:md5,1cb4febd5c88d306277f3c4c3117d68c", + "test2.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,62c2d1f8765618c454bf4455c2298344" ], "No BAM files", "No CRAM files", @@ -201,9 +200,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nextflow": "25.10.4" }, - "timestamp": "2025-09-30T22:16:22.938969536" + "timestamp": "2026-07-20T10:09:45.402105" }, "-profile test --tools cnvkit --input recalibrated.csv --only_paired_variant_calling": { "content": [ @@ -213,8 +212,7 @@ "cnvkit": "0.9.11" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10", - "samtools": 1.17 + "cnvkit": "0.9.10" }, "CNVKIT_CALL": { "cnvkit": "0.9.10" @@ -355,34 +353,34 @@ "variant_calling/cnvkit/sample2", "variant_calling/cnvkit/sample2/cnvkit.reference.antitarget-tmp.bed", "variant_calling/cnvkit/sample2/cnvkit.reference.target-tmp.bed", - "variant_calling/cnvkit/sample2/sample2-diagram.pdf", - "variant_calling/cnvkit/sample2/sample2-scatter.png", - "variant_calling/cnvkit/sample2/sample2.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample2/sample2.bintest.cns", - "variant_calling/cnvkit/sample2/sample2.call.cns", - "variant_calling/cnvkit/sample2/sample2.cnr", - "variant_calling/cnvkit/sample2/sample2.cns", "variant_calling/cnvkit/sample2/sample2.cnvcall.vcf", - "variant_calling/cnvkit/sample2/sample2.genemetrics.tsv", - "variant_calling/cnvkit/sample2/sample2.targetcoverage.cnn", - "variant_calling/cnvkit/sample2/sample2.tumor_only.call.cns", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted-diagram.pdf", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted-scatter.png", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.bintest.cns", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.call.cns", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.cnr", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.cns", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.genemetrics.tsv", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.targetcoverage.cnn", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.tumor_only.call.cns", "variant_calling/cnvkit/sample4_vs_sample3", "variant_calling/cnvkit/sample4_vs_sample3/multi_intervals.antitarget.bed", "variant_calling/cnvkit/sample4_vs_sample3/multi_intervals.target.bed", "variant_calling/cnvkit/sample4_vs_sample3/reference.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample3.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample3.targetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4-diagram.pdf", - "variant_calling/cnvkit/sample4_vs_sample3/sample4-scatter.png", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.bintest.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.call.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.cnr", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.genemetrics.tsv", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.somatic.call.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.targetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4_vs_sample3.cnvcall.vcf" + "variant_calling/cnvkit/sample4_vs_sample3/sample4_vs_sample3.cnvcall.vcf", + "variant_calling/cnvkit/sample4_vs_sample3/test.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test.paired_end.recalibrated.sorted.targetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted-diagram.pdf", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted-scatter.png", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.bintest.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.call.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.cnr", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.genemetrics.tsv", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.somatic.call.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.targetcoverage.cnn" ], [ "mosdepth-coverage-per-contig-single.txt:md5,73ef9a077df1887f9021a581fbf207bc", @@ -425,27 +423,27 @@ "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,4153756b30abc934f10717c023bd262f", "cnvkit.reference.antitarget-tmp.bed:md5,3d4d20f9f23b39970865d29ef239d20b", "cnvkit.reference.target-tmp.bed:md5,657b25dbda8516624efa8cb2cf3716ca", - "sample2.antitargetcoverage.cnn:md5,067115082c4af4b64d58c0dc3a3642e4", - "sample2.bintest.cns:md5,7a66b5f63acb05e6dfb0784c215851ec", - "sample2.call.cns:md5,f7caeca04aba28b125ce26b511f42afb", - "sample2.cnr:md5,d9bdb71ce807051369577ee7f807a40c", - "sample2.cns:md5,2b56aac606ba6183d018b30ca58afcec", - "sample2.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", - "sample2.targetcoverage.cnn:md5,e6d0190c1c37ce6e41f76ca5b24ccca3", - "sample2.tumor_only.call.cns:md5,70a308c6db7acf1a5fd623936cac6412", + "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,067115082c4af4b64d58c0dc3a3642e4", + "test2.paired_end.recalibrated.sorted.bintest.cns:md5,7a66b5f63acb05e6dfb0784c215851ec", + "test2.paired_end.recalibrated.sorted.call.cns:md5,f7caeca04aba28b125ce26b511f42afb", + "test2.paired_end.recalibrated.sorted.cnr:md5,d9bdb71ce807051369577ee7f807a40c", + "test2.paired_end.recalibrated.sorted.cns:md5,2b56aac606ba6183d018b30ca58afcec", + "test2.paired_end.recalibrated.sorted.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", + "test2.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,e6d0190c1c37ce6e41f76ca5b24ccca3", + "test2.paired_end.recalibrated.sorted.tumor_only.call.cns:md5,70a308c6db7acf1a5fd623936cac6412", "multi_intervals.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "multi_intervals.target.bed:md5,f9e727147a7cbca46c2b9b2de3ecae91", "reference.cnn:md5,e0aefc1c8a40e6919dc9cfb686e51f7c", - "sample3.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", - "sample3.targetcoverage.cnn:md5,826087b08d380135a271e2774c94084c", - "sample4.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", - "sample4.bintest.cns:md5,b5ccf48e99562082026e94f8d8aa1133", - "sample4.call.cns:md5,8202ec610e834c58bb7199761fccd9e5", - "sample4.cnr:md5,47d799d37af7ca8022fcac0ec705a3b8", - "sample4.cns:md5,50352818fd705424a7ab770d7707c312", - "sample4.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", - "sample4.somatic.call.cns:md5,1cb4febd5c88d306277f3c4c3117d68c", - "sample4.targetcoverage.cnn:md5,62c2d1f8765618c454bf4455c2298344" + "test.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", + "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,826087b08d380135a271e2774c94084c", + "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", + "test2.paired_end.recalibrated.sorted.bintest.cns:md5,b5ccf48e99562082026e94f8d8aa1133", + "test2.paired_end.recalibrated.sorted.call.cns:md5,8202ec610e834c58bb7199761fccd9e5", + "test2.paired_end.recalibrated.sorted.cnr:md5,47d799d37af7ca8022fcac0ec705a3b8", + "test2.paired_end.recalibrated.sorted.cns:md5,50352818fd705424a7ab770d7707c312", + "test2.paired_end.recalibrated.sorted.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", + "test2.paired_end.recalibrated.sorted.somatic.call.cns:md5,1cb4febd5c88d306277f3c4c3117d68c", + "test2.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,62c2d1f8765618c454bf4455c2298344" ], "No BAM files", "No CRAM files", @@ -458,9 +456,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nextflow": "25.10.4" }, - "timestamp": "2025-09-30T22:19:35.224650709" + "timestamp": "2026-07-20T10:18:52.335661" }, "-profile test --tools cnvkit --input recalibrated_germline.csv": { "content": [ @@ -470,8 +468,7 @@ "cnvkit": "0.9.11" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10", - "samtools": 1.17 + "cnvkit": "0.9.10" }, "CNVKIT_CALL": { "cnvkit": "0.9.10" @@ -620,9 +617,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nextflow": "25.10.4" }, - "timestamp": "2025-09-30T22:14:57.81598857" + "timestamp": "2026-07-20T10:05:28.442046" }, "-profile test --tools cnvkit --input recalibrated_tumoronly.csv": { "content": [ @@ -734,17 +731,17 @@ "variant_calling/cnvkit/sample2", "variant_calling/cnvkit/sample2/cnvkit.reference.antitarget-tmp.bed", "variant_calling/cnvkit/sample2/cnvkit.reference.target-tmp.bed", - "variant_calling/cnvkit/sample2/sample2-diagram.pdf", - "variant_calling/cnvkit/sample2/sample2-scatter.png", - "variant_calling/cnvkit/sample2/sample2.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample2/sample2.bintest.cns", - "variant_calling/cnvkit/sample2/sample2.call.cns", - "variant_calling/cnvkit/sample2/sample2.cnr", - "variant_calling/cnvkit/sample2/sample2.cns", "variant_calling/cnvkit/sample2/sample2.cnvcall.vcf", - "variant_calling/cnvkit/sample2/sample2.genemetrics.tsv", - "variant_calling/cnvkit/sample2/sample2.targetcoverage.cnn", - "variant_calling/cnvkit/sample2/sample2.tumor_only.call.cns" + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted-diagram.pdf", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted-scatter.png", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.bintest.cns", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.call.cns", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.cnr", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.cns", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.genemetrics.tsv", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.targetcoverage.cnn", + "variant_calling/cnvkit/sample2/test2.paired_end.recalibrated.sorted.tumor_only.call.cns" ], [ "mosdepth-coverage-per-contig-single.txt:md5,ff38f1e35ce12244c751921db673b23c", @@ -761,14 +758,14 @@ "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", "cnvkit.reference.antitarget-tmp.bed:md5,3d4d20f9f23b39970865d29ef239d20b", "cnvkit.reference.target-tmp.bed:md5,657b25dbda8516624efa8cb2cf3716ca", - "sample2.antitargetcoverage.cnn:md5,067115082c4af4b64d58c0dc3a3642e4", - "sample2.bintest.cns:md5,7a66b5f63acb05e6dfb0784c215851ec", - "sample2.call.cns:md5,f7caeca04aba28b125ce26b511f42afb", - "sample2.cnr:md5,d9bdb71ce807051369577ee7f807a40c", - "sample2.cns:md5,2b56aac606ba6183d018b30ca58afcec", - "sample2.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", - "sample2.targetcoverage.cnn:md5,e6d0190c1c37ce6e41f76ca5b24ccca3", - "sample2.tumor_only.call.cns:md5,70a308c6db7acf1a5fd623936cac6412" + "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,067115082c4af4b64d58c0dc3a3642e4", + "test2.paired_end.recalibrated.sorted.bintest.cns:md5,7a66b5f63acb05e6dfb0784c215851ec", + "test2.paired_end.recalibrated.sorted.call.cns:md5,f7caeca04aba28b125ce26b511f42afb", + "test2.paired_end.recalibrated.sorted.cnr:md5,d9bdb71ce807051369577ee7f807a40c", + "test2.paired_end.recalibrated.sorted.cns:md5,2b56aac606ba6183d018b30ca58afcec", + "test2.paired_end.recalibrated.sorted.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", + "test2.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,e6d0190c1c37ce6e41f76ca5b24ccca3", + "test2.paired_end.recalibrated.sorted.tumor_only.call.cns:md5,70a308c6db7acf1a5fd623936cac6412" ], "No BAM files", "No CRAM files", @@ -779,9 +776,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nextflow": "25.10.4" }, - "timestamp": "2025-09-30T22:17:53.424126221" + "timestamp": "2026-07-20T10:13:42.841328" }, "-profile test --tools cnvkit --input recalibrated_tumoronly.csv --no_intervals": { "content": [ @@ -888,17 +885,16 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nextflow": "25.10.4" }, - "timestamp": "2025-09-30T22:21:53.321675509" + "timestamp": "2026-07-20T10:24:27.668069" }, "-profile test --tools cnvkit --input recalibrated_somatic.csv --no_intervals": { "content": [ 16, { "CNVKIT_BATCH": { - "cnvkit": "0.9.10", - "samtools": 1.17 + "cnvkit": "0.9.10" }, "CNVKIT_CALL": { "cnvkit": "0.9.10" @@ -1019,19 +1015,19 @@ "variant_calling/cnvkit/sample4_vs_sample3/genome.bed", "variant_calling/cnvkit/sample4_vs_sample3/genome.target.bed", "variant_calling/cnvkit/sample4_vs_sample3/reference.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample3.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample3.targetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4-diagram.pdf", - "variant_calling/cnvkit/sample4_vs_sample3/sample4-scatter.png", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.antitargetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.bintest.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.call.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.cnr", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.genemetrics.tsv", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.somatic.call.cns", - "variant_calling/cnvkit/sample4_vs_sample3/sample4.targetcoverage.cnn", - "variant_calling/cnvkit/sample4_vs_sample3/sample4_vs_sample3.cnvcall.vcf" + "variant_calling/cnvkit/sample4_vs_sample3/sample4_vs_sample3.cnvcall.vcf", + "variant_calling/cnvkit/sample4_vs_sample3/test.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test.paired_end.recalibrated.sorted.targetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted-diagram.pdf", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted-scatter.png", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.bintest.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.call.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.cnr", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.genemetrics.tsv", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.somatic.call.cns", + "variant_calling/cnvkit/sample4_vs_sample3/test2.paired_end.recalibrated.sorted.targetcoverage.cnn" ], [ "mosdepth-coverage-per-contig-single.txt:md5,336d786b273c4d4e714d51c44207ff56", @@ -1067,16 +1063,16 @@ "genome.bed:md5,9c6cc178da8c2c27364be9f25c9df96d", "genome.target.bed:md5,ee8081becc36524d35889e3b5f70961b", "reference.cnn:md5,8c53491ff76a2a06b7a977714db862bb", - "sample3.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", - "sample3.targetcoverage.cnn:md5,0067cc3a0e479b23ab3bf056cead31b4", - "sample4.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", - "sample4.bintest.cns:md5,b6701cceb525c3087f4dad432d20100c", - "sample4.call.cns:md5,2e0cc8813e274b25175b4346f4698fbb", - "sample4.cnr:md5,9dba016feb45f566a92e0aac184472bb", - "sample4.cns:md5,b3dfd6adf2ac97009dc460453d42659b", - "sample4.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", - "sample4.somatic.call.cns:md5,5e4d472294661d2010e13deefe5ae4f5", - "sample4.targetcoverage.cnn:md5,1e1012812eb893afd931485cb760294e" + "test.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", + "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,0067cc3a0e479b23ab3bf056cead31b4", + "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", + "test2.paired_end.recalibrated.sorted.bintest.cns:md5,b6701cceb525c3087f4dad432d20100c", + "test2.paired_end.recalibrated.sorted.call.cns:md5,2e0cc8813e274b25175b4346f4698fbb", + "test2.paired_end.recalibrated.sorted.cnr:md5,9dba016feb45f566a92e0aac184472bb", + "test2.paired_end.recalibrated.sorted.cns:md5,b3dfd6adf2ac97009dc460453d42659b", + "test2.paired_end.recalibrated.sorted.genemetrics.tsv:md5,5ec3555520f502f00f551ae7900a3824", + "test2.paired_end.recalibrated.sorted.somatic.call.cns:md5,5e4d472294661d2010e13deefe5ae4f5", + "test2.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,1e1012812eb893afd931485cb760294e" ], "No BAM files", "No CRAM files", @@ -1088,8 +1084,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nextflow": "25.10.4" }, - "timestamp": "2025-09-30T22:20:58.031095995" + "timestamp": "2026-07-20T10:22:29.609745" } } diff --git a/tests/variant_calling_muse.nf.test.snap b/tests/variant_calling_muse.nf.test.snap index 682969c7b4..978156f8df 100644 --- a/tests/variant_calling_muse.nf.test.snap +++ b/tests/variant_calling_muse.nf.test.snap @@ -349,7 +349,7 @@ "No BAM files", "No CRAM files", [ - "sample4_vs_sample3.MuSE.txt:md5,32961f7d718b4a1114f168253e50ef9e" + "sample4_vs_sample3.MuSE.txt:md5,015deb2b6fba5916733b16d51f5ee63b" ], [ "sample4_vs_sample3.muse.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e" diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 324c396371..8bb7129737 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -139,11 +139,11 @@ workflow SAREK { // PREPROCESSING if (step == 'mapping') { // Figure out if input is bam, fastq, or spring - input_sample_type = input_sample.branch { - bam: it[0].data_type == "bam" - fastq_gz: it[0].data_type == "fastq_gz" - one_fastq_gz_spring: it[0].data_type == "one_fastq_gz_spring" - two_fastq_gz_spring: it[0].data_type == "two_fastq_gz_spring" + input_sample_type = input_sample.branch { sample -> + bam: sample[0].data_type == "bam" + fastq_gz: sample[0].data_type == "fastq_gz" + one_fastq_gz_spring: sample[0].data_type == "one_fastq_gz_spring" + two_fastq_gz_spring: sample[0].data_type == "two_fastq_gz_spring" } // Two fastq.gz-files @@ -289,7 +289,7 @@ workflow SAREK { if (tools.split(',').contains('cnvkit') || tools.split(',').contains('msisensor2') || tools.split(',').contains('muse')) { // Differentiate between bam and cram files - cram_variant_calling_status_tmp = cram_variant_calling.branch { meta, file, index -> + cram_variant_calling_status_tmp = cram_variant_calling.branch { _meta, file, _index -> bam: file.toString().endsWith('.bam') cram: file.toString().endsWith('.cram') } @@ -309,13 +309,13 @@ workflow SAREK { } // Logic to separate germline samples, tumor samples with no matched normal, and combine tumor-normal pairs - cram_variant_calling_status = cram_variant_calling.branch { meta, file, index -> + cram_variant_calling_status = cram_variant_calling.branch { meta, _file, _index -> normal: meta.status == 0 tumor: meta.status == 1 } // Follow the same logic with bam as we have with cram - bam_variant_calling_status = bam_variant_calling.branch { meta, file, index -> + bam_variant_calling_status = bam_variant_calling.branch { meta, _file, _index -> normal: meta.status == 0 tumor: meta.status == 1 } @@ -340,13 +340,13 @@ workflow SAREK { bam_variant_calling_tumor_joined = bam_variant_calling_tumor_grouped.join(bam_variant_calling_normal_to_cross, failOnDuplicate: true, remainder: true) // 3. Filter out entries with last entry null - cram_variant_calling_tumor_filtered = cram_variant_calling_tumor_joined.filter { it -> !(it.last()) } - bam_variant_calling_tumor_filtered = bam_variant_calling_tumor_joined.filter { it -> !(it.last()) } + cram_variant_calling_tumor_filtered = cram_variant_calling_tumor_joined.filter { joined -> !(joined.last()) } + bam_variant_calling_tumor_filtered = bam_variant_calling_tumor_joined.filter { joined -> !(joined.last()) } // 4. Transpose [ patient1, [ meta1, meta2 ], [ cram1, crai1, cram2, crai2 ] ] back to [ patient1, meta1, [ cram1, crai1 ], null ] [ patient1, meta2, [ cram2, crai2 ], null ] // and remove patient ID field & null value for further processing [ meta1, [ cram1, crai1 ] ] [ meta2, [ cram2, crai2 ] ] - cram_variant_calling_tumor_only = cram_variant_calling_tumor_filtered.transpose().map { it -> [it[1], it[2], it[3]] } - bam_variant_calling_tumor_only = bam_variant_calling_tumor_filtered.transpose().map { it -> [it[1], it[2], it[3]] } + cram_variant_calling_tumor_only = cram_variant_calling_tumor_filtered.transpose().map { record -> [record[1], record[2], record[3]] } + bam_variant_calling_tumor_only = bam_variant_calling_tumor_filtered.transpose().map { record -> [record[1], record[2], record[3]] } if (params.only_paired_variant_calling) { // Normal only samples @@ -356,12 +356,12 @@ workflow SAREK { bam_variant_calling_normal_joined = bam_variant_calling_normal_to_cross.join(bam_variant_calling_tumor_grouped, failOnDuplicate: true, remainder: true) // 2. Filter out entries with last entry null - cram_variant_calling_normal_filtered = cram_variant_calling_normal_joined.filter { it -> !(it.last()) } - bam_variant_calling_normal_filtered = bam_variant_calling_normal_joined.filter { it -> !(it.last()) } + cram_variant_calling_normal_filtered = cram_variant_calling_normal_joined.filter { joined -> !(joined.last()) } + bam_variant_calling_normal_filtered = bam_variant_calling_normal_joined.filter { joined -> !(joined.last()) } // 3. Remove patient ID field & null value for further processing [ meta1, [ cram1, crai1 ] ] [ meta2, [ cram2, crai2 ] ] (no transposing needed since only one normal per patient ID) - cram_variant_calling_status_normal = cram_variant_calling_normal_filtered.map { it -> [it[1], it[2], it[3]] } - bam_variant_calling_status_normal = bam_variant_calling_normal_filtered.map { it -> [it[1], it[2], it[3]] } + cram_variant_calling_status_normal = cram_variant_calling_normal_filtered.map { record -> [record[1], record[2], record[3]] } + bam_variant_calling_status_normal = bam_variant_calling_normal_filtered.map { record -> [record[1], record[2], record[3]] } } else { cram_variant_calling_status_normal = cram_variant_calling_status.normal @@ -458,7 +458,6 @@ workflow SAREK { germline_resource, germline_resource_tbi, intervals_and_num_intervals, - intervals_bed_gz_tbi_and_num_intervals, intervals_bed_combined, intervals_bed_gz_tbi_combined, mappability, @@ -708,8 +707,8 @@ def flowcellLaneFromFastq(path) { def readFirstLineOfFastq(path) { def line = null try { - path.withInputStream { - def InputStream gzipStream = new java.util.zip.GZIPInputStream(it) + path.withInputStream { stream -> + def InputStream gzipStream = new java.util.zip.GZIPInputStream(stream) def Reader decoder = new InputStreamReader(gzipStream, 'ASCII') def BufferedReader buffered = new BufferedReader(decoder) line = buffered.readLine() From 7b2af90d102b1fe613ff72b146a52653badfedd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Famke=20B=C3=A4uerle?= <45968370+famosab@users.noreply.github.com> Date: Tue, 21 Jul 2026 17:35:06 +0200 Subject: [PATCH 13/27] Update muse/sump to check if the index is older before touching it (#2237) ## PR checklist Closes #2236 - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/sarek _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core pipelines lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. - [ ] `README.md` is updated (including new tool citations and authors/contributors). --- CHANGELOG.md | 1 + modules.json | 4 ++-- modules/nf-core/muse/call/main.nf | 2 +- modules/nf-core/muse/sump/main.nf | 7 ++++--- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 122f2710a1..019892bb2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2229](https://github.com/nf-core/sarek/pull/2229) - Update nft-utils to 1.0.0, migrate `getAllFilesFromDir` to `getAllFilesFromPath` in test utilities - [#2233](https://github.com/nf-core/sarek/pull/2233) - Replace the last remaining deprecated `channel.from` with `channel.of` in `prepare_genome` - [#2234](https://github.com/nf-core/sarek/pull/2234) - Replace deprecated `.set {}` channel terminator with plain assignment in local subworkflows for Nextflow strict-syntax / 26.x readiness +- [#2237](https://github.com/nf-core/sarek/pull/2237) - Update muse/sump module to check if the index is older before touching it #### Fixed diff --git a/modules.json b/modules.json index bc9f66c29c..62fcdbdc14 100644 --- a/modules.json +++ b/modules.json @@ -393,12 +393,12 @@ }, "muse/call": { "branch": "master", - "git_sha": "2ae2df92d6f5ac2d54058d0cece928e13d241912", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "muse/sump": { "branch": "master", - "git_sha": "2ae2df92d6f5ac2d54058d0cece928e13d241912", + "git_sha": "e8c96d814d65d575a840063c90905e44ac5ecc12", "installed_by": ["modules"] }, "ngscheckmate/ncm": { diff --git a/modules/nf-core/muse/call/main.nf b/modules/nf-core/muse/call/main.nf index 0f8ceb3c9f..cb7025f3ec 100644 --- a/modules/nf-core/muse/call/main.nf +++ b/modules/nf-core/muse/call/main.nf @@ -3,7 +3,7 @@ process MUSE_CALL { label 'process_high' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9f/9f0ebb574ef5eed2a6e034f1b2feea6c252d1ab0c8bc5135a669059aa1f4d2ca/data' : 'community.wave.seqera.io/library/muse:6637291dcbb0bdb8'}" diff --git a/modules/nf-core/muse/sump/main.nf b/modules/nf-core/muse/sump/main.nf index 3758ad38a7..cc9adbbd8d 100644 --- a/modules/nf-core/muse/sump/main.nf +++ b/modules/nf-core/muse/sump/main.nf @@ -3,7 +3,7 @@ process MUSE_SUMP { label 'process_high' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/83/83d1d3caa1b6ce54ce999e0061d7fe8acbe6788d5c7970574eff330ea819fb85/data' : 'community.wave.seqera.io/library/htslib_muse:9a4b9cb78c211f1e'}" @@ -25,9 +25,10 @@ process MUSE_SUMP { // args for bgzip def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - // MuSE complains if the timestamp of the dbsnp VCF index is older than the timestamp of the VCF itself, so we need to touch it here + // MuSE complains if the timestamp of the dbsnp VCF index is older than the timestamp of the VCF itself + // we check whether that is the case and if its not then we run touch """ - touch ${ref_vcf_tbi} + [ "${ref_vcf_tbi}" -ot "${ref_vcf}" ] && touch "${ref_vcf_tbi}" MuSE \\ sump \\ From a7377e65fc75b80057769bc22bc3a763527e945b Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Wed, 22 Jul 2026 15:14:04 +0200 Subject: [PATCH 14/27] chore(modules): migrate gatk4/gatk4spark to versions topic channel (#2238) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates all `gatk4` and `gatk4spark` modules to the `versions` topic channel (updated to nf-core/modules latest via nf-core/tools 4.0.2). ### Changes - Updates 24 modules (21 `gatk4` + 3 `gatk4spark`) to their topic-channel versions. - Removes the corresponding `.mix(.out.versions)` wiring from subworkflows — versions now flow through `channel.topic("versions")` (already consumed in `workflows/sarek.nf`). - Fixes the `MUTECT2` / `MUTECT2_PAIRED` call sites for the new input signature: `gzi` added to the fai tuple, new `alleles` / `alleles_tbi` inputs passed as `[]` (unused in sarek). - `gatk4spark` tool bump 4.6.1.0 → 4.6.2.0 (rides along with the module update). ### Notes - Test snapshots still need regenerating in CI. - First of a stacked series migrating the remaining modules to the versions topic channel; subsequent PRs are based on this branch. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 3 + modules.json | 48 +++--- .../nf-core/gatk4/applybqsr/environment.yml | 3 +- modules/nf-core/gatk4/applybqsr/main.nf | 22 +-- modules/nf-core/gatk4/applybqsr/meta.yml | 26 +++- .../nf-core/gatk4/applyvqsr/environment.yml | 3 +- modules/nf-core/gatk4/applyvqsr/main.nf | 47 +++--- modules/nf-core/gatk4/applyvqsr/meta.yml | 77 ++++++--- .../gatk4/baserecalibrator/environment.yml | 3 +- .../nf-core/gatk4/baserecalibrator/main.nf | 40 ++--- .../nf-core/gatk4/baserecalibrator/meta.yml | 44 ++++-- .../calculatecontamination/environment.yml | 3 +- .../gatk4/calculatecontamination/main.nf | 39 ++--- .../gatk4/calculatecontamination/meta.yml | 45 ++++-- .../nf-core/gatk4/cnnscorevariants/main.nf | 50 +++--- .../nf-core/gatk4/cnnscorevariants/meta.yml | 87 +++++++---- .../createsequencedictionary/environment.yml | 3 +- .../gatk4/createsequencedictionary/main.nf | 18 +-- .../gatk4/createsequencedictionary/meta.yml | 26 +++- .../estimatelibrarycomplexity/environment.yml | 3 +- .../gatk4/estimatelibrarycomplexity/main.nf | 41 ++--- .../gatk4/estimatelibrarycomplexity/meta.yml | 59 ++++--- .../gatk4/filtermutectcalls/environment.yml | 3 +- .../nf-core/gatk4/filtermutectcalls/main.nf | 53 +++---- .../nf-core/gatk4/filtermutectcalls/meta.yml | 68 ++++++-- .../filtervarianttranches/environment.yml | 3 +- .../gatk4/filtervarianttranches/main.nf | 38 ++--- .../gatk4/filtervarianttranches/meta.yml | 88 +++++++---- .../gatk4/gatherbqsrreports/environment.yml | 3 +- .../nf-core/gatk4/gatherbqsrreports/main.nf | 32 ++-- .../nf-core/gatk4/gatherbqsrreports/meta.yml | 32 +++- .../gatherpileupsummaries/environment.yml | 3 +- .../gatk4/gatherpileupsummaries/main.nf | 38 ++--- .../gatk4/gatherpileupsummaries/meta.yml | 39 +++-- .../gatk4/genomicsdbimport/environment.yml | 3 +- .../nf-core/gatk4/genomicsdbimport/main.nf | 59 +++---- .../nf-core/gatk4/genomicsdbimport/meta.yml | 114 +++++++------- .../gatk4/genotypegvcfs/environment.yml | 3 +- modules/nf-core/gatk4/genotypegvcfs/main.nf | 45 +++--- modules/nf-core/gatk4/genotypegvcfs/meta.yml | 48 ++++-- .../gatk4/getpileupsummaries/environment.yml | 3 +- .../nf-core/gatk4/getpileupsummaries/main.nf | 45 +++--- .../nf-core/gatk4/getpileupsummaries/meta.yml | 58 +++++-- .../gatk4/haplotypecaller/environment.yml | 3 +- modules/nf-core/gatk4/haplotypecaller/main.nf | 57 +++---- .../nf-core/gatk4/haplotypecaller/meta.yml | 51 ++++-- .../gatk4/intervallisttobed/environment.yml | 3 +- .../nf-core/gatk4/intervallisttobed/main.nf | 18 +-- .../nf-core/gatk4/intervallisttobed/meta.yml | 31 +++- .../learnreadorientationmodel/environment.yml | 3 +- .../gatk4/learnreadorientationmodel/main.nf | 32 ++-- .../gatk4/learnreadorientationmodel/meta.yml | 34 +++- .../gatk4/markduplicates/environment.yml | 5 +- modules/nf-core/gatk4/markduplicates/main.nf | 23 +-- modules/nf-core/gatk4/markduplicates/meta.yml | 105 +++++++++---- .../gatk4/mergemutectstats/environment.yml | 3 +- .../nf-core/gatk4/mergemutectstats/main.nf | 33 ++-- .../nf-core/gatk4/mergemutectstats/meta.yml | 32 +++- modules/nf-core/gatk4/mutect2/environment.yml | 3 +- modules/nf-core/gatk4/mutect2/main.nf | 73 ++++----- modules/nf-core/gatk4/mutect2/meta.yml | 147 +++++++++++------- .../gatk4/variantrecalibrator/environment.yml | 3 +- .../nf-core/gatk4/variantrecalibrator/main.nf | 59 +++---- .../gatk4/variantrecalibrator/meta.yml | 127 +++++++++------ .../gatk4spark/applybqsr/environment.yml | 3 +- modules/nf-core/gatk4spark/applybqsr/main.nf | 22 +-- modules/nf-core/gatk4spark/applybqsr/meta.yml | 31 +++- .../baserecalibrator/environment.yml | 3 +- .../gatk4spark/baserecalibrator/main.nf | 20 +-- .../gatk4spark/baserecalibrator/meta.yml | 80 ++++++---- .../gatk4spark/markduplicates/environment.yml | 3 +- .../nf-core/gatk4spark/markduplicates/main.nf | 24 +-- .../gatk4spark/markduplicates/meta.yml | 69 +++++--- subworkflows/local/bam_applybqsr/main.nf | 1 - .../local/bam_applybqsr_spark/main.nf | 1 - .../local/bam_baserecalibrator/main.nf | 5 - .../local/bam_baserecalibrator_spark/main.nf | 5 - .../bam_joint_calling_germline_gatk/main.nf | 6 - subworkflows/local/bam_markduplicates/main.nf | 1 - .../local/bam_markduplicates_spark/main.nf | 2 - .../bam_variant_calling_germline_all/main.nf | 5 - .../main.nf | 3 - .../bam_variant_calling_somatic_all/main.nf | 1 - .../main.nf | 15 +- .../main.nf | 1 - .../main.nf | 13 +- .../local/fastq_preprocess_gatk/main.nf | 2 - subworkflows/local/prepare_genome/main.nf | 1 - subworkflows/local/prepare_intervals/main.nf | 1 - .../local/vcf_variant_filtering_gatk/main.nf | 4 - tests/aligner-bwa-mem.nf.test.snap | 8 +- tests/aligner-bwa-mem2.nf.test.snap | 8 +- tests/aligner-dragmap.nf.test.snap | 8 +- tests/aligner-parabricks.nf.test.snap | 18 +-- tests/alignment_from_everything.nf.test.snap | 10 +- tests/alignment_to_fastq.nf.test.snap | 10 +- tests/bbsplit.nf.test.snap | 26 ++-- tests/default.nf.test.snap | 20 +-- tests/fastp.nf.test.snap | 30 ++-- ...joint_calling_haplotypecaller.nf.test.snap | 12 +- tests/joint_calling_mutect2.nf.test.snap | 12 +- tests/lane_integer.nf.test.snap | 2 +- tests/multi_lane.nf.test.snap | 12 +- tests/postprocess_concatenation.nf.test.snap | 2 +- ...s_concatenation_normalization.nf.test.snap | 4 +- tests/postprocess_consensus.nf.test.snap | 26 ++-- tests/postprocess_filtering.nf.test.snap | 2 +- tests/postprocess_normalization.nf.test.snap | 2 +- tests/postprocess_varlociraptor.nf.test.snap | 20 +-- tests/save_mapped.nf.test.snap | 2 +- tests/save_output_as_bam.nf.test.snap | 14 +- tests/sentieon.nf.test.snap | 10 +- tests/sentieon_aligner_bwamem.nf.test.snap | 6 +- tests/sentieon_dedup.nf.test.snap | 30 ++-- tests/spark.nf.test.snap | 18 +-- tests/start_from_markduplicates.nf.test.snap | 32 ++-- ...art_from_preparerecalibration.nf.test.snap | 16 +- tests/start_from_recalibration.nf.test.snap | 12 +- tests/tumor-normal-pair.nf.test.snap | 10 +- tests/umi_fastp.nf.test.snap | 10 +- tests/umi_fgbio.nf.test.snap | 10 +- tests/umi_in_read_names.nf.test.snap | 20 +-- tests/variant_calling_all.nf.test.snap | 40 ++--- .../variant_calling_deepvariant.nf.test.snap | 4 +- tests/variant_calling_freebayes.nf.test.snap | 40 ++--- ...riant_calling_haplotypecaller.nf.test.snap | 12 +- tests/variant_calling_lofreq.nf.test.snap | 4 +- tests/variant_calling_msisensor2.nf.test.snap | 6 +- .../variant_calling_msisensorpro.nf.test.snap | 6 +- tests/variant_calling_muse.nf.test.snap | 4 +- tests/variant_calling_mutect2.nf.test.snap | 24 +-- ...ant_calling_sentieon_dnascope.nf.test.snap | 6 +- ...ling_sentieon_haplotypecaller.nf.test.snap | 10 +- ...iant_calling_sentieon_tnscope.nf.test.snap | 6 +- 134 files changed, 1789 insertions(+), 1430 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 019892bb2c..f6ccbf673a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2232](https://github.com/nf-core/sarek/pull/2232) - Migrate local code to the lowercase `channel` factory for Nextflow strict-syntax / 26.x readiness - [#2235](https://github.com/nf-core/sarek/pull/2235) - Nextflow strict-syntax / 26.x readiness for local code: explicit, named closure parameters (replacing implicit/generic `it`), `_`-prefixed unused parameters, and removal of unused `take:` inputs. Previously-dropped Manta candidate VCFs and Sentieon gVCF indices are now emitted. - [#2235](https://github.com/nf-core/sarek/pull/2235) - germline CNVKIT reuses the shared `CRAM_TO_BAM` conversion instead of re-converting CRAM internally, avoiding a duplicate conversion. Side effect: with `--step variant_calling` (user-supplied CRAM/BAM), CNVKit output files are named after the input file rather than the sample; runs from FASTQ are unaffected. +- [#2238](https://github.com/nf-core/sarek/pull/2238) - Migrate `gatk4`/`gatk4spark` modules to the versions topic channel (bumps gatk4spark 4.6.1.0 → 4.6.2.0) ### Fixed @@ -34,6 +35,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | htslib | 1.21 | 1.23.1 | | varlociraptor | 8.9.3 | 8.9.5 | | ensembl-vep | 115.2 | 116.0 | +| gatk4 | 4.6.1.0 | 4.6.2.0 | +| gatk4-spark | 4.6.1.0 | 4.6.2.0 | ### Dependencies - plugins diff --git a/modules.json b/modules.json index 62fcdbdc14..6ffabb8f5a 100644 --- a/modules.json +++ b/modules.json @@ -208,97 +208,97 @@ }, "gatk4/applybqsr": { "branch": "master", - "git_sha": "620300d96c4b9051d533a5ea5f9d3b2c64b781ce", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/applyvqsr": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/baserecalibrator": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/calculatecontamination": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/cnnscorevariants": { "branch": "master", - "git_sha": "1999eff2c530b2b185a25cc42117a1686f09b685", + "git_sha": "21e4662ae927fdbc5fc04eec9bde38b0689d4954", "installed_by": ["modules"] }, "gatk4/createsequencedictionary": { "branch": "master", - "git_sha": "a57253204b8f4022edfeaa3ae2f5e2abecd8858b", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/estimatelibrarycomplexity": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/filtermutectcalls": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/filtervarianttranches": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/gatherbqsrreports": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/gatherpileupsummaries": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/genomicsdbimport": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/genotypegvcfs": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/getpileupsummaries": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/haplotypecaller": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "7abcc95130dd0388f696002a99adeb59eca54471", "installed_by": ["modules"] }, "gatk4/intervallisttobed": { "branch": "master", - "git_sha": "20fe8646005253d57a7a8db42abf69ea0966dc75", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/learnreadorientationmodel": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/markduplicates": { "branch": "master", - "git_sha": "1ec937ab3edc307bc0d79a2200d784e9f0868359", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/mergemutectstats": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4/mergevcfs": { @@ -308,27 +308,27 @@ }, "gatk4/mutect2": { "branch": "master", - "git_sha": "a97cba262e9367734e435dc07d2e3b7d6121ef3e", + "git_sha": "f8001d415ee08634fee5019bd15c7fdaa2a1915d", "installed_by": ["modules"] }, "gatk4/variantrecalibrator": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4spark/applybqsr": { "branch": "master", - "git_sha": "620300d96c4b9051d533a5ea5f9d3b2c64b781ce", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4spark/baserecalibrator": { "branch": "master", - "git_sha": "fa55ebb81654fe1736975fa28d1af5a079bf6a08", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gatk4spark/markduplicates": { "branch": "master", - "git_sha": "fa55ebb81654fe1736975fa28d1af5a079bf6a08", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "gawk": { diff --git a/modules/nf-core/gatk4/applybqsr/environment.yml b/modules/nf-core/gatk4/applybqsr/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/applybqsr/environment.yml +++ b/modules/nf-core/gatk4/applybqsr/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/applybqsr/main.nf b/modules/nf-core/gatk4/applybqsr/main.nf index 75b7be0594..4829d563cb 100644 --- a/modules/nf-core/gatk4/applybqsr/main.nf +++ b/modules/nf-core/gatk4/applybqsr/main.nf @@ -3,9 +3,9 @@ process GATK4_APPLYBQSR { 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data' - : 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(input), path(input_index), path(bqsr_table), path(intervals) @@ -14,10 +14,10 @@ process GATK4_APPLYBQSR { path dict output: - tuple val(meta), path("${prefix}.bam"), emit: bam, optional: true - tuple val(meta), path("${prefix}*bai"), emit: bai, optional: true + tuple val(meta), path("${prefix}.bam"), emit: bam, optional: true + tuple val(meta), path("${prefix}*bai"), emit: bai, optional: true tuple val(meta), path("${prefix}.cram"), emit: cram, optional: true - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -46,11 +46,6 @@ process GATK4_APPLYBQSR { ${interval_command} \\ --tmp-dir . \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ stub: @@ -63,10 +58,5 @@ process GATK4_APPLYBQSR { else touch ${prefix}.bai fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/applybqsr/meta.yml b/modules/nf-core/gatk4/applybqsr/meta.yml index 6e7bedad71..3f926ce1c6 100644 --- a/modules/nf-core/gatk4/applybqsr/meta.yml +++ b/modules/nf-core/gatk4/applybqsr/meta.yml @@ -90,13 +90,27 @@ output: description: Recalibrated CRAM file pattern: "${prefix}.cram" ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + 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 + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@yocra3" - "@FriederikeHanssen" diff --git a/modules/nf-core/gatk4/applyvqsr/environment.yml b/modules/nf-core/gatk4/applyvqsr/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/applyvqsr/environment.yml +++ b/modules/nf-core/gatk4/applyvqsr/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/applyvqsr/main.nf b/modules/nf-core/gatk4/applyvqsr/main.nf index c8ea3da5bf..9e42f44c87 100644 --- a/modules/nf-core/gatk4/applyvqsr/main.nf +++ b/modules/nf-core/gatk4/applyvqsr/main.nf @@ -1,22 +1,22 @@ process GATK4_APPLYVQSR { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(vcf), path(vcf_tbi), path(recal), path(recal_index), path(tranches) - path fasta - path fai - path dict + path fasta + path fai + path dict output: tuple val(meta), path("*.vcf.gz"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -24,40 +24,31 @@ process GATK4_APPLYVQSR { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def reference_command = fasta ? "--reference $fasta" : '' + def reference_command = fasta ? "--reference ${fasta}" : '' def avail_mem = 3072 if (!task.memory) { - log.info '[GATK ApplyVQSR] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK ApplyVQSR] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ ApplyVQSR \\ --variant ${vcf} \\ --output ${prefix}.vcf.gz \\ - $reference_command \\ - --tranches-file $tranches \\ - --recal-file $recal \\ + ${reference_command} \\ + --tranches-file ${tranches} \\ + --recal-file ${recal} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/applyvqsr/meta.yml b/modules/nf-core/gatk4/applyvqsr/meta.yml index ceedff621e..a31969c7d6 100644 --- a/modules/nf-core/gatk4/applyvqsr/meta.yml +++ b/modules/nf-core/gatk4/applyvqsr/meta.yml @@ -31,60 +31,91 @@ input: description: VCF file to be recalibrated, this should be the same file as used for the first stage VariantRecalibrator. pattern: "*.vcf" + ontologies: [] - vcf_tbi: type: file description: tabix index for the input vcf file. pattern: "*.vcf.tbi" + ontologies: [] - recal: type: file description: Recalibration file produced when the input vcf was run through VariantRecalibrator in stage 1. pattern: "*.recal" + ontologies: [] - recal_index: type: file description: Index file for the recalibration file. pattern: ".recal.idx" + ontologies: [] - tranches: type: file description: Tranches file produced when the input vcf was run through VariantRecalibrator in stage 1. pattern: ".tranches" - - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - - fai: - type: file - description: Index of reference fasta file - pattern: "*.fasta.fai" - - - dict: - type: file - description: GATK sequence dictionary - pattern: "*.dict" + ontologies: [] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fasta.fai" + ontologies: [] + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: file description: compressed vcf file containing the recalibrated variants. pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - "*.vcf.gz": type: file description: compressed vcf file containing the recalibrated variants. pattern: "*.vcf.gz" - - tbi: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: type: file - description: Index of recalibrated vcf file. - pattern: "*vcf.gz.tbi" + description: compressed vcf file containing the recalibrated variants. + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - "*.tbi": type: file description: Index of recalibrated vcf file. pattern: "*vcf.gz.tbi" - - versions: - - versions.yml: - type: file - description: File containing software versions. - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" maintainers: diff --git a/modules/nf-core/gatk4/baserecalibrator/environment.yml b/modules/nf-core/gatk4/baserecalibrator/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/baserecalibrator/environment.yml +++ b/modules/nf-core/gatk4/baserecalibrator/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/baserecalibrator/main.nf b/modules/nf-core/gatk4/baserecalibrator/main.nf index 493533c726..d7c5c65dd8 100644 --- a/modules/nf-core/gatk4/baserecalibrator/main.nf +++ b/modules/nf-core/gatk4/baserecalibrator/main.nf @@ -1,11 +1,11 @@ process GATK4_BASERECALIBRATOR { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(input), path(input_index), path(intervals) @@ -17,7 +17,7 @@ process GATK4_BASERECALIBRATOR { output: tuple val(meta), path("*.table"), emit: table - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -25,39 +25,31 @@ process GATK4_BASERECALIBRATOR { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def interval_command = intervals ? "--intervals $intervals" : "" - def sites_command = known_sites.collect{"--known-sites $it"}.join(' ') + def interval_command = intervals ? "--intervals ${intervals}" : "" + def sites_command = known_sites.collect { vcf -> "--known-sites ${vcf}" }.join(' ') def avail_mem = 3072 if (!task.memory) { - log.info '[GATK BaseRecalibrator] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK BaseRecalibrator] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ BaseRecalibrator \\ - --input $input \\ + --input ${input} \\ --output ${prefix}.table \\ - --reference $fasta \\ - $interval_command \\ - $sites_command \\ + --reference ${fasta} \\ + ${interval_command} \\ + ${sites_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.table - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/baserecalibrator/meta.yml b/modules/nf-core/gatk4/baserecalibrator/meta.yml index c3caeb8084..af53133648 100644 --- a/modules/nf-core/gatk4/baserecalibrator/meta.yml +++ b/modules/nf-core/gatk4/baserecalibrator/meta.yml @@ -27,13 +27,16 @@ input: type: file description: BAM/CRAM file from alignment pattern: "*.{bam,cram}" + ontologies: [] - input_index: type: file description: BAI/CRAI file from alignment pattern: "*.{bai,crai}" + ontologies: [] - intervals: type: file description: Bed file with the genomic regions included in the library (optional) + ontologies: [] - - meta2: type: map description: | @@ -43,6 +46,7 @@ input: type: file description: The reference fasta file pattern: "*.fasta" + ontologies: [] - - meta3: type: map description: | @@ -52,6 +56,7 @@ input: type: file description: Index of reference fasta file pattern: "*.fasta.fai" + ontologies: [] - - meta4: type: map description: | @@ -61,6 +66,7 @@ input: type: file description: GATK sequence dictionary pattern: "*.dict" + ontologies: [] - - meta5: type: map description: | @@ -68,8 +74,10 @@ input: e.g. [ id:'genome'] - known_sites: type: file - description: VCF files with known sites for indels / snps (optional) + description: VCF files with known sites for indels / snps pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - - meta6: type: map description: | @@ -77,11 +85,12 @@ input: e.g. [ id:'genome'] - known_sites_tbi: type: file - description: Tabix index of the known_sites (optional) + description: Tabix index of the known_sites pattern: "*.vcf.gz.tbi" + ontologies: [] output: - - table: - - meta: + table: + - - meta: type: map description: | Groovy Map containing sample information @@ -90,11 +99,28 @@ output: type: file description: Recalibration table from BaseRecalibrator pattern: "*.{table}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@yocra3" - "@FriederikeHanssen" diff --git a/modules/nf-core/gatk4/calculatecontamination/environment.yml b/modules/nf-core/gatk4/calculatecontamination/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/calculatecontamination/environment.yml +++ b/modules/nf-core/gatk4/calculatecontamination/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/calculatecontamination/main.nf b/modules/nf-core/gatk4/calculatecontamination/main.nf index 20fe3c5e13..2601a69d87 100644 --- a/modules/nf-core/gatk4/calculatecontamination/main.nf +++ b/modules/nf-core/gatk4/calculatecontamination/main.nf @@ -1,19 +1,19 @@ process GATK4_CALCULATECONTAMINATION { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(pileup), path(matched) output: tuple val(meta), path('*.contamination.table'), emit: contamination - tuple val(meta), path('*.segmentation.table') , emit: segmentation, optional:true - path "versions.yml" , emit: versions + tuple val(meta), path('*.segmentation.table'), emit: segmentation, optional: true + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -21,38 +21,29 @@ process GATK4_CALCULATECONTAMINATION { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def matched_command = matched ? "--matched-normal $matched" : '' + def matched_command = matched ? "--matched-normal ${matched}" : '' def avail_mem = 3072 if (!task.memory) { - log.info '[GATK CalculateContamination] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK CalculateContamination] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ CalculateContamination \\ - --input $pileup \\ + --input ${pileup} \\ --output ${prefix}.contamination.table \\ - $matched_command \\ + ${matched_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.contamination.table touch ${prefix}.segmentation.table - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/calculatecontamination/meta.yml b/modules/nf-core/gatk4/calculatecontamination/meta.yml index ee90a48252..f07240b569 100644 --- a/modules/nf-core/gatk4/calculatecontamination/meta.yml +++ b/modules/nf-core/gatk4/calculatecontamination/meta.yml @@ -29,38 +29,59 @@ input: description: File containing the pileups summary table of a tumor sample to be used to calculate contamination. pattern: "*.pileups.table" + ontologies: [] - matched: type: file description: File containing the pileups summary table of a normal sample that matches with the tumor sample specified in pileup argument. This is an optional input. pattern: "*.pileups.table" + ontologies: [] output: - - contamination: - - meta: + contamination: + - - meta: type: file description: File containing the contamination table. pattern: "*.contamination.table" + ontologies: [] - "*.contamination.table": type: file description: File containing the contamination table. pattern: "*.contamination.table" - - segmentation: - - meta: + ontologies: [] + segmentation: + - - meta: type: file - description: output table containing segmentation of tumor minor allele fractions - (optional) - pattern: "*.segmentation.table" + description: File containing the contamination table. + pattern: "*.contamination.table" + ontologies: [] - "*.segmentation.table": type: file description: output table containing segmentation of tumor minor allele fractions (optional) pattern: "*.segmentation.table" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" - "@maxulysse" diff --git a/modules/nf-core/gatk4/cnnscorevariants/main.nf b/modules/nf-core/gatk4/cnnscorevariants/main.nf index 5ff13b41d1..6622a6f405 100644 --- a/modules/nf-core/gatk4/cnnscorevariants/main.nf +++ b/modules/nf-core/gatk4/cnnscorevariants/main.nf @@ -1,9 +1,9 @@ process GATK4_CNNSCOREVARIANTS { - tag "$meta.id" + tag "${meta.id}" label 'process_low' //Conda is not supported at the moment: https://github.com/broadinstitute/gatk/issues/7811 - container "nf-core/gatk:4.5.0.0" //Biocontainers is missing a package + container "quay.io/nf-core/gatk:4.5.0.0" input: tuple val(meta), path(vcf), path(tbi), path(aligned_input), path(intervals) @@ -14,9 +14,9 @@ process GATK4_CNNSCOREVARIANTS { path weights output: - tuple val(meta), path("*cnn.vcf.gz") , emit: vcf + tuple val(meta), path("*cnn.vcf.gz"), emit: vcf tuple val(meta), path("*cnn.vcf.gz.tbi"), emit: tbi - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -24,52 +24,42 @@ process GATK4_CNNSCOREVARIANTS { script: // Exit if running this module with -profile conda / -profile mamba if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - error "GATK4_CNNSCOREVARIANTS module does not support Conda. Please use Docker / Singularity / Podman instead." + error("GATK4_CNNSCOREVARIANTS module does not support Conda. Please use Docker / Singularity / Podman instead.") } def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def aligned_input_cmd = aligned_input ? "--input $aligned_input" : "" - def interval_command = intervals ? "--intervals $intervals" : "" - def architecture_cmd = architecture ? "--architecture $architecture" : "" - def weights_cmd = weights ? "--weights $weights" : "" + def aligned_input_cmd = aligned_input ? "--input ${aligned_input}" : "" + def interval_command = intervals ? "--intervals ${intervals}" : "" + def architecture_cmd = architecture ? "--architecture ${architecture}" : "" + def weights_cmd = weights ? "--weights ${weights}" : "" def avail_mem = 3072 if (!task.memory) { - log.info '[GATK CnnScoreVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK CnnScoreVariants] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ export THEANO_FLAGS="base_compiledir=\$PWD" gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ CNNScoreVariants \\ - --variant $vcf \\ + --variant ${vcf} \\ --output ${prefix}.cnn.vcf.gz \\ - --reference $fasta \\ - $interval_command \\ - $aligned_input_cmd \\ - $architecture_cmd \\ - $weights_cmd \\ + --reference ${fasta} \\ + ${interval_command} \\ + ${aligned_input_cmd} \\ + ${architecture_cmd} \\ + ${weights_cmd} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: def prefix = task.ext.prefix ?: "${meta.id}" - """ echo "" | gzip -c > ${prefix}.cnn.vcf.gz touch ${prefix}.cnn.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/cnnscorevariants/meta.yml b/modules/nf-core/gatk4/cnnscorevariants/meta.yml index b55c9d9995..e39e38f987 100644 --- a/modules/nf-core/gatk4/cnnscorevariants/meta.yml +++ b/modules/nf-core/gatk4/cnnscorevariants/meta.yml @@ -25,40 +25,51 @@ input: type: file description: VCF file pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - tbi: type: file description: VCF index file pattern: "*.vcf.gz.tbi" + ontologies: [] - aligned_input: type: file description: BAM/CRAM file from alignment (optional) pattern: "*.{bam,cram}" + ontologies: [] - intervals: type: file description: Bed file with the genomic regions included in the library (optional) - - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - - fai: - type: file - description: Index of reference fasta file - pattern: "*.fasta.fai" - - - dict: - type: file - description: GATK sequence dictionary - pattern: "*.dict" - - - architecture: - type: file - description: Neural Net architecture configuration json file (optional) - pattern: "*.json" - - - weights: - type: file - description: Keras model HD5 file with neural net weights. (optional) - pattern: "*.hd5" + ontologies: [] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fasta.fai" + ontologies: [] + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + ontologies: [] + - architecture: + type: file + description: Neural Net architecture configuration json file (optional) + pattern: "*.json" + ontologies: + - edam: http://edamontology.org/format_3464 # JSON + - weights: + type: file + description: Keras model HD5 file with neural net weights. (optional) + pattern: "*.hd5" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -67,8 +78,9 @@ output: type: file description: Annotated VCF file pattern: "*.vcf" - - tbi: - - meta: + ontologies: [] + tbi: + - - meta: type: map description: | Groovy Map containing sample information @@ -77,11 +89,28 @@ output: type: file description: VCF index file pattern: "*.vcf.gz.tbi" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" maintainers: diff --git a/modules/nf-core/gatk4/createsequencedictionary/environment.yml b/modules/nf-core/gatk4/createsequencedictionary/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/createsequencedictionary/environment.yml +++ b/modules/nf-core/gatk4/createsequencedictionary/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/createsequencedictionary/main.nf b/modules/nf-core/gatk4/createsequencedictionary/main.nf index 872648a5e9..98ad30ce01 100644 --- a/modules/nf-core/gatk4/createsequencedictionary/main.nf +++ b/modules/nf-core/gatk4/createsequencedictionary/main.nf @@ -3,16 +3,16 @@ process GATK4_CREATESEQUENCEDICTIONARY { 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data' - : 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(fasta) output: tuple val(meta), path('*.dict'), emit: dict - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -34,20 +34,10 @@ process GATK4_CREATESEQUENCEDICTIONARY { --URI ${fasta} \\ --TMP_DIR . \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ stub: """ touch ${fasta.baseName}.dict - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/createsequencedictionary/meta.yml b/modules/nf-core/gatk4/createsequencedictionary/meta.yml index 72dced28c8..5fdfcc20a7 100644 --- a/modules/nf-core/gatk4/createsequencedictionary/meta.yml +++ b/modules/nf-core/gatk4/createsequencedictionary/meta.yml @@ -39,13 +39,27 @@ output: description: gatk dictionary file pattern: "*.{dict}" ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + 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 + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@maxulysse" - "@ramprasadn" diff --git a/modules/nf-core/gatk4/estimatelibrarycomplexity/environment.yml b/modules/nf-core/gatk4/estimatelibrarycomplexity/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/estimatelibrarycomplexity/environment.yml +++ b/modules/nf-core/gatk4/estimatelibrarycomplexity/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/estimatelibrarycomplexity/main.nf b/modules/nf-core/gatk4/estimatelibrarycomplexity/main.nf index 9071279577..613e9eb1f8 100644 --- a/modules/nf-core/gatk4/estimatelibrarycomplexity/main.nf +++ b/modules/nf-core/gatk4/estimatelibrarycomplexity/main.nf @@ -1,21 +1,21 @@ process GATK4_ESTIMATELIBRARYCOMPLEXITY { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(input) - path fasta - path fai - path dict + path fasta + path fai + path dict output: tuple val(meta), path('*.metrics'), emit: metrics - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -23,28 +23,24 @@ process GATK4_ESTIMATELIBRARYCOMPLEXITY { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_list = input.collect(){"--INPUT $it"}.join(" ") + def input_list = input.collect { bam -> "--INPUT ${bam}" }.join(" ") def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" def avail_mem = 3072 if (!task.memory) { - log.info '[GATK EstimateLibraryComplexity] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK EstimateLibraryComplexity] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ EstimateLibraryComplexity \\ - $input_list \\ + ${input_list} \\ --OUTPUT ${prefix}.metrics \\ - $reference \\ + ${reference} \\ --TMP_DIR . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: @@ -52,10 +48,5 @@ process GATK4_ESTIMATELIBRARYCOMPLEXITY { """ touch ${prefix}.metrics - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/estimatelibrarycomplexity/meta.yml b/modules/nf-core/gatk4/estimatelibrarycomplexity/meta.yml index 4fb06a3a2e..554e79c617 100644 --- a/modules/nf-core/gatk4/estimatelibrarycomplexity/meta.yml +++ b/modules/nf-core/gatk4/estimatelibrarycomplexity/meta.yml @@ -24,21 +24,25 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - - fai: - type: file - description: Index of reference fasta file - pattern: "fasta.fai" - - - dict: - type: file - description: GATK sequence dictionary - pattern: "*.dict" + ontologies: [] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Index of reference fasta file + pattern: "fasta.fai" + ontologies: [] + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + ontologies: [] output: - - metrics: - - meta: + metrics: + - - meta: type: map description: | Groovy Map containing sample information @@ -47,11 +51,28 @@ output: type: file description: File containing metrics on the input files pattern: "*.{metrics}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" - "@maxulysse" diff --git a/modules/nf-core/gatk4/filtermutectcalls/environment.yml b/modules/nf-core/gatk4/filtermutectcalls/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/filtermutectcalls/environment.yml +++ b/modules/nf-core/gatk4/filtermutectcalls/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/filtermutectcalls/main.nf b/modules/nf-core/gatk4/filtermutectcalls/main.nf index d3c5bb5ad7..726a6e5530 100644 --- a/modules/nf-core/gatk4/filtermutectcalls/main.nf +++ b/modules/nf-core/gatk4/filtermutectcalls/main.nf @@ -1,11 +1,11 @@ process GATK4_FILTERMUTECTCALLS { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(vcf), path(vcf_tbi), path(stats), path(orientationbias), path(segmentation), path(table), val(estimate) @@ -14,10 +14,10 @@ process GATK4_FILTERMUTECTCALLS { tuple val(meta4), path(dict) output: - tuple val(meta), path("*.vcf.gz") , emit: vcf - tuple val(meta), path("*.vcf.gz.tbi") , emit: tbi + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi tuple val(meta), path("*.filteringStats.tsv"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -26,34 +26,30 @@ process GATK4_FILTERMUTECTCALLS { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def orientationbias_command = orientationbias ? orientationbias.collect{"--orientation-bias-artifact-priors $it"}.join(' ') : '' - def segmentation_command = segmentation ? segmentation.collect{"--tumor-segmentation $it"}.join(' ') : '' - def estimate_command = estimate ? " --contamination-estimate ${estimate} " : '' - def table_command = table ? table.collect{"--contamination-table $it"}.join(' ') : '' + def orientationbias_command = orientationbias ? orientationbias.collect { orientationbias_ -> "--orientation-bias-artifact-priors ${orientationbias_}" }.join(' ') : '' + def segmentation_command = segmentation ? segmentation.collect { segmentation_ -> "--tumor-segmentation ${segmentation_}" }.join(' ') : '' + def estimate_command = estimate ? " --contamination-estimate ${estimate} " : '' + def table_command = table ? table.collect { table_ -> "--contamination-table ${table_}" }.join(' ') : '' def avail_mem = 3072 if (!task.memory) { - log.info '[GATK FilterMutectCalls] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK FilterMutectCalls] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ FilterMutectCalls \\ - --variant $vcf \\ + --variant ${vcf} \\ --output ${prefix}.vcf.gz \\ - --reference $fasta \\ - $orientationbias_command \\ - $segmentation_command \\ - $estimate_command \\ - $table_command \\ + --reference ${fasta} \\ + ${orientationbias_command} \\ + ${segmentation_command} \\ + ${estimate_command} \\ + ${table_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: @@ -62,10 +58,5 @@ process GATK4_FILTERMUTECTCALLS { echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi touch ${prefix}.vcf.gz.filteringStats.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/filtermutectcalls/meta.yml b/modules/nf-core/gatk4/filtermutectcalls/meta.yml index 9287277eb7..eb3e9baf48 100644 --- a/modules/nf-core/gatk4/filtermutectcalls/meta.yml +++ b/modules/nf-core/gatk4/filtermutectcalls/meta.yml @@ -27,28 +27,36 @@ input: type: file description: compressed vcf file of mutect2calls pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - vcf_tbi: type: file description: Tabix index of vcf file pattern: "*vcf.gz.tbi" + ontologies: [] - stats: type: file description: Stats file that pairs with output vcf file pattern: "*vcf.gz.stats" + ontologies: [] - orientationbias: type: file description: files containing artifact priors for input vcf. Optional input. pattern: "*.artifact-prior.tar.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - segmentation: type: file description: tables containing segmentation information for input vcf. Optional input. pattern: "*.segmentation.table" + ontologies: [] - table: type: file description: table(s) containing contamination data for input vcf. Optional input, takes priority over estimate. pattern: "*.contamination.table" + ontologies: [] - estimate: type: float description: estimation of contamination value as a double. Optional input, @@ -62,6 +70,7 @@ input: type: file description: The reference fasta file pattern: "*.fasta" + ontologies: [] - - meta3: type: map description: | @@ -71,6 +80,7 @@ input: type: file description: Index of reference fasta file pattern: "*.fasta.fai" + ontologies: [] - - meta4: type: map description: | @@ -80,39 +90,67 @@ input: type: file description: GATK sequence dictionary pattern: "*.dict" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: file description: file containing filtered mutect2 calls. pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - "*.vcf.gz": type: file description: file containing filtered mutect2 calls. pattern: "*.vcf.gz" - - tbi: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: type: file - description: tbi file that pairs with vcf. - pattern: "*.vcf.gz.tbi" + description: file containing filtered mutect2 calls. + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - "*.vcf.gz.tbi": type: file description: tbi file that pairs with vcf. pattern: "*.vcf.gz.tbi" - - stats: - - meta: + ontologies: [] + stats: + - - meta: type: file - description: file containing statistics of the filtermutectcalls run. - pattern: "*.filteringStats.tsv" + description: file containing filtered mutect2 calls. + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - "*.filteringStats.tsv": type: file description: file containing statistics of the filtermutectcalls run. pattern: "*.filteringStats.tsv" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" - "@maxulysse" diff --git a/modules/nf-core/gatk4/filtervarianttranches/environment.yml b/modules/nf-core/gatk4/filtervarianttranches/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/filtervarianttranches/environment.yml +++ b/modules/nf-core/gatk4/filtervarianttranches/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/filtervarianttranches/main.nf b/modules/nf-core/gatk4/filtervarianttranches/main.nf index c5249b7a05..7c31a4b534 100644 --- a/modules/nf-core/gatk4/filtervarianttranches/main.nf +++ b/modules/nf-core/gatk4/filtervarianttranches/main.nf @@ -1,11 +1,11 @@ process GATK4_FILTERVARIANTTRANCHES { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(vcf), path(tbi), path(intervals) @@ -15,11 +15,10 @@ process GATK4_FILTERVARIANTTRANCHES { path fai path dict - output: - tuple val(meta), path("*.vcf.gz") , emit: vcf + tuple val(meta), path("*.vcf.gz"), emit: vcf tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -27,27 +26,23 @@ process GATK4_FILTERVARIANTTRANCHES { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def resource_list = resources.collect{"--resource $it"}.join(' ') + def resource_list = resources.collect { resource -> "--resource ${resource}" }.join(' ') def avail_mem = 3072 if (!task.memory) { - log.info '[GATK FilterVariantTranches] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK FilterVariantTranches] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ FilterVariantTranches \\ - --variant $vcf \\ - $resource_list \\ + --variant ${vcf} \\ + ${resource_list} \\ --output ${prefix}.filtered.vcf.gz \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: @@ -56,10 +51,5 @@ process GATK4_FILTERVARIANTTRANCHES { """ echo "" | gzip -c > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/filtervarianttranches/meta.yml b/modules/nf-core/gatk4/filtervarianttranches/meta.yml index 398bbb07c1..39a64b435b 100644 --- a/modules/nf-core/gatk4/filtervarianttranches/meta.yml +++ b/modules/nf-core/gatk4/filtervarianttranches/meta.yml @@ -25,38 +25,45 @@ input: type: file description: a VCF file containing variants, must have info key:CNN_2D pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - tbi: type: file description: tbi file matching with -vcf pattern: "*.vcf.gz.tbi" + ontologies: [] - intervals: type: file description: Intervals - - - resources: - type: list - description: resource A VCF containing known SNP and or INDEL sites. Can be - supplied as many times as necessary - pattern: "*.vcf.gz" - - - resources_index: - type: list - description: Index of resource VCF containing known SNP and or INDEL sites. - Can be supplied as many times as necessary - pattern: "*.vcf.gz" - - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - - fai: - type: file - description: Index of reference fasta file - pattern: "fasta.fai" - - - dict: - type: file - description: GATK sequence dictionary - pattern: ".dict" + ontologies: [] + - resources: + type: list + description: resource A VCF containing known SNP and or INDEL sites. Can be supplied + as many times as necessary + pattern: "*.vcf.gz" + - resources_index: + type: list + description: Index of resource VCF containing known SNP and or INDEL sites. Can + be supplied as many times as necessary + pattern: "*.vcf.gz" + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Index of reference fasta file + pattern: "fasta.fai" + ontologies: [] + - dict: + type: file + description: GATK sequence dictionary + pattern: ".dict" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -65,8 +72,10 @@ output: type: file description: VCF file pattern: "*.vcf.gz" - - tbi: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: type: map description: | Groovy Map containing sample information @@ -75,11 +84,28 @@ output: type: file description: VCF index file pattern: "*.vcf.gz.tbi" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" maintainers: diff --git a/modules/nf-core/gatk4/gatherbqsrreports/environment.yml b/modules/nf-core/gatk4/gatherbqsrreports/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/gatherbqsrreports/environment.yml +++ b/modules/nf-core/gatk4/gatherbqsrreports/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/gatherbqsrreports/main.nf b/modules/nf-core/gatk4/gatherbqsrreports/main.nf index fdc5a2a723..5e4fe4f7f7 100644 --- a/modules/nf-core/gatk4/gatherbqsrreports/main.nf +++ b/modules/nf-core/gatk4/gatherbqsrreports/main.nf @@ -1,18 +1,18 @@ process GATK4_GATHERBQSRREPORTS { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(table) output: tuple val(meta), path("*.table"), emit: table - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -20,25 +20,27 @@ process GATK4_GATHERBQSRREPORTS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_list = table.collect{"--input $it"}.join(' ') + def input_list = table.collect { table_ -> "--input ${table_}" }.join(' ') def avail_mem = 3072 if (!task.memory) { - log.info '[GATK GatherBQSRReports] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK GatherBQSRReports] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ GatherBQSRReports \\ - $input_list \\ + ${input_list} \\ --output ${prefix}.table \\ --tmp-dir . \\ - $args + ${args} + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.table """ } diff --git a/modules/nf-core/gatk4/gatherbqsrreports/meta.yml b/modules/nf-core/gatk4/gatherbqsrreports/meta.yml index 587175b3a4..94af5bdda1 100644 --- a/modules/nf-core/gatk4/gatherbqsrreports/meta.yml +++ b/modules/nf-core/gatk4/gatherbqsrreports/meta.yml @@ -24,9 +24,10 @@ input: type: file description: File(s) containing BQSR table(s) pattern: "*.table" + ontologies: [] output: - - table: - - meta: + table: + - - meta: type: map description: | Groovy Map containing sample information @@ -35,11 +36,28 @@ output: type: file description: File containing joined BQSR table pattern: "*.table" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" maintainers: diff --git a/modules/nf-core/gatk4/gatherpileupsummaries/environment.yml b/modules/nf-core/gatk4/gatherpileupsummaries/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/gatherpileupsummaries/environment.yml +++ b/modules/nf-core/gatk4/gatherpileupsummaries/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/gatherpileupsummaries/main.nf b/modules/nf-core/gatk4/gatherpileupsummaries/main.nf index af397a1a2d..8f7c704ed8 100644 --- a/modules/nf-core/gatk4/gatherpileupsummaries/main.nf +++ b/modules/nf-core/gatk4/gatherpileupsummaries/main.nf @@ -1,20 +1,19 @@ process GATK4_GATHERPILEUPSUMMARIES { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" - + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(pileup) - path dict + path dict output: tuple val(meta), path("*.pileups.table"), emit: table - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -22,37 +21,28 @@ process GATK4_GATHERPILEUPSUMMARIES { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_list = pileup.collect{ "--I $it" }.join(' ') + def input_list = pileup.collect { pileup_ -> "--I ${pileup_}" }.join(' ') def avail_mem = 3072 if (!task.memory) { - log.info '[GATK GatherPileupSummaries] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK GatherPileupSummaries] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ GatherPileupSummaries \\ - $input_list \\ + ${input_list} \\ --O ${prefix}.pileups.table \\ - --sequence-dictionary $dict \\ + --sequence-dictionary ${dict} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.pileups.table - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/gatherpileupsummaries/meta.yml b/modules/nf-core/gatk4/gatherpileupsummaries/meta.yml index d8b29d2100..2d2b2a80db 100644 --- a/modules/nf-core/gatk4/gatherpileupsummaries/meta.yml +++ b/modules/nf-core/gatk4/gatherpileupsummaries/meta.yml @@ -23,12 +23,14 @@ input: type: file description: Pileup files from gatk4/getpileupsummaries pattern: "*.pileups.table" - - - dict: - type: file - description: dictionary + ontologies: [] + - dict: + type: file + description: dictionary + ontologies: [] output: - - table: - - meta: + table: + - - meta: type: map description: | Groovy Map containing sample information @@ -37,11 +39,28 @@ output: type: file description: pileup summaries table file pattern: "*.pileups.table" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" - "@maxulysse" diff --git a/modules/nf-core/gatk4/genomicsdbimport/environment.yml b/modules/nf-core/gatk4/genomicsdbimport/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/genomicsdbimport/environment.yml +++ b/modules/nf-core/gatk4/genomicsdbimport/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/genomicsdbimport/main.nf b/modules/nf-core/gatk4/genomicsdbimport/main.nf index 90f1200dc7..1b4d193859 100644 --- a/modules/nf-core/gatk4/genomicsdbimport/main.nf +++ b/modules/nf-core/gatk4/genomicsdbimport/main.nf @@ -1,33 +1,33 @@ process GATK4_GENOMICSDBIMPORT { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(vcf), path(tbi), path(interval_file), val(interval_value), path(wspace) - val run_intlist - val run_updatewspace - val input_map + val run_intlist + val run_updatewspace + val input_map output: - tuple val(meta), path("$prefix") , optional:true, emit: genomicsdb - tuple val(meta), path("$updated_db") , optional:true, emit: updatedb - tuple val(meta), path("*.interval_list"), optional:true, emit: intervallist - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}"), emit: genomicsdb, optional: true + tuple val(meta), path("${updated_db}"), emit: updatedb, optional: true + tuple val(meta), path("*.interval_list"), emit: intervallist, optional: true + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 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}" // settings for running default create gendb mode - input_command = input_map ? "--sample-name-map ${vcf[0]}" : vcf.collect(){"--variant $it"}.join(' ') + input_command = input_map ? "--sample-name-map ${vcf[0]}" : vcf.collect { vcf_ -> "--variant ${vcf_}" }.join(' ') genomicsdb_command = "--genomicsdb-workspace-path ${prefix}" interval_command = interval_file ? "--intervals ${interval_file}" : "--intervals ${interval_value}" @@ -48,27 +48,23 @@ process GATK4_GENOMICSDBIMPORT { def avail_mem = 3072 if (!task.memory) { - log.info '[GATK GenomicsDBImport] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK GenomicsDBImport] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ GenomicsDBImport \\ - $input_command \\ - $genomicsdb_command \\ - $interval_command \\ + ${input_command} \\ + ${genomicsdb_command} \\ + ${interval_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" genomicsdb_command = "--genomicsdb-workspace-path ${prefix}" interval_command = interval_file ? "--intervals ${interval_file}" : "--intervals ${interval_value}" @@ -88,17 +84,12 @@ process GATK4_GENOMICSDBIMPORT { } def stub_genomicsdb = genomicsdb_command == "--genomicsdb-workspace-path ${prefix}" ? "touch ${prefix}" : "" - def stub_interval = interval_command == "--output-interval-list-to-file ${prefix}.interval_list" ? "touch ${prefix}.interval_list" : "" - def stub_update = updated_db != "" ? "touch ${wspace}" : "" + def stub_interval = interval_command == "--output-interval-list-to-file ${prefix}.interval_list" ? "touch ${prefix}.interval_list" : "" + def stub_update = updated_db != "" ? "touch ${wspace}" : "" """ ${stub_genomicsdb} ${stub_interval} ${stub_update} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/genomicsdbimport/meta.yml b/modules/nf-core/gatk4/genomicsdbimport/meta.yml index ba734b288f..e1ed067698 100644 --- a/modules/nf-core/gatk4/genomicsdbimport/meta.yml +++ b/modules/nf-core/gatk4/genomicsdbimport/meta.yml @@ -36,6 +36,7 @@ input: type: file description: file containing the intervals to be used when creating the genomicsdb pattern: "*.interval_list" + ontologies: [] - interval_value: type: string description: if an intervals file has not been specified, the value entered @@ -47,68 +48,71 @@ input: get intervals mode. This WILL NOT specify name of a new genomicsdb in create db mode. pattern: "/path/to/existing/gendb" - - - run_intlist: - type: boolean - description: Specify whether to run get interval list mode, this option cannot - be specified at the same time as run_updatewspace. - pattern: "true/false" - - - run_updatewspace: - type: boolean - description: Specify whether to run update genomicsdb mode, this option takes - priority over run_intlist. - pattern: "true/false" - - - input_map: - type: boolean - description: Specify whether the vcf input is providing a list of vcf file(s) - or a single file containing a map of paths to vcf files to be used to create - or update a genomicsdb. - pattern: "*.sample_map" + ontologies: [] + - run_intlist: + type: boolean + description: Specify whether to run get interval list mode, this option cannot + be specified at the same time as run_updatewspace. + pattern: "true/false" + - run_updatewspace: + type: boolean + description: Specify whether to run update genomicsdb mode, this option takes + priority over run_intlist. + pattern: "true/false" + - input_map: + type: boolean + description: Specify whether the vcf input is providing a list of vcf file(s) + or a single file containing a map of paths to vcf files to be used to create + or update a genomicsdb. + pattern: "*.sample_map" output: - - genomicsdb: - - meta: - type: directory - description: Directory containing the files that compose the genomicsdb workspace, - this is only output for create mode, as update changes an existing db - pattern: "*/$prefix" - - $prefix: - type: directory - description: Directory containing the files that compose the genomicsdb workspace, - this is only output for create mode, as update changes an existing db - pattern: "*/$prefix" - - updatedb: - - meta: - type: directory - description: Directory containing the files that compose the updated genomicsdb - workspace, this is only output for update mode, and should be the same path - as the input wspace. - pattern: "same/path/as/wspace" - - $updated_db: - type: directory - description: Directory containing the files that compose the updated genomicsdb - workspace, this is only output for update mode, and should be the same path - as the input wspace. - pattern: "same/path/as/wspace" - - intervallist: - - meta: + genomicsdb: + - - meta: + type: map + description: A Groovy map containing sample information + - ${prefix}: type: file - description: File containing the intervals used to generate the genomicsdb, - only created by get intervals mode. - pattern: "*.interval_list" - - "*.interval_list": + description: genomicsdb + ontologies: [] + updatedb: + - - meta: + type: map + description: A Groovy map containing sample information + - ${updated_db}: type: file - description: File containing the intervals used to generate the genomicsdb, - only created by get intervals mode. - pattern: "*.interval_list" - - list: + description: updated genomicsdb + ontologies: [] + intervallist: + - - meta: + type: map + description: A Groovy map containing sample information + - "*.interval_list": type: file description: File containing the intervals used to generate the genomicsdb, only created by get intervals mode. pattern: "*.interval_list" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" maintainers: diff --git a/modules/nf-core/gatk4/genotypegvcfs/environment.yml b/modules/nf-core/gatk4/genotypegvcfs/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/genotypegvcfs/environment.yml +++ b/modules/nf-core/gatk4/genotypegvcfs/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/genotypegvcfs/main.nf b/modules/nf-core/gatk4/genotypegvcfs/main.nf index dc2813a350..e90e1d529e 100644 --- a/modules/nf-core/gatk4/genotypegvcfs/main.nf +++ b/modules/nf-core/gatk4/genotypegvcfs/main.nf @@ -1,11 +1,11 @@ process GATK4_GENOTYPEGVCFS { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(input), path(gvcf_index), path(intervals), path(intervals_index) @@ -17,8 +17,8 @@ process GATK4_GENOTYPEGVCFS { output: tuple val(meta), path("*.vcf.gz"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -26,31 +26,27 @@ process GATK4_GENOTYPEGVCFS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_command = input.name.endsWith(".vcf") || input.name.endsWith(".vcf.gz") ? "$input" : "gendb://$input" - def dbsnp_command = dbsnp ? "--dbsnp $dbsnp" : "" - def interval_command = intervals ? "--intervals $intervals" : "" + def input_command = input.name.endsWith(".vcf") || input.name.endsWith(".vcf.gz") ? "${input}" : "gendb://${input}" + def dbsnp_command = dbsnp ? "--dbsnp ${dbsnp}" : "" + def interval_command = intervals ? "--intervals ${intervals}" : "" def avail_mem = 3072 if (!task.memory) { - log.info '[GATK GenotypeGVCFs] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK GenotypeGVCFs] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ GenotypeGVCFs \\ - --variant $input_command \\ + --variant ${input_command} \\ --output ${prefix}.vcf.gz \\ - --reference $fasta \\ - $interval_command \\ - $dbsnp_command \\ + --reference ${fasta} \\ + ${interval_command} \\ + ${dbsnp_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: @@ -59,10 +55,5 @@ process GATK4_GENOTYPEGVCFS { """ echo | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/genotypegvcfs/meta.yml b/modules/nf-core/gatk4/genotypegvcfs/meta.yml index 0c1fe491fe..9fb6179b45 100644 --- a/modules/nf-core/gatk4/genotypegvcfs/meta.yml +++ b/modules/nf-core/gatk4/genotypegvcfs/meta.yml @@ -26,18 +26,22 @@ input: description: | gVCF(.gz) file or a GenomicsDB pattern: "*.{vcf,vcf.gz}" + ontologies: [] - gvcf_index: type: file description: | index of gvcf file, or empty when providing GenomicsDB pattern: "*.{idx,tbi}" + ontologies: [] - intervals: type: file description: Interval file with the genomic regions included in the library (optional) + ontologies: [] - intervals_index: type: file description: Interval index file (optional) + ontologies: [] - - meta2: type: map description: | @@ -47,6 +51,7 @@ input: type: file description: Reference fasta file pattern: "*.fasta" + ontologies: [] - - meta3: type: map description: | @@ -56,6 +61,7 @@ input: type: file description: Reference fasta index file pattern: "*.fai" + ontologies: [] - - meta4: type: map description: | @@ -65,6 +71,7 @@ input: type: file description: Reference fasta sequence dict file pattern: "*.dict" + ontologies: [] - - meta5: type: map description: | @@ -74,6 +81,8 @@ input: type: file description: dbSNP VCF file pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - - meta6: type: map description: | @@ -83,9 +92,10 @@ input: type: file description: dbSNP VCF index file pattern: "*.tbi" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -94,8 +104,10 @@ output: type: file description: Genotyped VCF file pattern: "*.vcf.gz" - - tbi: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: type: map description: | Groovy Map containing sample information @@ -104,11 +116,29 @@ output: type: file description: Tbi index for VCF file pattern: "*.vcf.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@santiagorevale" - "@maxulysse" diff --git a/modules/nf-core/gatk4/getpileupsummaries/environment.yml b/modules/nf-core/gatk4/getpileupsummaries/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/getpileupsummaries/environment.yml +++ b/modules/nf-core/gatk4/getpileupsummaries/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/getpileupsummaries/main.nf b/modules/nf-core/gatk4/getpileupsummaries/main.nf index 41fd312811..c7f6d3308a 100644 --- a/modules/nf-core/gatk4/getpileupsummaries/main.nf +++ b/modules/nf-core/gatk4/getpileupsummaries/main.nf @@ -1,23 +1,23 @@ process GATK4_GETPILEUPSUMMARIES { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(input), path(index), path(intervals) tuple val(meta2), path(fasta) tuple val(meta3), path(fai) tuple val(meta4), path(dict) - path variants - path variants_tbi + path variants + path variants_tbi output: tuple val(meta), path('*.pileups.table'), emit: table - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -25,40 +25,31 @@ process GATK4_GETPILEUPSUMMARIES { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def interval_command = intervals ? "--intervals $intervals" : "--intervals $variants" - def reference_command = fasta ? "--reference $fasta" : '' + def interval_command = intervals ? "--intervals ${intervals}" : "--intervals ${variants}" + def reference_command = fasta ? "--reference ${fasta}" : '' def avail_mem = 3072 if (!task.memory) { - log.info '[GATK GetPileupSummaries] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK GetPileupSummaries] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ GetPileupSummaries \\ - --input $input \\ - --variant $variants \\ + --input ${input} \\ + --variant ${variants} \\ --output ${prefix}.pileups.table \\ - $reference_command \\ - $interval_command \\ + ${reference_command} \\ + ${interval_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.pileups.table - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/getpileupsummaries/meta.yml b/modules/nf-core/gatk4/getpileupsummaries/meta.yml index 86b851e13a..04113b1101 100644 --- a/modules/nf-core/gatk4/getpileupsummaries/meta.yml +++ b/modules/nf-core/gatk4/getpileupsummaries/meta.yml @@ -27,15 +27,18 @@ input: type: file description: BAM/CRAM file to be summarised. pattern: "*.{bam,cram}" + ontologies: [] - index: type: file description: Index file for the input BAM/CRAM file. pattern: "*.{bam.bai,cram.crai}" + ontologies: [] - intervals: type: file description: File containing specified sites to be used for the summary. If this option is not specified, variants file is used instead automatically. pattern: "*.interval_list" + ontologies: [] - - meta2: type: map description: | @@ -45,6 +48,7 @@ input: type: file description: The reference fasta file pattern: "*.fasta" + ontologies: [] - - meta3: type: map description: | @@ -54,6 +58,7 @@ input: type: file description: Index of reference fasta file pattern: "*.fasta.fai" + ontologies: [] - - meta4: type: map description: | @@ -63,18 +68,22 @@ input: type: file description: GATK sequence dictionary pattern: "*.dict" - - - variants: - type: file - description: Population vcf of germline sequencing, containing allele fractions. - Is also used as sites file if no separate sites file is specified. - pattern: "*.vcf.gz" - - - variants_tbi: - type: file - description: Index file for the germline resource. - pattern: "*.vcf.gz.tbi" + ontologies: [] + - variants: + type: file + description: Population vcf of germline sequencing, containing allele fractions. + Is also used as sites file if no separate sites file is specified. + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - variants_tbi: + type: file + description: Index file for the germline resource. + pattern: "*.vcf.gz.tbi" + ontologies: [] output: - - table: - - meta: + table: + - - meta: type: map description: | Groovy Map containing sample information @@ -83,11 +92,28 @@ output: type: file description: Table containing read counts for each site. pattern: "*.pileups.table" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" maintainers: diff --git a/modules/nf-core/gatk4/haplotypecaller/environment.yml b/modules/nf-core/gatk4/haplotypecaller/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/haplotypecaller/environment.yml +++ b/modules/nf-core/gatk4/haplotypecaller/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/haplotypecaller/main.nf b/modules/nf-core/gatk4/haplotypecaller/main.nf index 1ef76789de..33aed81fad 100644 --- a/modules/nf-core/gatk4/haplotypecaller/main.nf +++ b/modules/nf-core/gatk4/haplotypecaller/main.nf @@ -1,14 +1,14 @@ process GATK4_HAPLOTYPECALLER { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: - tuple val(meta), path(input), path(input_index), path(intervals), path(dragstr_model) + tuple val(meta), path(input), path(input_index), path(intervals), path(dragstr_model) tuple val(meta2), path(fasta) tuple val(meta3), path(fai) tuple val(meta4), path(dict) @@ -16,10 +16,10 @@ process GATK4_HAPLOTYPECALLER { tuple val(meta6), path(dbsnp_tbi) output: - tuple val(meta), path("*.vcf.gz") , emit: vcf - tuple val(meta), path("*.tbi") , optional:true, emit: tbi - tuple val(meta), path("*.realigned.bam"), optional:true, emit: bam - path "versions.yml" , emit: versions + tuple val(meta), path("*.vcf.gz"), emit: vcf + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.realigned.bam"), emit: bam, optional: true + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -27,35 +27,31 @@ process GATK4_HAPLOTYPECALLER { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def dbsnp_command = dbsnp ? "--dbsnp $dbsnp" : "" - def interval_command = intervals ? "--intervals $intervals" : "" - def dragstr_command = dragstr_model ? "--dragstr-params-path $dragstr_model" : "" + def dbsnp_command = dbsnp ? "--dbsnp ${dbsnp}" : "" + def interval_command = intervals ? "--intervals ${intervals}" : "" + def dragstr_command = dragstr_model ? "--dragstr-params-path ${dragstr_model}" : "" def bamout_command = args.contains("--bam-writer-type") ? "--bam-output ${prefix.replaceAll('.g\\s*$', '')}.realigned.bam" : "" def avail_mem = 3072 if (!task.memory) { - log.info '[GATK HaplotypeCaller] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK HaplotypeCaller] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ HaplotypeCaller \\ - --input $input \\ + --input ${input} \\ --output ${prefix}.vcf.gz \\ - --reference $fasta \\ + --reference ${fasta} \\ --native-pair-hmm-threads ${task.cpus} \\ - $dbsnp_command \\ - $interval_command \\ - $dragstr_command \\ - $bamout_command \\ + ${dbsnp_command} \\ + ${interval_command} \\ + ${dragstr_command} \\ + ${bamout_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: @@ -65,13 +61,8 @@ process GATK4_HAPLOTYPECALLER { def stub_realigned_bam = bamout_command ? "touch ${prefix.replaceAll('.g\\s*$', '')}.realigned.bam" : "" """ - touch ${prefix}.vcf.gz + echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi ${stub_realigned_bam} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/haplotypecaller/meta.yml b/modules/nf-core/gatk4/haplotypecaller/meta.yml index 9d4a05e914..29a29bab8f 100644 --- a/modules/nf-core/gatk4/haplotypecaller/meta.yml +++ b/modules/nf-core/gatk4/haplotypecaller/meta.yml @@ -25,18 +25,22 @@ input: type: file description: BAM/CRAM file from alignment pattern: "*.{bam,cram}" + ontologies: [] - input_index: type: file description: BAI/CRAI file from alignment pattern: "*.{bai,crai}" + ontologies: [] - intervals: type: file description: Bed file with the genomic regions included in the library (optional) + ontologies: [] - dragstr_model: type: file description: Text file containing the DragSTR model of the used BAM/CRAM file (optional) pattern: "*.txt" + ontologies: [] - - meta2: type: map description: | @@ -46,6 +50,7 @@ input: type: file description: The reference fasta file pattern: "*.fasta" + ontologies: [] - - meta3: type: map description: | @@ -55,6 +60,7 @@ input: type: file description: Index of reference fasta file pattern: "fasta.fai" + ontologies: [] - - meta4: type: map description: | @@ -64,6 +70,7 @@ input: type: file description: GATK sequence dictionary pattern: "*.dict" + ontologies: [] - - meta5: type: map description: | @@ -72,6 +79,7 @@ input: - dbsnp: type: file description: VCF file containing known sites (optional) + ontologies: [] - - meta6: type: map description: | @@ -80,9 +88,10 @@ input: - dbsnp_tbi: type: file description: VCF index of dbsnp (optional) + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -91,8 +100,10 @@ output: type: file description: Compressed VCF file pattern: "*.vcf.gz" - - tbi: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: type: map description: | Groovy Map containing sample information @@ -101,8 +112,9 @@ output: type: file description: Index of VCF file pattern: "*.vcf.gz.tbi" - - bam: - - meta: + ontologies: [] + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -111,11 +123,28 @@ output: type: file description: Assembled haplotypes and locally realigned reads pattern: "*.realigned.bam" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@suzannejin" - "@FriederikeHanssen" diff --git a/modules/nf-core/gatk4/intervallisttobed/environment.yml b/modules/nf-core/gatk4/intervallisttobed/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/intervallisttobed/environment.yml +++ b/modules/nf-core/gatk4/intervallisttobed/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/intervallisttobed/main.nf b/modules/nf-core/gatk4/intervallisttobed/main.nf index a7b05edbfc..94330b063e 100644 --- a/modules/nf-core/gatk4/intervallisttobed/main.nf +++ b/modules/nf-core/gatk4/intervallisttobed/main.nf @@ -3,16 +3,16 @@ process GATK4_INTERVALLISTTOBED { 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data' - : 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(intervals) output: tuple val(meta), path("${prefix}.bed"), emit: bed - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -35,11 +35,6 @@ process GATK4_INTERVALLISTTOBED { --OUTPUT ${prefix}.bed \\ --TMP_DIR . \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ stub: @@ -47,10 +42,5 @@ process GATK4_INTERVALLISTTOBED { """ touch ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/intervallisttobed/meta.yml b/modules/nf-core/gatk4/intervallisttobed/meta.yml index f151daafdb..316f66bf54 100644 --- a/modules/nf-core/gatk4/intervallisttobed/meta.yml +++ b/modules/nf-core/gatk4/intervallisttobed/meta.yml @@ -23,9 +23,10 @@ input: - intervals: type: file description: IntervalList file + ontologies: [] output: - - bed: - - meta: + bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -36,11 +37,27 @@ output: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] pattern: "${prefix}.bed" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" maintainers: diff --git a/modules/nf-core/gatk4/learnreadorientationmodel/environment.yml b/modules/nf-core/gatk4/learnreadorientationmodel/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/learnreadorientationmodel/environment.yml +++ b/modules/nf-core/gatk4/learnreadorientationmodel/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/learnreadorientationmodel/main.nf b/modules/nf-core/gatk4/learnreadorientationmodel/main.nf index 86e7daaa6c..500da54741 100644 --- a/modules/nf-core/gatk4/learnreadorientationmodel/main.nf +++ b/modules/nf-core/gatk4/learnreadorientationmodel/main.nf @@ -1,18 +1,18 @@ process GATK4_LEARNREADORIENTATIONMODEL { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(f1r2) output: tuple val(meta), path("*.tar.gz"), emit: artifactprior - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -20,25 +20,27 @@ process GATK4_LEARNREADORIENTATIONMODEL { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_list = f1r2.collect{"--input $it"}.join(' ') + def input_list = f1r2.collect { f1r2_ -> "--input ${f1r2_}" }.join(' ') def avail_mem = 3072 if (!task.memory) { - log.info '[GATK LearnReadOrientationModel] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK LearnReadOrientationModel] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ LearnReadOrientationModel \\ - $input_list \\ + ${input_list} \\ --output ${prefix}.tar.gz \\ --tmp-dir . \\ - $args + ${args} + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + echo "" | gzip > ${prefix}.tar.gz """ } diff --git a/modules/nf-core/gatk4/learnreadorientationmodel/meta.yml b/modules/nf-core/gatk4/learnreadorientationmodel/meta.yml index fde7829c8d..cf14f02a91 100644 --- a/modules/nf-core/gatk4/learnreadorientationmodel/meta.yml +++ b/modules/nf-core/gatk4/learnreadorientationmodel/meta.yml @@ -28,20 +28,40 @@ input: description: list of f1r2 files to be used as input. pattern: "*.f1r2.tar.gz" output: - - artifactprior: - - meta: + artifactprior: + - - meta: type: file description: file containing artifact-priors to be used by filtermutectcalls pattern: "*.tar.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - "*.tar.gz": type: file description: file containing artifact-priors to be used by filtermutectcalls pattern: "*.tar.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" maintainers: diff --git a/modules/nf-core/gatk4/markduplicates/environment.yml b/modules/nf-core/gatk4/markduplicates/environment.yml index ca0fc1923a..4a13c61341 100644 --- a/modules/nf-core/gatk4/markduplicates/environment.yml +++ b/modules/nf-core/gatk4/markduplicates/environment.yml @@ -6,7 +6,10 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 + # do not update - later htslib versions not compatible with gcnvkernel - bioconda::htslib=1.21 + # do not update - later samtools versions not compatible with gcnvkernel - bioconda::samtools=1.21 diff --git a/modules/nf-core/gatk4/markduplicates/main.nf b/modules/nf-core/gatk4/markduplicates/main.nf index f4bd896bf3..6fd44ea2ec 100644 --- a/modules/nf-core/gatk4/markduplicates/main.nf +++ b/modules/nf-core/gatk4/markduplicates/main.nf @@ -3,9 +3,9 @@ process GATK4_MARKDUPLICATES { 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/92/927ff9bb80d65b425cbe752db6648a84043feff6e8ca90e60f9ff6ddbe8938d5/data' - : 'community.wave.seqera.io/library/gatk4_gcnvkernel_htslib_samtools:c1e4292d6ee27439'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e3/e3d753d93f57969fe76b8628a8dfcd23ef44bccd08c4ced7089c1f94bf47c89f/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel_htslib_samtools:d3becb6465454c35'}" input: tuple val(meta), path(bam) @@ -18,7 +18,8 @@ process GATK4_MARKDUPLICATES { tuple val(meta), path("*.crai"), emit: crai, optional: true tuple val(meta), path("*.bai"), emit: bai, optional: true tuple val(meta), path("*.metrics"), emit: metrics - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 + 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 @@ -30,7 +31,7 @@ process GATK4_MARKDUPLICATES { // If the extension is CRAM, then change it to BAM prefix_bam = prefix.tokenize('.')[-1] == 'cram' ? "${prefix.substring(0, prefix.lastIndexOf('.'))}.bam" : prefix - def input_list = bam.collect { "--INPUT ${it}" }.join(' ') + def input_list = bam.collect { bam_ -> "--INPUT ${bam_}" }.join(' ') def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" def avail_mem = 3072 @@ -59,12 +60,6 @@ process GATK4_MARKDUPLICATES { rm ${prefix_bam} samtools index ${prefix} fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -76,11 +71,5 @@ process GATK4_MARKDUPLICATES { touch ${prefix_no_suffix}.cram.crai touch ${prefix_no_suffix}.bai touch ${prefix}.metrics - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/markduplicates/meta.yml b/modules/nf-core/gatk4/markduplicates/meta.yml index 4772c5f39a..33dbc1a3cb 100644 --- a/modules/nf-core/gatk4/markduplicates/meta.yml +++ b/modules/nf-core/gatk4/markduplicates/meta.yml @@ -1,6 +1,7 @@ name: gatk4_markduplicates -description: This tool locates and tags duplicate reads in a BAM or SAM file, where - duplicate reads are defined as originating from a single fragment of DNA. +description: This tool locates and tags duplicate reads in a BAM or SAM file, + where duplicate reads are defined as originating from a single fragment of + DNA. keywords: - bam - gatk4 @@ -8,10 +9,11 @@ keywords: - sort tools: - gatk4: - description: Developed in the Data Sciences Platform at the Broad Institute, the - toolkit offers a wide variety of tools with a primary focus on variant discovery - and genotyping. Its powerful processing engine and high-performance computing - features make it capable of taking on projects of any size. + description: Developed in the Data Sciences Platform at the Broad Institute, + the toolkit offers a wide variety of tools with a primary focus on variant + discovery and genotyping. Its powerful processing engine and + high-performance computing features make it capable of taking on projects + of any size. homepage: https://gatk.broadinstitute.org/hc/en-us documentation: https://gatk.broadinstitute.org/hc/en-us/articles/360037052812-MarkDuplicates-Picard- tool_dev_url: https://github.com/broadinstitute/gatk @@ -28,17 +30,20 @@ input: type: file description: Sorted BAM file pattern: "*.{bam}" - - - fasta: - type: file - description: Fasta file - pattern: "*.{fasta}" - - - fasta_fai: - type: file - description: Fasta index file - pattern: "*.{fai}" + ontologies: [] + - fasta: + type: file + description: Fasta file + pattern: "*.{fasta}" + ontologies: [] + - fasta_fai: + type: file + description: Fasta index file + pattern: "*.{fai}" + ontologies: [] output: - - cram: - - meta: + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -47,8 +52,9 @@ output: type: file description: Marked duplicates CRAM file pattern: "*.{cram}" - - bam: - - meta: + ontologies: [] + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -57,8 +63,9 @@ output: type: file description: Marked duplicates BAM file pattern: "*.{bam}" - - crai: - - meta: + ontologies: [] + crai: + - - meta: type: map description: | Groovy Map containing sample information @@ -67,8 +74,9 @@ output: type: file description: CRAM index file pattern: "*.{cram.crai}" - - bai: - - meta: + ontologies: [] + bai: + - - meta: type: map description: | Groovy Map containing sample information @@ -77,8 +85,9 @@ output: type: file description: BAM index file pattern: "*.{bam.bai}" - - metrics: - - meta: + ontologies: [] + metrics: + - - meta: type: map description: | Groovy Map containing sample information @@ -87,11 +96,49 @@ output: type: file description: Duplicate metrics file generated by GATK pattern: "*.{metrics.txt}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool + 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: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool + - - ${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: - "@ajodeh-juma" - "@FriederikeHanssen" diff --git a/modules/nf-core/gatk4/mergemutectstats/environment.yml b/modules/nf-core/gatk4/mergemutectstats/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/mergemutectstats/environment.yml +++ b/modules/nf-core/gatk4/mergemutectstats/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/mergemutectstats/main.nf b/modules/nf-core/gatk4/mergemutectstats/main.nf index e6ddc6994c..a1da0358c7 100644 --- a/modules/nf-core/gatk4/mergemutectstats/main.nf +++ b/modules/nf-core/gatk4/mergemutectstats/main.nf @@ -1,18 +1,18 @@ process GATK4_MERGEMUTECTSTATS { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(stats) output: tuple val(meta), path("*.vcf.gz.stats"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -20,36 +20,27 @@ process GATK4_MERGEMUTECTSTATS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_list = stats.collect{ "--stats ${it}"}.join(' ') + def input_list = stats.collect { stats_ -> "--stats ${stats_}" }.join(' ') def avail_mem = 3072 if (!task.memory) { - log.info '[GATK MergeMutectStats] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK MergeMutectStats] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ MergeMutectStats \\ - $input_list \\ + ${input_list} \\ --output ${prefix}.vcf.gz.stats \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.vcf.gz.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/mergemutectstats/meta.yml b/modules/nf-core/gatk4/mergemutectstats/meta.yml index 09c8a54720..fc941347b0 100644 --- a/modules/nf-core/gatk4/mergemutectstats/meta.yml +++ b/modules/nf-core/gatk4/mergemutectstats/meta.yml @@ -24,9 +24,10 @@ input: type: file description: Stats file pattern: "*.{stats}" + ontologies: [] output: - - stats: - - meta: + stats: + - - meta: type: map description: | Groovy Map containing sample information @@ -35,11 +36,28 @@ output: type: file description: Stats file pattern: "*.vcf.gz.stats" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" maintainers: diff --git a/modules/nf-core/gatk4/mutect2/environment.yml b/modules/nf-core/gatk4/mutect2/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/mutect2/environment.yml +++ b/modules/nf-core/gatk4/mutect2/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/mutect2/main.nf b/modules/nf-core/gatk4/mutect2/main.nf index 756dfca942..2ad8dba757 100644 --- a/modules/nf-core/gatk4/mutect2/main.nf +++ b/modules/nf-core/gatk4/mutect2/main.nf @@ -1,75 +1,70 @@ process GATK4_MUTECT2 { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: tuple val(meta), path(input), path(input_index), path(intervals) tuple val(meta2), path(fasta) - tuple val(meta3), path(fai) + tuple val(meta3), path(fai), path(gzi) tuple val(meta4), path(dict) - path(germline_resource) - path(germline_resource_tbi) - path(panel_of_normals) - path(panel_of_normals_tbi) + path alleles + path alleles_tbi + path germline_resource + path germline_resource_tbi + path panel_of_normals + path panel_of_normals_tbi output: - tuple val(meta), path("*.vcf.gz") , emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi - tuple val(meta), path("*.stats") , emit: stats - tuple val(meta), path("*.f1r2.tar.gz"), optional:true, emit: f1r2 - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}.vcf.gz"), emit: vcf + tuple val(meta), path("${prefix}.vcf.gz.stats"), emit: stats + tuple val(meta), path("${prefix}.vcf.gz.tbi"), emit: tbi + tuple val(meta), path("${prefix}.f1r2.tar.gz"), emit: f1r2, optional: true + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def inputs = input.collect{ "--input $it"}.join(" ") - def interval_command = intervals ? "--intervals $intervals" : "" - def pon_command = panel_of_normals ? "--panel-of-normals $panel_of_normals" : "" - def gr_command = germline_resource ? "--germline-resource $germline_resource" : "" + prefix = task.ext.prefix ?: "${meta.id}" + def inputs = input.collect { vcf_ -> "--input ${vcf_}" }.join(" ") + def interval_command = intervals ? "--intervals ${intervals}" : "" + def pon_command = panel_of_normals ? "--panel-of-normals ${panel_of_normals}" : "" + def gr_command = germline_resource ? "--germline-resource ${germline_resource}" : "" + def a_command = alleles ? "--alleles ${alleles}" : "" def avail_mem = 3072 if (!task.memory) { - log.info '[GATK Mutect2] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK Mutect2] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ Mutect2 \\ - $inputs \\ + ${inputs} \\ --output ${prefix}.vcf.gz \\ - --reference $fasta \\ - $pon_command \\ - $gr_command \\ - $interval_command \\ + --reference ${fasta} \\ + ${pon_command} \\ + ${gr_command} \\ + ${a_command} \\ + ${interval_command} \\ --tmp-dir . \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${args} """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ echo "" | gzip > ${prefix}.vcf.gz touch ${prefix}.vcf.gz.tbi touch ${prefix}.vcf.gz.stats echo "" | gzip > ${prefix}.f1r2.tar.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/mutect2/meta.yml b/modules/nf-core/gatk4/mutect2/meta.yml index 27fd63a243..cbcae28299 100644 --- a/modules/nf-core/gatk4/mutect2/meta.yml +++ b/modules/nf-core/gatk4/mutect2/meta.yml @@ -37,6 +37,7 @@ input: type: file description: Specify region the tools is run on. pattern: ".{bed,interval_list}" + ontologies: [] - - meta2: type: map description: | @@ -45,7 +46,8 @@ input: - fasta: type: file description: The reference fasta file - pattern: "*.fasta" + pattern: "*.{fasta,fasta.gz}" + ontologies: [] - - meta3: type: map description: | @@ -54,7 +56,13 @@ input: - fai: type: file description: Index of reference fasta file - pattern: "*.fasta.fai" + pattern: "*.{fasta.fai,fasta.fai.gz}" + ontologies: [] + - gzi: + type: file + description: Index of bgzipped reference fasta file + pattern: "*.fasta.gz.gzi" + ontologies: [] - - meta4: type: map description: | @@ -64,66 +72,101 @@ input: type: file description: GATK sequence dictionary pattern: "*.dict" - - - germline_resource: - type: file - description: Population vcf of germline sequencing, containing allele fractions. - pattern: "*.vcf.gz" - - - germline_resource_tbi: - type: file - description: Index file for the germline resource. - pattern: "*.vcf.gz.tbi" - - - panel_of_normals: - type: file - description: vcf file to be used as a panel of normals. - pattern: "*.vcf.gz" - - - panel_of_normals_tbi: - type: file - description: Index for the panel of normals. - pattern: "*.vcf.gz.tbi" + ontologies: [] + - alleles: + type: file + description: vcf file to be used to force-call alleles. + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - alleles_tbi: + type: file + description: Index file for alleles to be force-called. + pattern: "*.vcf.gz.tbi" + ontologies: [] + - germline_resource: + type: file + description: Population vcf of germline sequencing, containing allele fractions. + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - germline_resource_tbi: + type: file + description: Index file for the germline resource. + pattern: "*.vcf.gz.tbi" + ontologies: [] + - panel_of_normals: + type: file + description: vcf file to be used as a panel of normals. + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - panel_of_normals_tbi: + type: file + description: Index for the panel of normals. + pattern: "*.vcf.gz.tbi" + ontologies: [] output: - - vcf: - - meta: - type: file - description: compressed vcf file - pattern: "*.vcf.gz" - - "*.vcf.gz": + vcf: + - - meta: + type: map + description: A Groovy map containing sample information + - "${prefix}.vcf.gz": type: file description: compressed vcf file - pattern: "*.vcf.gz" - - tbi: - - meta: + pattern: "${prefix}.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + tbi: + - - meta: + type: map + description: A Groovy map containing sample information + - "${prefix}.vcf.gz.tbi": type: file description: Index of vcf file - pattern: "*vcf.gz.tbi" - - "*.tbi": - type: file - description: Index of vcf file - pattern: "*vcf.gz.tbi" - - stats: - - meta: - type: file - description: Stats file that pairs with output vcf file - pattern: "*vcf.gz.stats" - - "*.stats": + pattern: "${prefix}.vcf.gz.tbi" + ontologies: [] + stats: + - - meta: + type: map + description: A Groovy map containing sample information + - "${prefix}.vcf.gz.stats": type: file description: Stats file that pairs with output vcf file - pattern: "*vcf.gz.stats" - - f1r2: - - meta: + pattern: "${prefix}.vcf.gz.stats" + ontologies: [] + f1r2: + - - meta: + type: map + description: A Groovy map containing sample information + - "${prefix}.f1r2.tar.gz": type: file description: file containing information to be passed to LearnReadOrientationModel (only outputted when tumor_normal_pair mode is run) - pattern: "*.f1r2.tar.gz" - - "*.f1r2.tar.gz": - type: file - description: file containing information to be passed to LearnReadOrientationModel - (only outputted when tumor_normal_pair mode is run) - pattern: "*.f1r2.tar.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + pattern: "${prefix}.f1r2.tar.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" - "@ramprasadn" diff --git a/modules/nf-core/gatk4/variantrecalibrator/environment.yml b/modules/nf-core/gatk4/variantrecalibrator/environment.yml index b562b72c74..67e0eb860a 100644 --- a/modules/nf-core/gatk4/variantrecalibrator/environment.yml +++ b/modules/nf-core/gatk4/variantrecalibrator/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/gatk4 - - bioconda::gatk4=4.6.1.0 + - bioconda::gatk4=4.6.2.0 + # renovate: datasource=conda depName=bioconda/gcnvkernel - bioconda::gcnvkernel=0.9 diff --git a/modules/nf-core/gatk4/variantrecalibrator/main.nf b/modules/nf-core/gatk4/variantrecalibrator/main.nf index 3c6048f4ba..385d7ba28f 100644 --- a/modules/nf-core/gatk4/variantrecalibrator/main.nf +++ b/modules/nf-core/gatk4/variantrecalibrator/main.nf @@ -1,27 +1,27 @@ process GATK4_VARIANTRECALIBRATOR { - tag "$meta.id" + 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/b2/b28daf5d9bb2f0d129dcad1b7410e0dd8a9b087aaf3ec7ced929b1f57624ad98/data': - 'community.wave.seqera.io/library/gatk4_gcnvkernel:e48d414933d188cd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/ce/ced519873646379e287bc28738bdf88e975edd39a92e7bc6a34bccd37153d9d0/data' + : 'community.wave.seqera.io/library/gatk4_gcnvkernel:edb12e4f0bf02cd3'}" input: - tuple val(meta), path(vcf), path(tbi) // input vcf and tbi of variants to recalibrate - path resource_vcf // resource vcf - path resource_tbi // resource tbi - val labels // string (or list of strings) containing dedicated resource labels already formatted with '--resource:' tag - path fasta - path fai - path dict + tuple val(meta), path(vcf), path(tbi) + path resource_vcf + path resource_tbi + val labels + path fasta + path fai + path dict output: - tuple val(meta), path("*.recal") , emit: recal - tuple val(meta), path("*.idx") , emit: idx + tuple val(meta), path("*.recal"), emit: recal + tuple val(meta), path("*.idx"), emit: idx tuple val(meta), path("*.tranches"), emit: tranches - tuple val(meta), path("*plots.R") , emit: plots, optional:true - path "versions.yml" , emit: versions + tuple val(meta), path("*plots.R"), emit: plots, optional: true + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -29,43 +29,34 @@ process GATK4_VARIANTRECALIBRATOR { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def reference_command = fasta ? "--reference $fasta " : '' + def reference_command = fasta ? "--reference ${fasta} " : '' def labels_command = labels.join(' ') def avail_mem = 3072 if (!task.memory) { - log.info '[GATK VariantRecalibrator] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.' - } else { - avail_mem = (task.memory.mega*0.8).intValue() + log.info('[GATK VariantRecalibrator] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') + } + else { + avail_mem = (task.memory.mega * 0.8).intValue() } """ gatk --java-options "-Xmx${avail_mem}M -XX:-UsePerfData" \\ VariantRecalibrator \\ - --variant $vcf \\ + --variant ${vcf} \\ --output ${prefix}.recal \\ --tranches-file ${prefix}.tranches \\ - $reference_command \\ + ${reference_command} \\ --tmp-dir . \\ - $labels_command \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS + ${labels_command} \\ + ${args} """ stub: - prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.recal touch ${prefix}.idx touch ${prefix}.tranches touch ${prefix}plots.R - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4/variantrecalibrator/meta.yml b/modules/nf-core/gatk4/variantrecalibrator/meta.yml index 72fcfd601c..275e3a4f8c 100644 --- a/modules/nf-core/gatk4/variantrecalibrator/meta.yml +++ b/modules/nf-core/gatk4/variantrecalibrator/meta.yml @@ -29,81 +29,114 @@ input: type: file description: input vcf file containing the variants to be recalibrated pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format - tbi: type: file description: tbi file matching with -vcf pattern: "*.vcf.gz.tbi" - - - resource_vcf: - type: file - description: all resource vcf files that are used with the corresponding '--resource' - label - pattern: "*.vcf.gz" - - - resource_tbi: - type: file - description: all resource tbi files that are used with the corresponding '--resource' - label - pattern: "*.vcf.gz.tbi" - - - labels: - type: string - description: necessary arguments for GATK VariantRecalibrator. Specified to - directly match the resources provided. More information can be found at - https://gatk.broadinstitute.org/hc/en-us/articles/5358906115227-VariantRecalibrator - - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - - fai: - type: file - description: Index of reference fasta file - pattern: "fasta.fai" - - - dict: - type: file - description: GATK sequence dictionary - pattern: "*.dict" + ontologies: [] + - resource_vcf: + type: file + description: all resource vcf files that are used with the corresponding '--resource' + label + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - resource_tbi: + type: file + description: all resource tbi files that are used with the corresponding '--resource' + label + pattern: "*.vcf.gz.tbi" + ontologies: [] + - labels: + type: string + description: necessary arguments for GATK VariantRecalibrator. Specified to directly + match the resources provided. More information can be found at + https://gatk.broadinstitute.org/hc/en-us/articles/5358906115227-VariantRecalibrator + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Index of reference fasta file + pattern: "fasta.fai" + ontologies: [] + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + ontologies: [] output: - - recal: - - meta: + recal: + - - meta: type: file description: Output recal file used by ApplyVQSR pattern: "*.recal" + ontologies: [] - "*.recal": type: file description: Output recal file used by ApplyVQSR pattern: "*.recal" - - idx: - - meta: + ontologies: [] + idx: + - - meta: type: file - description: Index file for the recal output file - pattern: "*.idx" + description: Output recal file used by ApplyVQSR + pattern: "*.recal" + ontologies: [] - "*.idx": type: file description: Index file for the recal output file pattern: "*.idx" - - tranches: - - meta: + ontologies: [] + tranches: + - - meta: type: file - description: Output tranches file used by ApplyVQSR - pattern: "*.tranches" + description: Output recal file used by ApplyVQSR + pattern: "*.recal" + ontologies: [] - "*.tranches": type: file description: Output tranches file used by ApplyVQSR pattern: "*.tranches" - - plots: - - meta: + ontologies: [] + plots: + - - meta: type: file - description: Optional output rscript file to aid in visualization of the input - data and learned model. - pattern: "*plots.R" + description: Output recal file used by ApplyVQSR + pattern: "*.recal" + ontologies: [] - "*plots.R": type: file description: Optional output rscript file to aid in visualization of the input data and learned model. pattern: "*plots.R" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3999 # R script + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@GCJMackenzie" - "@nickhsmith" diff --git a/modules/nf-core/gatk4spark/applybqsr/environment.yml b/modules/nf-core/gatk4spark/applybqsr/environment.yml index a5c49e9557..fa5743a55f 100644 --- a/modules/nf-core/gatk4spark/applybqsr/environment.yml +++ b/modules/nf-core/gatk4spark/applybqsr/environment.yml @@ -4,4 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::gatk4-spark=4.6.1.0 + # renovate: datasource=conda depName=bioconda/gatk4-spark + - bioconda::gatk4-spark=4.6.2.0 diff --git a/modules/nf-core/gatk4spark/applybqsr/main.nf b/modules/nf-core/gatk4spark/applybqsr/main.nf index 0c798f1ad7..4aec53545c 100644 --- a/modules/nf-core/gatk4spark/applybqsr/main.nf +++ b/modules/nf-core/gatk4spark/applybqsr/main.nf @@ -3,9 +3,9 @@ process GATK4SPARK_APPLYBQSR { label 'process_low' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'https://depot.galaxyproject.org/singularity/gatk4-spark:4.6.1.0--hdfd78af_0' - : 'biocontainers/gatk4-spark:4.6.1.0--hdfd78af_0'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/49/498aea9c9bcaf736b9fb2a01366c1b7b38ccc0d38143178afc325d6a93241447/data' + : 'community.wave.seqera.io/library/gatk4-spark:4.6.2.0--8b5cd67ee60a714e'}" input: tuple val(meta), path(input), path(input_index), path(bqsr_table), path(intervals) @@ -14,10 +14,10 @@ process GATK4SPARK_APPLYBQSR { path dict output: - tuple val(meta), path("${prefix}.bam"), emit: bam, optional: true - tuple val(meta), path("${prefix}*bai"), emit: bai, optional: true + tuple val(meta), path("${prefix}.bam"), emit: bam, optional: true + tuple val(meta), path("${prefix}*bai"), emit: bai, optional: true tuple val(meta), path("${prefix}.cram"), emit: cram, optional: true - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -47,11 +47,6 @@ process GATK4SPARK_APPLYBQSR { --spark-master local[${task.cpus}] \\ --tmp-dir . \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ stub: @@ -62,10 +57,5 @@ process GATK4SPARK_APPLYBQSR { if [[ ${suffix} == bam ]]; then touch ${prefix}.${suffix}.bai fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4spark/applybqsr/meta.yml b/modules/nf-core/gatk4spark/applybqsr/meta.yml index da7bf56808..4d5c25821c 100644 --- a/modules/nf-core/gatk4spark/applybqsr/meta.yml +++ b/modules/nf-core/gatk4spark/applybqsr/meta.yml @@ -39,7 +39,8 @@ input: ontologies: [] - intervals: type: file - description: Bed file with the genomic regions included in the library (optional) + description: Bed file with the genomic regions included in the library + (optional) ontologies: [] - fasta: type: file @@ -90,13 +91,29 @@ output: description: Recalibrated CRAM file pattern: "${prefix}.cram" ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + 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 + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool + authors: - "@yocra3" - "@FriederikeHanssen" diff --git a/modules/nf-core/gatk4spark/baserecalibrator/environment.yml b/modules/nf-core/gatk4spark/baserecalibrator/environment.yml index a5c49e9557..fa5743a55f 100644 --- a/modules/nf-core/gatk4spark/baserecalibrator/environment.yml +++ b/modules/nf-core/gatk4spark/baserecalibrator/environment.yml @@ -4,4 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::gatk4-spark=4.6.1.0 + # renovate: datasource=conda depName=bioconda/gatk4-spark + - bioconda::gatk4-spark=4.6.2.0 diff --git a/modules/nf-core/gatk4spark/baserecalibrator/main.nf b/modules/nf-core/gatk4spark/baserecalibrator/main.nf index 1f9e2cb595..2b8deb171f 100644 --- a/modules/nf-core/gatk4spark/baserecalibrator/main.nf +++ b/modules/nf-core/gatk4spark/baserecalibrator/main.nf @@ -3,9 +3,9 @@ process GATK4SPARK_BASERECALIBRATOR { label 'process_low' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'https://depot.galaxyproject.org/singularity/gatk4-spark:4.6.1.0--hdfd78af_0' - : 'biocontainers/gatk4-spark:4.6.1.0--hdfd78af_0'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/49/498aea9c9bcaf736b9fb2a01366c1b7b38ccc0d38143178afc325d6a93241447/data' + : 'community.wave.seqera.io/library/gatk4-spark:4.6.2.0--8b5cd67ee60a714e'}" input: tuple val(meta), path(input), path(input_index), path(intervals) @@ -17,7 +17,7 @@ process GATK4SPARK_BASERECALIBRATOR { output: tuple val(meta), path("*.table"), emit: table - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -26,7 +26,7 @@ process GATK4SPARK_BASERECALIBRATOR { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def interval_command = intervals ? "--intervals ${intervals}" : "" - def sites_command = known_sites.collect { "--known-sites ${it}" }.join(' ') + def sites_command = known_sites.collect { vcf -> "--known-sites ${vcf}" }.join(' ') def avail_mem = 3072 if (!task.memory) { @@ -46,11 +46,6 @@ process GATK4SPARK_BASERECALIBRATOR { --spark-master local[${task.cpus}] \\ --tmp-dir . \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ stub: @@ -58,10 +53,5 @@ process GATK4SPARK_BASERECALIBRATOR { """ touch ${prefix}.table - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4spark/baserecalibrator/meta.yml b/modules/nf-core/gatk4spark/baserecalibrator/meta.yml index abb0e1a65e..e8e2a723b6 100644 --- a/modules/nf-core/gatk4spark/baserecalibrator/meta.yml +++ b/modules/nf-core/gatk4spark/baserecalibrator/meta.yml @@ -27,36 +27,45 @@ input: type: file description: BAM/CRAM file from alignment pattern: "*.{bam,cram}" + ontologies: [] - input_index: type: file description: BAI/CRAI file from alignment pattern: "*.{bai,crai}" + ontologies: [] - intervals: type: file description: Bed file with the genomic regions included in the library (optional) - - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - - fai: - type: file - description: Index of reference fasta file - pattern: "*.fasta.fai" - - - dict: - type: file - description: GATK sequence dictionary - pattern: "*.dict" - - - known_sites: - type: file - description: VCF files with known sites for indels / snps (optional) - pattern: "*.vcf.gz" - - - known_sites_tbi: - type: file - description: Tabix index of the known_sites (optional) - pattern: "*.vcf.gz.tbi" + ontologies: [] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - fai: + type: file + description: Index of reference fasta file + pattern: "*.fasta.fai" + ontologies: [] + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + ontologies: [] + - known_sites: + type: file + description: VCF files with known sites for indels / snps (optional) + pattern: "*.vcf.gz" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + - known_sites_tbi: + type: file + description: Tabix index of the known_sites (optional) + pattern: "*.vcf.gz.tbi" + ontologies: [] output: - - table: - - meta: + table: + - - meta: type: map description: | Groovy Map containing sample information @@ -65,11 +74,28 @@ output: type: file description: Recalibration table from BaseRecalibrator pattern: "*.{table}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@yocra3" - "@FriederikeHanssen" diff --git a/modules/nf-core/gatk4spark/markduplicates/environment.yml b/modules/nf-core/gatk4spark/markduplicates/environment.yml index a5c49e9557..fa5743a55f 100644 --- a/modules/nf-core/gatk4spark/markduplicates/environment.yml +++ b/modules/nf-core/gatk4spark/markduplicates/environment.yml @@ -4,4 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::gatk4-spark=4.6.1.0 + # renovate: datasource=conda depName=bioconda/gatk4-spark + - bioconda::gatk4-spark=4.6.2.0 diff --git a/modules/nf-core/gatk4spark/markduplicates/main.nf b/modules/nf-core/gatk4spark/markduplicates/main.nf index a0dcf3fee4..2278afa1ef 100644 --- a/modules/nf-core/gatk4spark/markduplicates/main.nf +++ b/modules/nf-core/gatk4spark/markduplicates/main.nf @@ -3,9 +3,9 @@ process GATK4SPARK_MARKDUPLICATES { label 'process_high' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container - ? 'https://depot.galaxyproject.org/singularity/gatk4-spark:4.6.1.0--hdfd78af_0' - : 'biocontainers/gatk4-spark:4.6.1.0--hdfd78af_0'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/49/498aea9c9bcaf736b9fb2a01366c1b7b38ccc0d38143178afc325d6a93241447/data' + : 'community.wave.seqera.io/library/gatk4-spark:4.6.2.0--8b5cd67ee60a714e'}" input: tuple val(meta), path(bam) @@ -14,10 +14,10 @@ process GATK4SPARK_MARKDUPLICATES { path dict output: - tuple val(meta), path("${prefix}"), emit: output + tuple val(meta), path("${prefix}"), emit: output tuple val(meta), path("${prefix}.bai"), emit: bam_index, optional: true - tuple val(meta), path("*.metrics"), emit: metrics, optional: true - path "versions.yml", emit: versions + tuple val(meta), path("*.metrics"), emit: metrics, optional: true + tuple val("${task.process}"), val('gatk4'), eval("gatk --version | sed -n '/GATK.*v/s/.*v//p'"), topic: versions, emit: versions_gatk4 when: task.ext.when == null || task.ext.when @@ -25,7 +25,7 @@ process GATK4SPARK_MARKDUPLICATES { script: def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}.bam" - def input_list = bam.collect { "--input ${it}" }.join(' ') + def input_list = bam.collect { bam_ -> "--input ${bam_}" }.join(' ') def avail_mem = 3072 if (!task.memory) { @@ -43,11 +43,6 @@ process GATK4SPARK_MARKDUPLICATES { --spark-master local[${task.cpus}] \\ --tmp-dir . \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ stub: @@ -56,10 +51,5 @@ process GATK4SPARK_MARKDUPLICATES { touch ${prefix} touch ${prefix}.bai touch ${prefix}.metrics - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gatk4: \$(echo \$(gatk --version 2>&1) | sed 's/^.*(GATK) v//; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gatk4spark/markduplicates/meta.yml b/modules/nf-core/gatk4spark/markduplicates/meta.yml index fc8dee3dff..2f60373282 100644 --- a/modules/nf-core/gatk4spark/markduplicates/meta.yml +++ b/modules/nf-core/gatk4spark/markduplicates/meta.yml @@ -28,21 +28,25 @@ input: type: file description: Sorted BAM file pattern: "*.{bam}" - - - fasta: - type: file - description: The reference fasta file - pattern: "*.fasta" - - - fasta_fai: - type: file - description: Index of reference fasta file - pattern: "*.fai" - - - dict: - type: file - description: GATK sequence dictionary - pattern: "*.dict" + ontologies: [] + - fasta: + type: file + description: The reference fasta file + pattern: "*.fasta" + ontologies: [] + - fasta_fai: + type: file + description: Index of reference fasta file + pattern: "*.fai" + ontologies: [] + - dict: + type: file + description: GATK sequence dictionary + pattern: "*.dict" + ontologies: [] output: - - output: - - meta: + output: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,8 +55,9 @@ output: type: file description: Marked duplicates BAM/CRAM file pattern: "*.{bam,cram}" - - bam_index: - - meta: + ontologies: [] + bam_index: + - - meta: type: map description: | Groovy Map containing sample information @@ -61,8 +66,9 @@ output: type: file description: Optional BAM index file pattern: "*.bai" - - metrics: - - meta: + ontologies: [] + metrics: + - - meta: type: map description: | Groovy Map containing sample information @@ -71,11 +77,28 @@ output: type: file description: Metrics file pattern: "*.metrics" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gatk4: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gatk4: + type: string + description: The name of the tool + - gatk --version | sed -n '/GATK.*v/s/.*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@ajodeh-juma" - "@FriederikeHanssen" diff --git a/subworkflows/local/bam_applybqsr/main.nf b/subworkflows/local/bam_applybqsr/main.nf index 597a7793cb..0814ed4e2c 100644 --- a/subworkflows/local/bam_applybqsr/main.nf +++ b/subworkflows/local/bam_applybqsr/main.nf @@ -57,7 +57,6 @@ workflow BAM_APPLYBQSR { // Gather versions of all tools used versions = versions.mix(BAM_MERGE_INDEX_SAMTOOLS.out.versions) versions = versions.mix(CRAM_MERGE_INDEX_SAMTOOLS.out.versions) - versions = versions.mix(GATK4_APPLYBQSR.out.versions) emit: alignment = recal_out // channel: [ meta, file, index ] — BAM or CRAM diff --git a/subworkflows/local/bam_applybqsr_spark/main.nf b/subworkflows/local/bam_applybqsr_spark/main.nf index 16e1e323ba..2948e97b04 100644 --- a/subworkflows/local/bam_applybqsr_spark/main.nf +++ b/subworkflows/local/bam_applybqsr_spark/main.nf @@ -57,7 +57,6 @@ workflow BAM_APPLYBQSR_SPARK { // Gather versions of all tools used versions = versions.mix(BAM_MERGE_INDEX_SAMTOOLS.out.versions) versions = versions.mix(CRAM_MERGE_INDEX_SAMTOOLS.out.versions) - versions = versions.mix(GATK4SPARK_APPLYBQSR.out.versions) emit: alignment = recal_out // channel: [ meta, file, index ] — BAM or CRAM diff --git a/subworkflows/local/bam_baserecalibrator/main.nf b/subworkflows/local/bam_baserecalibrator/main.nf index cc6f833a2d..e7461f4f96 100644 --- a/subworkflows/local/bam_baserecalibrator/main.nf +++ b/subworkflows/local/bam_baserecalibrator/main.nf @@ -18,7 +18,6 @@ workflow BAM_BASERECALIBRATOR { known_sites_tbi // channel: [optional] [ known_sites_tbi ] main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) @@ -50,12 +49,8 @@ workflow BAM_BASERECALIBRATOR { // Remove no longer necessary field: num_intervals .map{ meta, table -> [ meta - meta.subMap('num_intervals'), table ] } - // Gather versions of all tools used - versions = versions.mix(GATK4_BASERECALIBRATOR.out.versions) - versions = versions.mix(GATK4_GATHERBQSRREPORTS.out.versions) emit: table_bqsr // channel: [ meta, table ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_baserecalibrator_spark/main.nf b/subworkflows/local/bam_baserecalibrator_spark/main.nf index 39ff897bed..0ce20d7ae7 100644 --- a/subworkflows/local/bam_baserecalibrator_spark/main.nf +++ b/subworkflows/local/bam_baserecalibrator_spark/main.nf @@ -18,7 +18,6 @@ workflow BAM_BASERECALIBRATOR_SPARK { known_sites_tbi // channel: [optional] [ known_sites_tbi ] main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) @@ -43,12 +42,8 @@ workflow BAM_BASERECALIBRATOR_SPARK { // Remove no longer necessary field: num_intervals .map{ meta, table -> [ meta - meta.subMap('num_intervals'), table ] } - // Gather versions of all tools used - versions = versions.mix(GATK4SPARK_BASERECALIBRATOR.out.versions) - versions = versions.mix(GATK4_GATHERBQSRREPORTS.out.versions) emit: table_bqsr // channel: [ meta, table ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_joint_calling_germline_gatk/main.nf b/subworkflows/local/bam_joint_calling_germline_gatk/main.nf index a9973ba218..38badedd89 100644 --- a/subworkflows/local/bam_joint_calling_germline_gatk/main.nf +++ b/subworkflows/local/bam_joint_calling_germline_gatk/main.nf @@ -31,7 +31,6 @@ workflow BAM_JOINT_CALLING_GERMLINE_GATK { known_snps_vqsr main: - versions = channel.empty() // Map input for GenomicsDBImport // Rename based on num_intervals, group all samples by their interval_name/interval_file and restructure for channel @@ -147,14 +146,9 @@ workflow BAM_JOINT_CALLING_GERMLINE_GATK { [[id:"joint_variant_calling", patient:"all_samples", variantcaller:"haplotypecaller"], tbi_out] } - versions = versions.mix(GATK4_GENOMICSDBIMPORT.out.versions) - versions = versions.mix(GATK4_GENOTYPEGVCFS.out.versions) - versions = versions.mix(VARIANTRECALIBRATOR_SNP.out.versions) - versions = versions.mix(GATK4_APPLYVQSR_SNP.out.versions) emit: genotype_index // channel: [ val(meta), [ tbi ] ] genotype_vcf // channel: [ val(meta), [ vcf ] ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_markduplicates/main.nf b/subworkflows/local/bam_markduplicates/main.nf index d3fb73f0f7..b1501ee40c 100644 --- a/subworkflows/local/bam_markduplicates/main.nf +++ b/subworkflows/local/bam_markduplicates/main.nf @@ -37,7 +37,6 @@ workflow BAM_MARKDUPLICATES { reports = reports.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.reports) // Gather versions of all tools used - versions = versions.mix(GATK4_MARKDUPLICATES.out.versions) versions = versions.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.versions) emit: diff --git a/subworkflows/local/bam_markduplicates_spark/main.nf b/subworkflows/local/bam_markduplicates_spark/main.nf index 96de5aef24..86a3eaadb8 100644 --- a/subworkflows/local/bam_markduplicates_spark/main.nf +++ b/subworkflows/local/bam_markduplicates_spark/main.nf @@ -42,8 +42,6 @@ workflow BAM_MARKDUPLICATES_SPARK { reports = reports.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.reports) // Gather versions of all tools used - versions = versions.mix(GATK4_ESTIMATELIBRARYCOMPLEXITY.out.versions) - versions = versions.mix(GATK4SPARK_MARKDUPLICATES.out.versions) versions = versions.mix(INDEX_MARKDUPLICATES.out.versions) versions = versions.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.versions) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index d0ff46289a..d09184133a 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -153,7 +153,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_haplotypecaller = BAM_VARIANT_CALLING_HAPLOTYPECALLER.out.vcf tbi_haplotypecaller = BAM_VARIANT_CALLING_HAPLOTYPECALLER.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_HAPLOTYPECALLER.out.versions) if (joint_germline) { BAM_JOINT_CALLING_GERMLINE_GATK( @@ -173,7 +172,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_haplotypecaller = BAM_JOINT_CALLING_GERMLINE_GATK.out.genotype_vcf tbi_haplotypecaller = BAM_JOINT_CALLING_GERMLINE_GATK.out.genotype_index - versions = versions.mix(BAM_JOINT_CALLING_GERMLINE_GATK.out.versions) } else { // If single sample track, check if filtering should be done @@ -191,7 +189,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_haplotypecaller = VCF_VARIANT_FILTERING_GATK.out.filtered_vcf tbi_haplotypecaller = VCF_VARIANT_FILTERING_GATK.out.filtered_tbi - versions = versions.mix(VCF_VARIANT_FILTERING_GATK.out.versions) } } } @@ -337,8 +334,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_sentieon_haplotyper = SENTIEON_HAPLOTYPER_VCF_VARIANT_FILTERING_GATK.out.filtered_vcf tbi_sentieon_haplotyper = SENTIEON_HAPLOTYPER_VCF_VARIANT_FILTERING_GATK.out.filtered_tbi - - versions = versions.mix(SENTIEON_HAPLOTYPER_VCF_VARIANT_FILTERING_GATK.out.versions) } } } diff --git a/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf b/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf index a05ee92e4d..7ffda5a210 100644 --- a/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf +++ b/subworkflows/local/bam_variant_calling_haplotypecaller/main.nf @@ -19,7 +19,6 @@ workflow BAM_VARIANT_CALLING_HAPLOTYPECALLER { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = channel.empty() vcf = channel.empty() realigned_bam = channel.empty() @@ -91,7 +90,6 @@ workflow BAM_VARIANT_CALLING_HAPLOTYPECALLER { realigned_bam = BAM_MERGE_INDEX_SAMTOOLS.out.bam_bai - versions = versions.mix(GATK4_HAPLOTYPECALLER.out.versions) // Remove no longer necessary field: num_intervals vcf = haplotypecaller_vcf.map{ meta, vcf_ -> [ meta - meta.subMap('num_intervals'), vcf_ ] } @@ -103,5 +101,4 @@ workflow BAM_VARIANT_CALLING_HAPLOTYPECALLER { vcf // vcf tbi // tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index e0027be4fc..b856eaac93 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -249,7 +249,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { // vcf_mutect2 and tbi_mutect2 always contain usable output (filtered if available, otherwise unfiltered) vcf_mutect2 = BAM_VARIANT_CALLING_SOMATIC_MUTECT2.out.vcf tbi_mutect2 = BAM_VARIANT_CALLING_SOMATIC_MUTECT2.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_MUTECT2.out.versions) } // TNSCOPE diff --git a/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf b/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf index 8b65207486..f19610ec42 100644 --- a/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_mutect2/main.nf @@ -28,7 +28,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { joint_mutect2 // boolean: [mandatory] [default: false] run mutect2 in joint mode main: - versions = channel.empty() // If no germline resource is provided, then create an empty channel to avoid GetPileupsummaries from being run // Handle channel.value([]) input from prepare_genome by converting to proper empty channel @@ -58,13 +57,13 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { .combine(intervals) .map { meta, cram, crai, intervals_, num_intervals -> [meta + [num_intervals: num_intervals], cram, crai, intervals_] } - MUTECT2_PAIRED(ch_tn_intervals, fasta, fai, dict, germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) + MUTECT2_PAIRED(ch_tn_intervals, fasta, fai.map { meta, index -> [ meta, index, [] ] }, dict, [], [], germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) } else { // Perform variant calling using mutect2 module pair mode // meta: [id:tumor_id_vs_normal_id, normal_id, num_intervals, patient, sex, tumor_id] - MUTECT2_PAIRED(input_intervals, fasta, fai, dict, germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) + MUTECT2_PAIRED(input_intervals, fasta, fai.map { meta, index -> [ meta, index, [] ] }, dict, [], [], germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) } // Figuring out if there is one or more vcf(s) from the same sample @@ -227,15 +226,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { .concat(tbi.map { meta, tbi_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], tbi_] }) .unique { meta, _tbi -> meta } - versions = versions.mix(CALCULATECONTAMINATION.out.versions) - versions = versions.mix(FILTERMUTECTCALLS.out.versions) - versions = versions.mix(GETPILEUPSUMMARIES_NORMAL.out.versions) - versions = versions.mix(GETPILEUPSUMMARIES_TUMOR.out.versions) - versions = versions.mix(GATHERPILEUPSUMMARIES_NORMAL.out.versions) - versions = versions.mix(GATHERPILEUPSUMMARIES_TUMOR.out.versions) - versions = versions.mix(LEARNREADORIENTATIONMODEL.out.versions) - versions = versions.mix(MERGEMUTECTSTATS.out.versions) - versions = versions.mix(MUTECT2_PAIRED.out.versions) emit: vcf = vcf_mutect2 // channel: [ meta, vcf ] - filtered if germline_resource provided, otherwise unfiltered @@ -247,5 +237,4 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MUTECT2 { pileup_table_tumor // channel: [ meta, table_tumor ] contamination_table = calculatecontamination_out_cont // channel: [ meta, contamination ] segmentation_table = calculatecontamination_out_seg // channel: [ meta, segmentation ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index e878d4dff9..91afd8a217 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -154,7 +154,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { // vcf_mutect2 and tbi_mutect2 always contain usable output (filtered if available, otherwise unfiltered) vcf_mutect2 = BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2.out.vcf tbi_mutect2 = BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2.out.versions) } //LOFREQ diff --git a/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf index b895920247..0c25712b97 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_mutect2/main.nf @@ -27,7 +27,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { joint_mutect2 // boolean: [mandatory] [default: false] run mutect2 in joint mode main: - versions = channel.empty() // If no germline resource is provided, then create an empty channel to avoid GetPileupsummaries from being run // Handle channel.value([]) input from prepare_genome by converting to proper empty channel @@ -50,11 +49,11 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { input_joint_intervals = input_joint .combine(intervals) .map { meta, cram, crai, intervals_, num_intervals -> [meta + [num_intervals: num_intervals], cram, crai, intervals_] } - MUTECT2(input_joint_intervals, fasta, fai, dict, germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) + MUTECT2(input_joint_intervals, fasta, fai.map { meta, index -> [ meta, index, [] ] }, dict, [], [], germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) } else { // Perform variant calling using mutect2 module in tumor single mode - MUTECT2(input_intervals, fasta, fai, dict, germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) + MUTECT2(input_intervals, fasta, fai.map { meta, index -> [ meta, index, [] ] }, dict, [], [], germline_resource, germline_resource_tbi, panel_of_normals, panel_of_normals_tbi) } // Figuring out if there is one or more vcf(s) from the same sample @@ -164,13 +163,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { .concat(tbi.map { meta, tbi_ -> [meta - meta.subMap('num_intervals') + [variantcaller: 'mutect2'], tbi_] }) .unique { meta, _tbi -> meta } - versions = versions.mix(CALCULATECONTAMINATION.out.versions) - versions = versions.mix(FILTERMUTECTCALLS.out.versions) - versions = versions.mix(GETPILEUPSUMMARIES.out.versions) - versions = versions.mix(GATHERPILEUPSUMMARIES.out.versions) - versions = versions.mix(LEARNREADORIENTATIONMODEL.out.versions) - versions = versions.mix(MERGEMUTECTSTATS.out.versions) - versions = versions.mix(MUTECT2.out.versions) emit: vcf = vcf_mutect2 // channel: [ meta, vcf ] - filtered if germline_resource provided, otherwise unfiltered @@ -185,5 +177,4 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MUTECT2 { contamination_table = calculatecontamination_out_cont // channel: [ meta, contamination ] segmentation_table = calculatecontamination_out_seg // channel: [ meta, segmentation ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/fastq_preprocess_gatk/main.nf b/subworkflows/local/fastq_preprocess_gatk/main.nf index f1ea54f64e..cbce80043e 100644 --- a/subworkflows/local/fastq_preprocess_gatk/main.nf +++ b/subworkflows/local/fastq_preprocess_gatk/main.nf @@ -404,7 +404,6 @@ workflow FASTQ_PREPROCESS_GATK { ch_table_bqsr_spark = BAM_BASERECALIBRATOR_SPARK.out.table_bqsr // Gather used softwares versions - versions = versions.mix(BAM_BASERECALIBRATOR_SPARK.out.versions) } else { BAM_BASERECALIBRATOR( @@ -419,7 +418,6 @@ workflow FASTQ_PREPROCESS_GATK { ch_table_bqsr_no_spark = BAM_BASERECALIBRATOR.out.table_bqsr // Gather used softwares versions - versions = versions.mix(BAM_BASERECALIBRATOR.out.versions) } // ch_table_bqsr contains either: diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 3aa61c69fc..195355676e 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -93,7 +93,6 @@ workflow PREPARE_GENOME { if (!dict_in && step != "annotate") { GATK4_CREATESEQUENCEDICTIONARY(fasta) dict = GATK4_CREATESEQUENCEDICTIONARY.out.dict.collect() - versions = versions.mix(GATK4_CREATESEQUENCEDICTIONARY.out.versions) } else if (dict_in) { dict = channel.fromPath(dict_in).map { dict_ -> [[id: 'dict'], dict_] }.collect() diff --git a/subworkflows/local/prepare_intervals/main.nf b/subworkflows/local/prepare_intervals/main.nf index f6899250d0..6973896efb 100644 --- a/subworkflows/local/prepare_intervals/main.nf +++ b/subworkflows/local/prepare_intervals/main.nf @@ -61,7 +61,6 @@ workflow PREPARE_INTERVALS { if (intervals.endsWith(".interval_list")) { GATK4_INTERVALLISTTOBED(intervals_combined) intervals_combined = GATK4_INTERVALLISTTOBED.out.bed - versions = versions.mix(GATK4_INTERVALLISTTOBED.out.versions) } } diff --git a/subworkflows/local/vcf_variant_filtering_gatk/main.nf b/subworkflows/local/vcf_variant_filtering_gatk/main.nf index de98177777..769c5791ed 100644 --- a/subworkflows/local/vcf_variant_filtering_gatk/main.nf +++ b/subworkflows/local/vcf_variant_filtering_gatk/main.nf @@ -14,7 +14,6 @@ workflow VCF_VARIANT_FILTERING_GATK { main: - versions = channel.empty() // Don't scatter/gather by intervals, because especially for small regions (targeted or WGS), it easily fails with 0 SNPS in region cnn_in = vcf.combine(intervals_bed_combined).map{ meta, vcf_, tbi, intervals -> [ meta, vcf_, tbi, [], intervals ] } @@ -31,12 +30,9 @@ workflow VCF_VARIANT_FILTERING_GATK { // remove no longer necessary field: num_intervals .map{ meta, tbi -> [ meta - meta.subMap('num_intervals'), tbi ] } - versions = versions.mix(CNNSCOREVARIANTS.out.versions) - versions = versions.mix(FILTERVARIANTTRANCHES.out.versions) emit: filtered_vcf filtered_tbi - versions } diff --git a/tests/aligner-bwa-mem.nf.test.snap b/tests/aligner-bwa-mem.nf.test.snap index e1faa819eb..fb1f52fe06 100644 --- a/tests/aligner-bwa-mem.nf.test.snap +++ b/tests/aligner-bwa-mem.nf.test.snap @@ -17,7 +17,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -96,7 +96,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -147,7 +147,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -217,7 +217,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 diff --git a/tests/aligner-bwa-mem2.nf.test.snap b/tests/aligner-bwa-mem2.nf.test.snap index 5ca9778860..d03b12f392 100644 --- a/tests/aligner-bwa-mem2.nf.test.snap +++ b/tests/aligner-bwa-mem2.nf.test.snap @@ -10,7 +10,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -80,7 +80,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -159,7 +159,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -217,7 +217,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 diff --git a/tests/aligner-dragmap.nf.test.snap b/tests/aligner-dragmap.nf.test.snap index 93920ec70b..b59f4a72f0 100644 --- a/tests/aligner-dragmap.nf.test.snap +++ b/tests/aligner-dragmap.nf.test.snap @@ -10,7 +10,7 @@ "dragmap": "1.2.1" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -86,7 +86,7 @@ "dragmap": "1.2.1" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -168,7 +168,7 @@ "dragmap": "1.2.1" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -223,7 +223,7 @@ "dragmap": "1.2.1" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 diff --git a/tests/aligner-parabricks.nf.test.snap b/tests/aligner-parabricks.nf.test.snap index 5f31c21071..1cd537c5ed 100644 --- a/tests/aligner-parabricks.nf.test.snap +++ b/tests/aligner-parabricks.nf.test.snap @@ -16,7 +16,7 @@ "fastqc": "0.12.1" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -246,7 +246,7 @@ "fastqc": "0.12.1" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -479,7 +479,7 @@ "bwa": "0.7.18-r1243-dirty" }, "CALCULATECONTAMINATION": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -488,28 +488,28 @@ "fastqc": "0.12.1" }, "FILTERMUTECTCALLS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GETPILEUPSUMMARIES_NORMAL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GETPILEUPSUMMARIES_TUMOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2_PAIRED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "PARABRICKS_FQ2BAM": { "parabricks": "4.6.0-1" diff --git a/tests/alignment_from_everything.nf.test.snap b/tests/alignment_from_everything.nf.test.snap index 6ecda81125..a01f7e60cc 100644 --- a/tests/alignment_from_everything.nf.test.snap +++ b/tests/alignment_from_everything.nf.test.snap @@ -26,17 +26,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_MERGE_BAM": { "samtools": 1.21 diff --git a/tests/alignment_to_fastq.nf.test.snap b/tests/alignment_to_fastq.nf.test.snap index aa6286d3c1..605d3e424f 100644 --- a/tests/alignment_to_fastq.nf.test.snap +++ b/tests/alignment_to_fastq.nf.test.snap @@ -26,17 +26,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_MERGE_BAM": { "samtools": 1.21 diff --git a/tests/bbsplit.nf.test.snap b/tests/bbsplit.nf.test.snap index ea7c990001..28b1cfe2b9 100644 --- a/tests/bbsplit.nf.test.snap +++ b/tests/bbsplit.nf.test.snap @@ -26,17 +26,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -390,17 +390,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -617,11 +617,11 @@ "fastqc": "0.12.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "MOSDEPTH": { "mosdepth": "0.3.10" diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 38bfde8a8b..4a3e6a3bf0 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -20,17 +20,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -347,17 +347,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/fastp.nf.test.snap b/tests/fastp.nf.test.snap index 9730d00452..25e72cefa1 100644 --- a/tests/fastp.nf.test.snap +++ b/tests/fastp.nf.test.snap @@ -20,17 +20,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -383,17 +383,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -770,17 +770,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/joint_calling_haplotypecaller.nf.test.snap b/tests/joint_calling_haplotypecaller.nf.test.snap index dd7b6e2735..964d5f4f53 100644 --- a/tests/joint_calling_haplotypecaller.nf.test.snap +++ b/tests/joint_calling_haplotypecaller.nf.test.snap @@ -13,13 +13,13 @@ "gawk": "5.3.0" }, "GATK4_GENOMICSDBIMPORT": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_GENOTYPEGVCFS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_HAPLOTYPECALLER": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_GENOTYPEGVCFS": { "gatk4": "4.6.2.0" @@ -262,13 +262,13 @@ "gawk": "5.3.0" }, "GATK4_GENOMICSDBIMPORT": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_GENOTYPEGVCFS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_HAPLOTYPECALLER": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_GENOTYPEGVCFS": { "gatk4": "4.6.2.0" diff --git a/tests/joint_calling_mutect2.nf.test.snap b/tests/joint_calling_mutect2.nf.test.snap index 6d94c5ade1..794d5c6ed3 100644 --- a/tests/joint_calling_mutect2.nf.test.snap +++ b/tests/joint_calling_mutect2.nf.test.snap @@ -10,16 +10,16 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2_PAIRED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 @@ -244,16 +244,16 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 diff --git a/tests/lane_integer.nf.test.snap b/tests/lane_integer.nf.test.snap index 24300fc952..19bd1a0e5f 100644 --- a/tests/lane_integer.nf.test.snap +++ b/tests/lane_integer.nf.test.snap @@ -17,7 +17,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 diff --git a/tests/multi_lane.nf.test.snap b/tests/multi_lane.nf.test.snap index a9fa67c822..a9541143a4 100644 --- a/tests/multi_lane.nf.test.snap +++ b/tests/multi_lane.nf.test.snap @@ -17,17 +17,17 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -150,7 +150,7 @@ "fgbio": "2.4.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GROUPREADSBYUMI": { "fgbio": "2.4.0" diff --git a/tests/postprocess_concatenation.nf.test.snap b/tests/postprocess_concatenation.nf.test.snap index 7c206ba449..0efeecd74f 100644 --- a/tests/postprocess_concatenation.nf.test.snap +++ b/tests/postprocess_concatenation.nf.test.snap @@ -19,7 +19,7 @@ "freebayes": "1.3.10" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GERMLINE_VCFS_CONCAT": { "bcftools": "1.23.1" diff --git a/tests/postprocess_concatenation_normalization.nf.test.snap b/tests/postprocess_concatenation_normalization.nf.test.snap index d0db0839ff..b37818373b 100644 --- a/tests/postprocess_concatenation_normalization.nf.test.snap +++ b/tests/postprocess_concatenation_normalization.nf.test.snap @@ -22,7 +22,7 @@ "freebayes": "1.3.10" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GERMLINE_VCFS_CONCAT": { "bcftools": "1.23.1" @@ -350,7 +350,7 @@ "freebayes": "1.3.10" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GERMLINE_VCFS_CONCAT": { "bcftools": "1.23.1" diff --git a/tests/postprocess_consensus.nf.test.snap b/tests/postprocess_consensus.nf.test.snap index b6c9b23f00..03d1848ea3 100644 --- a/tests/postprocess_consensus.nf.test.snap +++ b/tests/postprocess_consensus.nf.test.snap @@ -29,16 +29,16 @@ "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2_PAIRED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 @@ -395,10 +395,10 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LOFREQ": { "lofreq": "2.1.5" @@ -407,7 +407,7 @@ "mosdepth": "0.3.10" }, "MUTECT2": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 @@ -702,7 +702,7 @@ "bcftools": "1.23.1" }, "CALCULATECONTAMINATION": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "CONSENSUS_FROM_SITES": { "gawk": "mawk 1.3.4 20240123", @@ -712,25 +712,25 @@ "gawk": "5.3.0" }, "FILTERMUTECTCALLS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GETPILEUPSUMMARIES_NORMAL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GETPILEUPSUMMARIES_TUMOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2_PAIRED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 diff --git a/tests/postprocess_filtering.nf.test.snap b/tests/postprocess_filtering.nf.test.snap index bf295ba961..f31b3554e2 100644 --- a/tests/postprocess_filtering.nf.test.snap +++ b/tests/postprocess_filtering.nf.test.snap @@ -19,7 +19,7 @@ "freebayes": "1.3.10" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" diff --git a/tests/postprocess_normalization.nf.test.snap b/tests/postprocess_normalization.nf.test.snap index 8e019fffdd..2184783e7e 100644 --- a/tests/postprocess_normalization.nf.test.snap +++ b/tests/postprocess_normalization.nf.test.snap @@ -19,7 +19,7 @@ "freebayes": "1.3.10" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" diff --git a/tests/postprocess_varlociraptor.nf.test.snap b/tests/postprocess_varlociraptor.nf.test.snap index 19239f404a..2cbbd34d14 100644 --- a/tests/postprocess_varlociraptor.nf.test.snap +++ b/tests/postprocess_varlociraptor.nf.test.snap @@ -25,7 +25,7 @@ "yte": "1.9.4" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_GERMLINE_SOMATIC_VCFS": { "bcftools": "1.23.1" @@ -330,7 +330,7 @@ "bcftools": "1.23.1" }, "CALCULATECONTAMINATION": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "CONCAT_CALLED_CHUNKS": { "bcftools": "1.23.1" @@ -342,22 +342,22 @@ "yte": "1.9.4" }, "FILTERMUTECTCALLS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATHERPILEUPSUMMARIES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GETPILEUPSUMMARIES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGEMUTECTSTATS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_MUTECT2": { "gatk4": "4.6.2.0" @@ -366,7 +366,7 @@ "mosdepth": "0.3.10" }, "MUTECT2": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "RBT_VCFSPLIT": { "rbt": "0.42.2" @@ -599,7 +599,7 @@ "yte": "1.9.4" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_STRELKA": { "gatk4": "4.6.2.0" diff --git a/tests/save_mapped.nf.test.snap b/tests/save_mapped.nf.test.snap index 6c393f6a66..1c277f5804 100644 --- a/tests/save_mapped.nf.test.snap +++ b/tests/save_mapped.nf.test.snap @@ -17,7 +17,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 diff --git a/tests/save_output_as_bam.nf.test.snap b/tests/save_output_as_bam.nf.test.snap index 27a15e889b..52e6dde2b8 100644 --- a/tests/save_output_as_bam.nf.test.snap +++ b/tests/save_output_as_bam.nf.test.snap @@ -38,17 +38,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -387,7 +387,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -442,7 +442,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SENTIEON_DEDUP": { "sentieon": "202503.02" diff --git a/tests/sentieon.nf.test.snap b/tests/sentieon.nf.test.snap index 583a41a4fb..5d52871cb0 100644 --- a/tests/sentieon.nf.test.snap +++ b/tests/sentieon.nf.test.snap @@ -13,17 +13,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/sentieon_aligner_bwamem.nf.test.snap b/tests/sentieon_aligner_bwamem.nf.test.snap index 04d1f56bde..4e05c5ff0c 100644 --- a/tests/sentieon_aligner_bwamem.nf.test.snap +++ b/tests/sentieon_aligner_bwamem.nf.test.snap @@ -13,7 +13,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -102,7 +102,7 @@ "fgbio": "2.4.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SENTIEON_BWAMEM": { "bwa": "0.7.17-r1188", @@ -173,7 +173,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/sentieon_dedup.nf.test.snap b/tests/sentieon_dedup.nf.test.snap index 657289b852..4f48082aaf 100644 --- a/tests/sentieon_dedup.nf.test.snap +++ b/tests/sentieon_dedup.nf.test.snap @@ -7,13 +7,13 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -199,13 +199,13 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -391,13 +391,13 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -586,13 +586,13 @@ "fgbio": "2.4.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -781,13 +781,13 @@ "fgbio": "2.4.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/spark.nf.test.snap b/tests/spark.nf.test.snap index b8d73e9355..9606f3e91b 100644 --- a/tests/spark.nf.test.snap +++ b/tests/spark.nf.test.snap @@ -17,19 +17,19 @@ "fastqc": "0.12.1" }, "GATK4SPARK_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4SPARK_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4SPARK_MARKDUPLICATES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_ESTIMATELIBRARYCOMPLEXITY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -263,16 +263,16 @@ "gawk": "5.3.0" }, "GATK4SPARK_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4SPARK_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4SPARK_MARKDUPLICATES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/start_from_markduplicates.nf.test.snap b/tests/start_from_markduplicates.nf.test.snap index 3f0c4293dd..dc2ee68e11 100644 --- a/tests/start_from_markduplicates.nf.test.snap +++ b/tests/start_from_markduplicates.nf.test.snap @@ -7,17 +7,17 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -194,17 +194,17 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -381,13 +381,13 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -538,13 +538,13 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/start_from_preparerecalibration.nf.test.snap b/tests/start_from_preparerecalibration.nf.test.snap index c7260b1f8f..45e514d232 100644 --- a/tests/start_from_preparerecalibration.nf.test.snap +++ b/tests/start_from_preparerecalibration.nf.test.snap @@ -7,13 +7,13 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -157,7 +157,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -285,7 +285,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -410,13 +410,13 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/start_from_recalibration.nf.test.snap b/tests/start_from_recalibration.nf.test.snap index 4b02d0f806..aa77cbc709 100644 --- a/tests/start_from_recalibration.nf.test.snap +++ b/tests/start_from_recalibration.nf.test.snap @@ -7,10 +7,10 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 @@ -137,7 +137,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -265,7 +265,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -390,10 +390,10 @@ "gawk": "5.3.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/tumor-normal-pair.nf.test.snap b/tests/tumor-normal-pair.nf.test.snap index 2c5e8d6bba..89c1068628 100644 --- a/tests/tumor-normal-pair.nf.test.snap +++ b/tests/tumor-normal-pair.nf.test.snap @@ -20,17 +20,17 @@ "fastqc": "0.12.1" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/umi_fastp.nf.test.snap b/tests/umi_fastp.nf.test.snap index 42b59f49a1..54e35ad2af 100644 --- a/tests/umi_fastp.nf.test.snap +++ b/tests/umi_fastp.nf.test.snap @@ -23,17 +23,17 @@ "fgbio": "2.4.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/umi_fgbio.nf.test.snap b/tests/umi_fgbio.nf.test.snap index ba01c82fd2..2504ee455e 100644 --- a/tests/umi_fgbio.nf.test.snap +++ b/tests/umi_fgbio.nf.test.snap @@ -55,17 +55,17 @@ "fgbio": "2.4.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "GROUPREADSBYUMI": { "fgbio": "2.4.0" diff --git a/tests/umi_in_read_names.nf.test.snap b/tests/umi_in_read_names.nf.test.snap index dad1469bb4..a61ced6604 100644 --- a/tests/umi_in_read_names.nf.test.snap +++ b/tests/umi_in_read_names.nf.test.snap @@ -13,17 +13,17 @@ "fgbio": "2.4.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -294,17 +294,17 @@ "fgbio": "2.4.0" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index 7a0c71fea2..33a2044c8f 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -53,17 +53,17 @@ "freebayes": "1.3.10" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -694,17 +694,17 @@ "freebayes": "1.3.10" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -1155,7 +1155,7 @@ "samtools": 1.21 }, "CALCULATECONTAMINATION": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "CNVKIT_ANTITARGET": { "cnvkit": "0.9.11" @@ -1176,38 +1176,38 @@ "fastqc": "0.12.1" }, "FILTERMUTECTCALLS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "FREEBAYES": { "freebayes": "1.3.10" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "GETPILEUPSUMMARIES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "INDEX_CRAM": { "samtools": 1.21 }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 diff --git a/tests/variant_calling_deepvariant.nf.test.snap b/tests/variant_calling_deepvariant.nf.test.snap index 916214ce27..8e01a6b047 100644 --- a/tests/variant_calling_deepvariant.nf.test.snap +++ b/tests/variant_calling_deepvariant.nf.test.snap @@ -13,7 +13,7 @@ "deepvariant": "1.10.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -198,7 +198,7 @@ "deepvariant": "1.10.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" diff --git a/tests/variant_calling_freebayes.nf.test.snap b/tests/variant_calling_freebayes.nf.test.snap index 0b09f6ebd9..683a3576c9 100644 --- a/tests/variant_calling_freebayes.nf.test.snap +++ b/tests/variant_calling_freebayes.nf.test.snap @@ -16,7 +16,7 @@ "freebayes": "1.3.10" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_FREEBAYES": { "gatk4": "4.6.2.0" @@ -234,14 +234,14 @@ "freebayes": "1.3.10" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -642,17 +642,17 @@ "freebayes": "1.3.10" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_GATHERBQSRREPORTS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -1008,14 +1008,14 @@ "freebayes": "1.3.10" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 @@ -1349,7 +1349,7 @@ "freebayes": "1.3.10" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -1563,17 +1563,17 @@ "freebayes": "1.3.10" }, "GATK4_APPLYBQSR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_BASERECALIBRATOR": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_GATHERBQSRREPORTS": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_MARKDUPLICATES": { - "gatk4": "4.6.1.0", - "samtools": 1.21 + "gatk4": "4.6.2.0", + "samtools": "1.21" }, "INDEX_CRAM": { "samtools": 1.21 diff --git a/tests/variant_calling_haplotypecaller.nf.test.snap b/tests/variant_calling_haplotypecaller.nf.test.snap index fefcdc20f0..3d2db0137f 100644 --- a/tests/variant_calling_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_haplotypecaller.nf.test.snap @@ -7,7 +7,7 @@ "bcftools": "1.23.1" }, "GATK4_HAPLOTYPECALLER": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -187,7 +187,7 @@ "gawk": "5.3.0" }, "GATK4_HAPLOTYPECALLER": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_HAPLOTYPECALLER": { "gatk4": "4.6.2.0" @@ -377,10 +377,10 @@ "gatk4": "4.5.0.0" }, "FILTERVARIANTTRANCHES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_HAPLOTYPECALLER": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -566,10 +566,10 @@ "gawk": "5.3.0" }, "FILTERVARIANTTRANCHES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_HAPLOTYPECALLER": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_HAPLOTYPECALLER": { "gatk4": "4.6.2.0" diff --git a/tests/variant_calling_lofreq.nf.test.snap b/tests/variant_calling_lofreq.nf.test.snap index 8e641e9b68..57807564f3 100644 --- a/tests/variant_calling_lofreq.nf.test.snap +++ b/tests/variant_calling_lofreq.nf.test.snap @@ -10,7 +10,7 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LOFREQ": { "lofreq": "2.1.5" @@ -192,7 +192,7 @@ "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LOFREQ": { "lofreq": "2.1.5" diff --git a/tests/variant_calling_msisensor2.nf.test.snap b/tests/variant_calling_msisensor2.nf.test.snap index 6ef7a54f47..19d0e935d5 100644 --- a/tests/variant_calling_msisensor2.nf.test.snap +++ b/tests/variant_calling_msisensor2.nf.test.snap @@ -4,7 +4,7 @@ 4, { "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -97,7 +97,7 @@ 4, { "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -164,7 +164,7 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" diff --git a/tests/variant_calling_msisensorpro.nf.test.snap b/tests/variant_calling_msisensorpro.nf.test.snap index bb7a07206e..82da407438 100644 --- a/tests/variant_calling_msisensorpro.nf.test.snap +++ b/tests/variant_calling_msisensorpro.nf.test.snap @@ -4,7 +4,7 @@ 4, { "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MSISENSORPRO_SCAN": { "msisensor-pro": "1.3.0" @@ -53,7 +53,7 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -199,7 +199,7 @@ 4, { "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MSISENSORPRO_SCAN": { "msisensor-pro": "1.3.0" diff --git a/tests/variant_calling_muse.nf.test.snap b/tests/variant_calling_muse.nf.test.snap index 978156f8df..7bb29f3633 100644 --- a/tests/variant_calling_muse.nf.test.snap +++ b/tests/variant_calling_muse.nf.test.snap @@ -13,7 +13,7 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -187,7 +187,7 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" diff --git a/tests/variant_calling_mutect2.nf.test.snap b/tests/variant_calling_mutect2.nf.test.snap index 1046b8b134..57a9c11a95 100644 --- a/tests/variant_calling_mutect2.nf.test.snap +++ b/tests/variant_calling_mutect2.nf.test.snap @@ -7,16 +7,16 @@ "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 @@ -197,16 +197,16 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2_PAIRED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 @@ -408,16 +408,16 @@ "bcftools": "1.23.1" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2_PAIRED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 @@ -612,16 +612,16 @@ "gawk": "5.3.0" }, "GATK4_CREATESEQUENCEDICTIONARY": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "LEARNREADORIENTATIONMODEL": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "MUTECT2": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { "samtools": 1.21 diff --git a/tests/variant_calling_sentieon_dnascope.nf.test.snap b/tests/variant_calling_sentieon_dnascope.nf.test.snap index 4b4aa56f68..4de48c9aaa 100644 --- a/tests/variant_calling_sentieon_dnascope.nf.test.snap +++ b/tests/variant_calling_sentieon_dnascope.nf.test.snap @@ -10,7 +10,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -196,7 +196,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -391,7 +391,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_GENOTYPEGVCFS": { "gatk4": "4.6.2.0" diff --git a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap index 972acd6171..9375b5cee3 100644 --- a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap @@ -13,7 +13,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MERGE_GENOTYPEGVCFS": { "gatk4": "4.6.2.0" @@ -226,7 +226,7 @@ "gatk4": "4.5.0.0" }, "FILTERVARIANTTRANCHES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -414,7 +414,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" @@ -603,10 +603,10 @@ "gawk": "5.3.0" }, "FILTERVARIANTTRANCHES": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "MOSDEPTH": { "mosdepth": "0.3.10" diff --git a/tests/variant_calling_sentieon_tnscope.nf.test.snap b/tests/variant_calling_sentieon_tnscope.nf.test.snap index 2c01eab0c2..7278a9d721 100644 --- a/tests/variant_calling_sentieon_tnscope.nf.test.snap +++ b/tests/variant_calling_sentieon_tnscope.nf.test.snap @@ -10,7 +10,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SENTIEON_BWAMEM": { "bwa": "0.7.17-r1188", @@ -97,7 +97,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SENTIEON_BWAMEM": { "bwa": "0.7.17-r1188", @@ -298,7 +298,7 @@ "gawk": "5.3.0" }, "GATK4_INTERVALLISTTOBED": { - "gatk4": "4.6.1.0" + "gatk4": "4.6.2.0" }, "SENTIEON_BWAMEM": { "bwa": "0.7.17-r1188", From e952f4ef56d2a9085989571f8a70b16b73527262 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Wed, 22 Jul 2026 21:03:36 +0200 Subject: [PATCH 15/27] chore(modules): migrate alignment/UMI/utility modules to versions topic channel (#2239) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates alignment, UMI and utility modules to the `versions` topic channel. **Stacked on #2238** (base: `topic/gatk`). ### Changes - Updates `bwa`, `bwamem2`, `dragmap`, `fgbio`, `fastp`, `cat`, `gawk`, `gunzip`, `untar`, `unzip`, `tabix`, `spring` to their topic-channel versions. - Removes the corresponding `.out.versions` wiring from subworkflows. - Fixes the `FASTP` call site for the new input signature (adapter fasta folded into the reads tuple). - Tool bumps ride along (see changelog) — notably **fastp 0.24.0 → 1.1.0** (major) and **fgbio 2.4.0 → 3.1.2**. Test snapshots need regenerating in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 7 + docs/output.md | 4 +- modules.json | 36 +++--- modules/nf-core/bwa/index/environment.yml | 6 +- modules/nf-core/bwa/index/main.nf | 23 +--- modules/nf-core/bwa/index/meta.yml | 27 +++- modules/nf-core/bwa/mem/environment.yml | 6 +- modules/nf-core/bwa/mem/main.nf | 33 +++-- modules/nf-core/bwa/mem/meta.yml | 112 +++++++++++----- modules/nf-core/bwamem2/index/environment.yml | 6 +- modules/nf-core/bwamem2/index/main.nf | 20 +-- modules/nf-core/bwamem2/index/meta.yml | 49 +++++-- modules/nf-core/bwamem2/mem/environment.yml | 6 +- modules/nf-core/bwamem2/mem/main.nf | 63 ++++----- modules/nf-core/bwamem2/mem/meta.yml | 105 ++++++++++----- modules/nf-core/cat/cat/environment.yml | 2 +- modules/nf-core/cat/cat/main.nf | 76 ++++------- modules/nf-core/cat/cat/meta.yml | 43 ++++-- modules/nf-core/cat/fastq/main.nf | 35 ++--- modules/nf-core/cat/fastq/meta.yml | 38 ++++-- modules/nf-core/dragmap/align/main.nf | 24 +--- modules/nf-core/dragmap/align/meta.yml | 119 +++++++++++++---- modules/nf-core/dragmap/hashtable/main.nf | 16 +-- modules/nf-core/dragmap/hashtable/meta.yml | 38 ++++-- modules/nf-core/fastp/environment.yml | 3 +- modules/nf-core/fastp/main.nf | 55 +++----- modules/nf-core/fastp/meta.yml | 90 ++++++++----- .../environment.yml | 2 +- .../fgbio/callmolecularconsensusreads/main.nf | 38 +++--- .../callmolecularconsensusreads/meta.yml | 51 +++++--- .../fgbio/copyumifromreadname/environment.yml | 2 +- .../nf-core/fgbio/copyumifromreadname/main.nf | 31 ++--- .../fgbio/copyumifromreadname/meta.yml | 35 +++-- .../nf-core/fgbio/fastqtobam/environment.yml | 2 +- modules/nf-core/fgbio/fastqtobam/main.nf | 33 ++--- modules/nf-core/fgbio/fastqtobam/meta.yml | 54 ++++---- .../fgbio/groupreadsbyumi/environment.yml | 2 +- modules/nf-core/fgbio/groupreadsbyumi/main.nf | 51 ++++---- .../nf-core/fgbio/groupreadsbyumi/meta.yml | 59 +++++++-- modules/nf-core/gawk/environment.yml | 2 +- modules/nf-core/gawk/main.nf | 32 ++--- modules/nf-core/gawk/meta.yml | 69 ++++++---- modules/nf-core/gunzip/main.nf | 24 ++-- modules/nf-core/gunzip/meta.yml | 35 ++++- modules/nf-core/spring/decompress/main.nf | 22 +--- modules/nf-core/spring/decompress/meta.yml | 42 ++++-- modules/nf-core/untar/main.nf | 13 +- modules/nf-core/untar/meta.yml | 36 ++++-- modules/nf-core/unzip/main.nf | 17 +-- modules/nf-core/unzip/meta.yml | 35 +++-- .../local/bam_convert_samtools/main.nf | 1 - .../local/bam_variant_calling_mpileup/main.nf | 1 - subworkflows/local/fastq_align/main.nf | 6 - .../fastq_create_umi_consensus_fgbio/main.nf | 4 - .../local/fastq_preprocess_gatk/main.nf | 8 +- subworkflows/local/prepare_genome/main.nf | 10 -- subworkflows/local/prepare_intervals/main.nf | 1 - tests/aligner-bwa-mem.nf.test.snap | 16 +-- tests/aligner-bwa-mem2.nf.test.snap | 4 +- tests/aligner-parabricks.nf.test.snap | 8 +- tests/alignment_from_everything.nf.test.snap | 8 +- tests/alignment_to_fastq.nf.test.snap | 8 +- tests/bbsplit.nf.test.snap | 20 +-- tests/default.nf.test.snap | 12 +- tests/fastp.nf.test.snap | 122 +++++++++--------- tests/intervals.nf.test.snap | 40 +++--- tests/joint_calling_mutect2.nf.test.snap | 2 +- tests/lane_integer.nf.test.snap | 6 +- tests/multi_lane.nf.test.snap | 30 +++-- tests/save_mapped.nf.test.snap | 6 +- tests/save_output_as_bam.nf.test.snap | 12 +- tests/sentieon.nf.test.snap | 2 +- tests/sentieon_aligner_bwamem.nf.test.snap | 12 +- tests/sentieon_dedup.nf.test.snap | 4 +- tests/spark.nf.test.snap | 12 +- tests/tumor-normal-pair.nf.test.snap | 6 +- tests/umi_fastp.nf.test.snap | 14 +- tests/umi_fgbio.nf.test.snap | 58 +++++---- tests/umi_in_read_names.nf.test.snap | 12 +- tests/variant_calling_all.nf.test.snap | 18 +-- .../variant_calling_controlfreec.nf.test.snap | 8 +- tests/variant_calling_freebayes.nf.test.snap | 24 ++-- tests/variant_calling_msisensor2.nf.test.snap | 6 +- tests/variant_calling_mutect2.nf.test.snap | 2 +- ...iant_calling_sentieon_tnscope.nf.test.snap | 8 +- workflows/sarek.nf | 3 - 86 files changed, 1245 insertions(+), 998 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6ccbf673a..12fcf16783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2235](https://github.com/nf-core/sarek/pull/2235) - Nextflow strict-syntax / 26.x readiness for local code: explicit, named closure parameters (replacing implicit/generic `it`), `_`-prefixed unused parameters, and removal of unused `take:` inputs. Previously-dropped Manta candidate VCFs and Sentieon gVCF indices are now emitted. - [#2235](https://github.com/nf-core/sarek/pull/2235) - germline CNVKIT reuses the shared `CRAM_TO_BAM` conversion instead of re-converting CRAM internally, avoiding a duplicate conversion. Side effect: with `--step variant_calling` (user-supplied CRAM/BAM), CNVKit output files are named after the input file rather than the sample; runs from FASTQ are unaffected. - [#2238](https://github.com/nf-core/sarek/pull/2238) - Migrate `gatk4`/`gatk4spark` modules to the versions topic channel (bumps gatk4spark 4.6.1.0 → 4.6.2.0) +- [#2239](https://github.com/nf-core/sarek/pull/2239) - Migrate alignment/UMI/utility modules (`bwa`, `bwamem2`, `dragmap`, `fgbio`, `fastp`, `cat`, `gawk`, `gunzip`, `untar`, `unzip`, `spring`) to the versions topic channel (fastp 0.24.0 → 1.1.0) ### Fixed @@ -37,6 +38,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | ensembl-vep | 115.2 | 116.0 | | gatk4 | 4.6.1.0 | 4.6.2.0 | | gatk4-spark | 4.6.1.0 | 4.6.2.0 | +| bwa | 0.7.18 | 0.7.19 | +| bwa-mem2 | 2.2.1 | 2.3 | +| fastp | 0.24.0 | 1.1.0 | +| fgbio | 2.4.0 | 3.1.2 | +| gawk | 5.3.0 | 5.3.1 | +| pigz | 2.3.4 | 2.8 | ### Dependencies - plugins diff --git a/docs/output.md b/docs/output.md index 613966cb85..044090836c 100644 --- a/docs/output.md +++ b/docs/output.md @@ -135,7 +135,7 @@ The resulting files are intermediate and by default not kept in the final files **Output directory: `{outdir}/preprocessing/fastp/`** -- `__{1,2}.fastp.fastq.gz>` +- `__{R1,R2}.fastp.fastq.gz>` - Bgzipped FastQ file
@@ -151,7 +151,7 @@ These files are intermediate and by default not placed in the output-folder kept **Output directory: `{outdir}/preprocessing/fastp//`** -- `` +- `__{R1,R2}.fastp.fastq.gz>` - Bgzipped FastQ file diff --git a/modules.json b/modules.json index 6ffabb8f5a..d7a3851c68 100644 --- a/modules.json +++ b/modules.json @@ -62,32 +62,32 @@ }, "bwa/index": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "bwa/mem": { "branch": "master", - "git_sha": "a29f18660f5e3748d44d6f716241e70c942c065d", + "git_sha": "2fb127c8fd13de0adaa676df7169131e45c0b114", "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", - "git_sha": "b2902040b9cb9b7b32b62400f1c024a709bd4812", + "git_sha": "62ce917fd775aaef732eb82019de069c765adfd3", "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", - "git_sha": "a29f18660f5e3748d44d6f716241e70c942c065d", + "git_sha": "62ce917fd775aaef732eb82019de069c765adfd3", "installed_by": ["modules"] }, "cat/cat": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "eac429d4c67ac5114ce7d4287d460d8f05fd9fab", "installed_by": ["modules"] }, "cat/fastq": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "cnvkit/antitarget": { @@ -153,12 +153,12 @@ }, "dragmap/align": { "branch": "master", - "git_sha": "8b06d86f6a82b6203f239ad409f606fdf71ec697", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "dragmap/hashtable": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "ensemblvep/download": { @@ -173,7 +173,7 @@ }, "fastp": { "branch": "master", - "git_sha": "d082103d7976a2804f21225446cc110cbd822f4c", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "fastqc": { @@ -183,22 +183,22 @@ }, "fgbio/callmolecularconsensusreads": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "fgbio/copyumifromreadname": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "fgbio/fastqtobam": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "fgbio/groupreadsbyumi": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "freebayes": { @@ -333,7 +333,7 @@ }, "gawk": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "goleft/indexcov": { @@ -343,7 +343,7 @@ }, "gunzip": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "0902eac3012baaf4f9ab6513c8c55acc9353c96c", "installed_by": ["modules"] }, "lofreq/callparallel": { @@ -528,7 +528,7 @@ }, "spring/decompress": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "strelka/germline": { @@ -563,12 +563,12 @@ }, "untar": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "unzip": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "1c43a7e22f04cf19c9f9d3de7e7e5a3addd9382a", "installed_by": ["modules"] }, "varlociraptor/callvariants": { diff --git a/modules/nf-core/bwa/index/environment.yml b/modules/nf-core/bwa/index/environment.yml index ed5448a197..54e679492f 100644 --- a/modules/nf-core/bwa/index/environment.yml +++ b/modules/nf-core/bwa/index/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa - - bioconda::bwa=0.7.18 + - bioconda::bwa=0.7.19 # renovate: datasource=conda depName=bioconda/htslib - - bioconda::htslib=1.21 + - bioconda::htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - bioconda::samtools=1.21 + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/bwa/index/main.nf b/modules/nf-core/bwa/index/main.nf index 72e078aac2..a1c98acee6 100644 --- a/modules/nf-core/bwa/index/main.nf +++ b/modules/nf-core/bwa/index/main.nf @@ -2,19 +2,19 @@ process BWA_INDEX { tag "$fasta" // NOTE requires 5.37N memory where N is the size of the database // source: https://bio-bwa.sourceforge.net/bwa.shtml#8 - memory { 6.B * fasta.size() } + memory { 7.B * fasta.size() } 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/bf/bf7890f8d4e38a7586581cb7fa13401b7af1582f21d94eef969df4cea852b6da/data' : - 'community.wave.seqera.io/library/bwa_htslib_samtools:56c9f8d5201889a4' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/d7/d7e24dc1e4d93ca4d3a76a78d4c834a7be3985b0e1e56fddd61662e047863a8a/data' : + 'community.wave.seqera.io/library/bwa_htslib_samtools:83b50ff84ead50d0' }" input: tuple val(meta), path(fasta) output: - tuple val(meta), path("bwa") , emit: index - path "versions.yml" , emit: versions + tuple val(meta), path("bwa"), emit: index + tuple val("${task.process}"), val('bwa'), eval('bwa 2>&1 | sed -n "s/^Version: //p"'), topic: versions, emit: versions_bwa when: task.ext.when == null || task.ext.when @@ -29,27 +29,16 @@ process BWA_INDEX { $args \\ -p bwa/${prefix} \\ $fasta - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${fasta.baseName}" """ mkdir bwa - touch bwa/${prefix}.amb touch bwa/${prefix}.ann touch bwa/${prefix}.bwt touch bwa/${prefix}.pac touch bwa/${prefix}.sa - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bwa/index/meta.yml b/modules/nf-core/bwa/index/meta.yml index 1781586fa1..f5bf7f52a9 100644 --- a/modules/nf-core/bwa/index/meta.yml +++ b/modules/nf-core/bwa/index/meta.yml @@ -42,17 +42,30 @@ output: pattern: "*.{amb,ann,bwt,pac,sa}" ontologies: - edam: "http://edamontology.org/data_3210" # Genome index + versions_bwa: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bwa: + type: string + description: The tool name + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + 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 + - bwa: + type: string + description: The tool name + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + type: string + description: The command used to generate the version of the tool authors: - "@drpatelh" - "@maxulysse" maintainers: - - "@drpatelh" - "@maxulysse" - "@gallvp" diff --git a/modules/nf-core/bwa/mem/environment.yml b/modules/nf-core/bwa/mem/environment.yml index ed5448a197..54e679492f 100644 --- a/modules/nf-core/bwa/mem/environment.yml +++ b/modules/nf-core/bwa/mem/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa - - bioconda::bwa=0.7.18 + - bioconda::bwa=0.7.19 # renovate: datasource=conda depName=bioconda/htslib - - bioconda::htslib=1.21 + - bioconda::htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - bioconda::samtools=1.21 + - bioconda::samtools=1.22.1 diff --git a/modules/nf-core/bwa/mem/main.nf b/modules/nf-core/bwa/mem/main.nf index 3c54417824..bde6a9a334 100644 --- a/modules/nf-core/bwa/mem/main.nf +++ b/modules/nf-core/bwa/mem/main.nf @@ -3,9 +3,9 @@ process BWA_MEM { label 'process_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/bf/bf7890f8d4e38a7586581cb7fa13401b7af1582f21d94eef969df4cea852b6da/data' : - 'community.wave.seqera.io/library/bwa_htslib_samtools:56c9f8d5201889a4' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/d7/d7e24dc1e4d93ca4d3a76a78d4c834a7be3985b0e1e56fddd61662e047863a8a/data' : + 'community.wave.seqera.io/library/bwa_htslib_samtools:83b50ff84ead50d0' }" input: tuple val(meta) , path(reads) @@ -16,9 +16,11 @@ process BWA_MEM { output: tuple val(meta), path("*.bam") , emit: bam, optional: true tuple val(meta), path("*.cram") , emit: cram, optional: true + tuple val(meta), path("*.sam") , emit: sam, optional: true tuple val(meta), path("*.csi") , emit: csi, optional: true tuple val(meta), path("*.crai") , emit: crai, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bwa'), eval('bwa 2>&1 | sed -n "s/^Version: //p"'), topic: versions, emit: versions_bwa + 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 @@ -35,6 +37,15 @@ process BWA_MEM { "bam" def reference = fasta && extension=="cram" ? "--reference ${fasta}" : "" if (!fasta && extension=="cram") error "Fasta reference is required for CRAM output" + // + // For SAM output we can skip samtools view + // + def pipe_command = "" + if (extension == "sam") { + pipe_command = "> ${prefix}.${extension}" + } else { + pipe_command = "| samtools $samtools_command $args2 ${reference} --threads $task.cpus -o ${prefix}.${extension} -" + } """ INDEX=`find -L ./ -name "*.amb" | sed 's/\\.amb\$//'` @@ -43,13 +54,7 @@ process BWA_MEM { -t $task.cpus \\ \$INDEX \\ $reads \\ - | samtools $samtools_command $args2 ${reference} --threads $task.cpus -o ${prefix}.${extension} - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + $pipe_command """ stub: @@ -64,11 +69,5 @@ process BWA_MEM { touch ${prefix}.${extension} touch ${prefix}.csi touch ${prefix}.crai - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwa: \$(echo \$(bwa 2>&1) | sed 's/^.*Version: //; s/Contact:.*\$//') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bwa/mem/meta.yml b/modules/nf-core/bwa/mem/meta.yml index b6f696c03b..1c4ee8833e 100644 --- a/modules/nf-core/bwa/mem/meta.yml +++ b/modules/nf-core/bwa/mem/meta.yml @@ -16,7 +16,8 @@ tools: homepage: http://bio-bwa.sourceforge.net/ documentation: https://bio-bwa.sourceforge.net/bwa.shtml arxiv: arXiv:1303.3997 - licence: ["GPL-3.0-or-later"] + licence: + - "GPL-3.0-or-later" identifier: "biotools:bwa" input: - - meta: @@ -30,8 +31,8 @@ input: List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. ontologies: - - edam: "http://edamontology.org/data_2044" # Sequence - - edam: "http://edamontology.org/format_1930" # FASTQ + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1930" - - meta2: type: map description: | @@ -42,7 +43,7 @@ input: description: BWA genome index files pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" ontologies: - - edam: "http://edamontology.org/data_3210" # Genome index + - edam: "http://edamontology.org/data_3210" - - meta3: type: map description: | @@ -53,54 +54,101 @@ input: description: Reference genome in FASTA format pattern: "*.{fasta,fa}" ontologies: - - edam: "http://edamontology.org/data_2044" # Sequence - - edam: "http://edamontology.org/format_1929" # FASTA - - - sort_bam: - type: boolean - description: use samtools sort (true) or samtools view (false) - pattern: "true or false" + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1929" + - sort_bam: + type: boolean + description: use samtools sort (true) or samtools view (false) + pattern: "true or false" output: - - bam: - - meta: - type: file - description: Output BAM file containing read alignments + bam: + - - meta: + type: map + description: Groovy Map containing sample information - "*.bam": type: file description: Output BAM file containing read alignments pattern: "*.{bam}" ontologies: - - edam: "http://edamontology.org/format_2572" # BAM - - cram: - - meta: - type: file - description: Output CRAM file containing read alignments + - edam: "http://edamontology.org/format_2572" + cram: + - - meta: + type: map + description: Groovy Map containing sample information - "*.cram": type: file description: Output CRAM file containing read alignments pattern: "*.{cram}" ontologies: - - edam: "http://edamontology.org/format_3462" # CRAM - - csi: - - meta: + - edam: "http://edamontology.org/format_3462" + sam: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.sam": type: file - description: Optional index file for BAM file + description: Output SAM file containing read alignments + pattern: "*.{sam}" + ontologies: + - edam: "http://edamontology.org/format_2573" + csi: + - - meta: + type: map + description: Groovy Map containing sample information - "*.csi": type: file description: Optional index file for BAM file pattern: "*.{csi}" - - crai: - - meta: - type: file - description: Optional index file for CRAM file + ontologies: [] + crai: + - - meta: + type: map + description: Groovy Map containing sample information - "*.crai": type: file description: Optional index file for CRAM file pattern: "*.{crai}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_bwa: + - - ${task.process}: + type: string + description: The name of the process + - bwa: + type: string + description: The name of the tool + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + type: eval + description: The expression to obtain the version of the tool + 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: + - - ${task.process}: + type: string + description: The name of the process + - bwa: + type: string + description: The name of the tool + - 'bwa 2>&1 | sed -n "s/^Version: //p"': + type: eval + description: The expression to obtain the version of the tool + - - ${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" - "@jeremy1805" diff --git a/modules/nf-core/bwamem2/index/environment.yml b/modules/nf-core/bwamem2/index/environment.yml index c069e281ac..f3637444a6 100644 --- a/modules/nf-core/bwamem2/index/environment.yml +++ b/modules/nf-core/bwamem2/index/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa-mem2 - - bwa-mem2=2.2.1 + - bwa-mem2=2.3 # renovate: datasource=conda depName=bioconda/htslib - - htslib=1.21 + - htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - samtools=1.21 + - samtools=1.22.1 diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf index 529c66e8fd..4d1461e637 100644 --- a/modules/nf-core/bwamem2/index/main.nf +++ b/modules/nf-core/bwamem2/index/main.nf @@ -2,19 +2,19 @@ process BWAMEM2_INDEX { tag "$fasta" // NOTE Requires 28N GB memory where N is the size of the reference sequence, floor of 280M // source: https://github.com/bwa-mem2/bwa-mem2/issues/9 - memory { (280.MB * Math.ceil(fasta.size() / 10000000)) * task.attempt } + memory { 280.MB * Math.ceil(fasta.size() / 10000000) * task.attempt } 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/9a/9ac054213e67b3c9308e409b459080bbe438f8fd6c646c351bc42887f35a42e7/data' : - 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:e1f420694f8e42bd' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e0/e05ce34b46ad42810eb29f74e4e304c0cb592b2ca15572929ed8bbaee58faf01/data' : + 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:db98f81f55b64113' }" input: tuple val(meta), path(fasta) output: tuple val(meta), path("bwamem2"), emit: index - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bwamem2'), eval('bwa-mem2 version | grep -o -E "[0-9]+(\\.[0-9]+)+"'), emit: versions_bwamem2, topic: versions when: task.ext.when == null || task.ext.when @@ -29,11 +29,6 @@ process BWAMEM2_INDEX { $args \\ -p bwamem2/${prefix} \\ $fasta - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') - END_VERSIONS """ stub: @@ -46,10 +41,5 @@ process BWAMEM2_INDEX { touch bwamem2/${prefix}.pac touch bwamem2/${prefix}.amb touch bwamem2/${prefix}.bwt.2bit.64 - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') - END_VERSIONS """ } diff --git a/modules/nf-core/bwamem2/index/meta.yml b/modules/nf-core/bwamem2/index/meta.yml index b2aa45fb65..336ab20243 100644 --- a/modules/nf-core/bwamem2/index/meta.yml +++ b/modules/nf-core/bwamem2/index/meta.yml @@ -12,7 +12,14 @@ tools: a large reference genome, such as the human genome. homepage: https://github.com/bwa-mem2/bwa-mem2 documentation: https://github.com/bwa-mem2/bwa-mem2#usage - licence: ["MIT"] + doi: "10.1109/IPDPS.2019.00041" + publication: + author: "Vasimuddin M., Misra S., Li H. & Aluru S." + year: 2018 + source: "IEEE International Parallel and Distributed Processing Symposium (IPDPS)" + title: "Efficient Architecture-Aware Acceleration of BWA-MEM for Multicore Systems" + licence: + - "MIT" identifier: "biotools:bwa-mem2" input: - - meta: @@ -24,8 +31,8 @@ input: type: file description: Input genome fasta file ontologies: - - edam: "http://edamontology.org/data_2044" # Sequence - - edam: "http://edamontology.org/format_1929" # FASTA + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1929" output: index: - - meta: @@ -34,18 +41,38 @@ output: Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - bwamem2: - type: file + type: string description: BWA genome index files pattern: "*.{0123,amb,ann,bwt.2bit.64,pac}" ontologies: - - edam: "http://edamontology.org/data_3210" # Genome index + - edam: "http://edamontology.org/data_3210" + versions_bwamem2: + - - ${task.process}: + type: string + description: The name of the process + - bwamem2: + type: string + description: BWA genome index files + pattern: "*.{0123,amb,ann,bwt.2bit.64,pac}" + ontologies: + - edam: "http://edamontology.org/data_3210" + - bwa-mem2 version | grep -o -E "[0-9]+(\.[0-9]+)+": + 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 + - bwamem2: + type: string + description: BWA genome index files + pattern: "*.{0123,amb,ann,bwt.2bit.64,pac}" + ontologies: + - edam: "http://edamontology.org/data_3210" + - bwa-mem2 version | grep -o -E "[0-9]+(\.[0-9]+)+": + type: eval + description: The expression to obtain the version of the tool authors: - "@maxulysse" maintainers: diff --git a/modules/nf-core/bwamem2/mem/environment.yml b/modules/nf-core/bwamem2/mem/environment.yml index c069e281ac..f3637444a6 100644 --- a/modules/nf-core/bwamem2/mem/environment.yml +++ b/modules/nf-core/bwamem2/mem/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa-mem2 - - bwa-mem2=2.2.1 + - bwa-mem2=2.3 # renovate: datasource=conda depName=bioconda/htslib - - htslib=1.21 + - htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - samtools=1.21 + - samtools=1.22.1 diff --git a/modules/nf-core/bwamem2/mem/main.nf b/modules/nf-core/bwamem2/mem/main.nf index eab662a87a..9d827dc84e 100644 --- a/modules/nf-core/bwamem2/mem/main.nf +++ b/modules/nf-core/bwamem2/mem/main.nf @@ -1,25 +1,26 @@ process BWAMEM2_MEM { - tag "$meta.id" + tag "${meta.id}" label 'process_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/9a/9ac054213e67b3c9308e409b459080bbe438f8fd6c646c351bc42887f35a42e7/data' : - 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:e1f420694f8e42bd' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e0/e05ce34b46ad42810eb29f74e4e304c0cb592b2ca15572929ed8bbaee58faf01/data' + : 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:db98f81f55b64113'}" input: tuple val(meta), path(reads) tuple val(meta2), path(index) tuple val(meta3), path(fasta) - val sort_bam + val sort_bam output: - tuple val(meta), path("*.sam") , emit: sam , optional:true - tuple val(meta), path("*.bam") , emit: bam , optional:true - tuple val(meta), path("*.cram") , emit: cram, optional:true - tuple val(meta), path("*.crai") , emit: crai, optional:true - tuple val(meta), path("*.csi") , emit: csi , optional:true - path "versions.yml" , emit: versions + tuple val(meta), path("*.sam"), emit: sam, optional: true + tuple val(meta), path("*.bam"), emit: bam, optional: true + tuple val(meta), path("*.cram"), emit: cram, optional: true + tuple val(meta), path("*.crai"), emit: crai, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bwamem2'), eval('bwa-mem2 version | grep -o -E "[0-9]+(\\.[0-9]+)+"'), emit: versions_bwamem2, topic: 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 @@ -31,53 +32,43 @@ process BWAMEM2_MEM { def samtools_command = sort_bam ? 'sort' : 'view' def extension_pattern = /(--output-fmt|-O)+\s+(\S+)/ - def extension_matcher = (args2 =~ extension_pattern) + def extension_matcher = (args2 =~ extension_pattern) def extension = extension_matcher.getCount() > 0 ? extension_matcher[0][2].toLowerCase() : "bam" - def reference = fasta && extension=="cram" ? "--reference ${fasta}" : "" - if (!fasta && extension=="cram") error "Fasta reference is required for CRAM output" - + def reference = fasta && extension == "cram" ? "--reference ${fasta}" : "" + if (!fasta && extension == "cram") { + error("Fasta reference is required for CRAM output") + } """ INDEX=`find -L ./ -name "*.amb" | sed 's/\\.amb\$//'` bwa-mem2 \\ mem \\ - $args \\ - -t $task.cpus \\ + ${args} \\ + -t ${task.cpus} \\ \$INDEX \\ - $reads \\ - | samtools $samtools_command $args2 -@ $task.cpus ${reference} -o ${prefix}.${extension} - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${reads} \\ + | samtools ${samtools_command} ${args2} -@ ${task.cpus} ${reference} -o ${prefix}.${extension} - """ stub: - def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def extension_pattern = /(--output-fmt|-O)+\s+(\S+)/ - def extension_matcher = (args2 =~ extension_pattern) + def extension_matcher = (args2 =~ extension_pattern) def extension = extension_matcher.getCount() > 0 ? extension_matcher[0][2].toLowerCase() : "bam" - if (!fasta && extension=="cram") error "Fasta reference is required for CRAM output" + if (!fasta && extension == "cram") { + error("Fasta reference is required for CRAM output") + } def create_index = "" if (extension == "cram") { create_index = "touch ${prefix}.crai" - } else if (extension == "bam") { + } + else if (extension == "bam") { create_index = "touch ${prefix}.csi" } - """ touch ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bwamem2: \$(echo \$(bwa-mem2 version 2>&1) | sed 's/.* //') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bwamem2/mem/meta.yml b/modules/nf-core/bwamem2/mem/meta.yml index d17e0dbd3a..967c8de04c 100644 --- a/modules/nf-core/bwamem2/mem/meta.yml +++ b/modules/nf-core/bwamem2/mem/meta.yml @@ -9,14 +9,20 @@ keywords: - bam - sam tools: - - bwa: + - bwamem2: description: | BWA-mem2 is a software package for mapping DNA sequences against a large reference genome, such as the human genome. homepage: https://github.com/bwa-mem2/bwa-mem2 - documentation: http://www.htslib.org/doc/samtools.html - arxiv: arXiv:1303.3997 - licence: ["MIT"] + documentation: https://github.com/bwa-mem2/bwa-mem2#usage + doi: "10.1109/IPDPS.2019.00041" + publication: + author: "Vasimuddin M., Misra S., Li H. & Aluru S." + year: 2018 + source: "IEEE International Parallel and Distributed Processing Symposium (IPDPS)" + title: "Efficient Architecture-Aware Acceleration of BWA-MEM for Multicore Systems" + licence: + - "MIT" identifier: "biotools:bwa-mem2" input: - - meta: @@ -30,8 +36,8 @@ input: List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. ontologies: - - edam: "http://edamontology.org/data_2044" # Sequence - - edam: "http://edamontology.org/format_1930" # FASTQ + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1930" - - meta2: type: map description: | @@ -42,7 +48,7 @@ input: description: BWA genome index files pattern: "Directory containing BWA index *.{0132,amb,ann,bwt.2bit.64,pac}" ontologies: - - edam: "http://edamontology.org/data_3210" # Genome index + - edam: "http://edamontology.org/data_3210" - - meta3: type: map description: | @@ -53,15 +59,15 @@ input: description: Reference genome in FASTA format pattern: "*.{fa,fasta,fna}" ontologies: - - edam: "http://edamontology.org/data_2044" # Sequence - - edam: "http://edamontology.org/format_1929" # FASTA - - - sort_bam: - type: boolean - description: use samtools sort (true) or samtools view (false) - pattern: "true or false" + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1929" + - sort_bam: + type: boolean + description: use samtools sort (true) or samtools view (false) + pattern: "true or false" output: - - sam: - - meta: + sam: + - - meta: type: map description: | Groovy Map containing sample information @@ -71,9 +77,9 @@ output: description: Output SAM file containing read alignments pattern: "*.{sam}" ontologies: - - edam: "http://edamontology.org/format_2573" # SAM - - bam: - - meta: + - edam: "http://edamontology.org/format_2573" + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -83,9 +89,9 @@ output: description: Output BAM file containing read alignments pattern: "*.{bam}" ontologies: - - edam: "http://edamontology.org/format_2572" # BAM - - cram: - - meta: + - edam: "http://edamontology.org/format_2572" + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -95,9 +101,9 @@ output: description: Output CRAM file containing read alignments pattern: "*.{cram}" ontologies: - - edam: "http://edamontology.org/format_3462" # CRAM - - crai: - - meta: + - edam: "http://edamontology.org/format_3462" + crai: + - - meta: type: map description: | Groovy Map containing sample information @@ -106,8 +112,9 @@ output: type: file description: Index file for CRAM file pattern: "*.{crai}" - - csi: - - meta: + ontologies: [] + csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -116,11 +123,47 @@ output: type: file description: Index file for BAM file pattern: "*.{csi}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_bwamem2: + - - ${task.process}: + type: string + description: The name of the process + - bwamem2: + type: string + description: The name of the tool + - bwa-mem2 version | grep -o -E "[0-9]+(\.[0-9]+)+": + type: eval + description: The expression to obtain the version of the tool + 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: + - - ${task.process}: + type: string + description: The name of the process + - bwamem2: + type: string + description: The name of the tool + - bwa-mem2 version | grep -o -E "[0-9]+(\.[0-9]+)+": + type: eval + description: The expression to obtain the version of the tool + - - ${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: - "@maxulysse" - "@matthdsm" diff --git a/modules/nf-core/cat/cat/environment.yml b/modules/nf-core/cat/cat/environment.yml index 50c2059afb..985117698a 100644 --- a/modules/nf-core/cat/cat/environment.yml +++ b/modules/nf-core/cat/cat/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::pigz=2.3.4 + - conda-forge::pigz=2.8 diff --git a/modules/nf-core/cat/cat/main.nf b/modules/nf-core/cat/cat/main.nf index 2862c64cd9..6f066e5f78 100644 --- a/modules/nf-core/cat/cat/main.nf +++ b/modules/nf-core/cat/cat/main.nf @@ -3,72 +3,48 @@ process CAT_CAT { label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/pigz:2.3.4' : - 'biocontainers/pigz:2.3.4' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pigz:2.8' : + 'quay.io/biocontainers/pigz:2.8' }" input: tuple val(meta), path(files_in) output: tuple val(meta), path("${prefix}"), emit: file_out - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("pigz"), eval("pigz --version 2>&1 | sed 's/pigz //g'"), topic: versions, emit: versions_cat when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def file_list = files_in.collect { it.toString() } - - // choose appropriate concatenation tool depending on input and output format - - // | input | output | command1 | command2 | - // |-----------|------------|----------|----------| - // | gzipped | gzipped | cat | | - // | ungzipped | ungzipped | cat | | - // | gzipped | ungzipped | zcat | | - // | ungzipped | gzipped | cat | pigz | - - // Use input file ending as default - prefix = task.ext.prefix ?: "${meta.id}${getFileSuffix(file_list[0])}" - out_zip = prefix.endsWith('.gz') - in_zip = file_list[0].endsWith('.gz') - command1 = (in_zip && !out_zip) ? 'zcat' : 'cat' - command2 = (!in_zip && out_zip) ? "| pigz -c -p $task.cpus $args2" : '' - if(file_list.contains(prefix.trim())) { - error "The name of the input file can't be the same as for the output prefix in the " + - "module CAT_CAT (currently `$prefix`). Please choose a different one." - } + def deprecation_message = """ + WARNING: This module has been deprecated. Please use nf-core/modules/find/concatenate + + Reason: + This module passes all input files as shell arguments, which can exceed the UNIX ARG_MAX + limit when concatenating large numbers of files. The find/concatenate module resolves this + by staging files into a directory and enumerating them with `find`, and also enforces + consistent input compression (all gzipped or all uncompressed). Also enables faster, parallel + decompression with pigz. """ - $command1 \\ - $args \\ - ${file_list.join(' ')} \\ - $command2 \\ - > ${prefix} + assert false: deprecation_message - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS - """ + def file_list = files_in.collect { file -> file.toString() } + prefix = task.ext.prefix ?: "${meta.id}${getFileSuffix(file_list[0])}" stub: - def file_list = files_in.collect { it.toString() } - prefix = task.ext.prefix ?: "${meta.id}${file_list[0].substring(file_list[0].lastIndexOf('.'))}" - if(file_list.contains(prefix.trim())) { - error "The name of the input file can't be the same as for the output prefix in the " + - "module CAT_CAT (currently `$prefix`). Please choose a different one." - } - """ - touch $prefix - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS + def deprecation_message = """ + WARNING: This module has been deprecated. Please use nf-core/modules/find/concatenate + + Reason: + This module passes all input files as shell arguments, which can exceed the UNIX ARG_MAX + limit when concatenating large numbers of files. The find/concatenate module resolves this + by staging files into a directory and enumerating them with `find`, and also enforces + consistent input compression (all gzipped or all uncompressed). Also enables faster, parallel + decompression with pigz. """ + assert false: deprecation_message } // for .gz files also include the second to last extension if it is present. E.g., .fasta.gz diff --git a/modules/nf-core/cat/cat/meta.yml b/modules/nf-core/cat/cat/meta.yml index 81778a0671..0163c33a58 100644 --- a/modules/nf-core/cat/cat/meta.yml +++ b/modules/nf-core/cat/cat/meta.yml @@ -1,5 +1,6 @@ name: cat_cat description: A module for concatenation of gzipped or uncompressed files +deprecated: true keywords: - concatenate - gzip @@ -20,21 +21,41 @@ input: type: file description: List of compressed / uncompressed files pattern: "*" + ontologies: [] output: - - file_out: - - meta: - type: file - description: Concatenated file. Will be gzipped if file_out ends with ".gz" - pattern: "${file_out}" + file_out: + - - meta: + type: map + description: Groovy Map containing sample information - ${prefix}: type: file - description: Concatenated file. Will be gzipped if file_out ends with ".gz" + description: Concatenated file. Will be gzipped if file_out ends with + ".gz" pattern: "${file_out}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_cat: + - - ${task.process}: + type: string + description: The name of the process + - pigz: + type: string + description: The name of the tool + - "pigz --version 2>&1 | sed 's/pigz //g'": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - pigz: + type: string + description: The name of the tool + - "pigz --version 2>&1 | sed 's/pigz //g'": + type: eval + description: The expression to obtain the version of the tool + authors: - "@erikrikarddaniel" - "@FriederikeHanssen" diff --git a/modules/nf-core/cat/fastq/main.nf b/modules/nf-core/cat/fastq/main.nf index acfb6d0e62..8d12a78cd3 100644 --- a/modules/nf-core/cat/fastq/main.nf +++ b/modules/nf-core/cat/fastq/main.nf @@ -3,7 +3,7 @@ process CAT_FASTQ { label 'process_single' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" @@ -12,23 +12,19 @@ process CAT_FASTQ { output: tuple val(meta), path("*.merged.fastq.gz"), emit: reads - path "versions.yml", emit: versions + tuple val("${task.process}"), val("cat"), eval("cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//'"), emit: versions_cat, topic: versions when: task.ext.when == null || task.ext.when script: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] + def compress = readList[0]?.endsWith('.gz') ? '' : '| gzip' if (meta.single_end) { if (readList.size >= 1) { """ - cat ${readList.join(' ')} > ${prefix}.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS + cat ${readList.join(' ')} ${compress} > ${prefix}.merged.fastq.gz """ } else { error("Could not find any FASTQ files to concatenate in the process input") @@ -40,13 +36,8 @@ process CAT_FASTQ { def read2 = [] readList.eachWithIndex { v, ix -> (ix & 1 ? read2 : read1) << v } """ - cat ${read1.join(' ')} > ${prefix}_1.merged.fastq.gz - cat ${read2.join(' ')} > ${prefix}_2.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS + cat ${read1.join(' ')} ${compress} > ${prefix}_1.merged.fastq.gz + cat ${read2.join(' ')} ${compress} > ${prefix}_2.merged.fastq.gz """ } else { error("Could not find any FASTQ file pairs to concatenate in the process input") @@ -55,16 +46,11 @@ process CAT_FASTQ { stub: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] if (meta.single_end) { if (readList.size >= 1) { """ echo '' | gzip > ${prefix}.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ files to concatenate in the process input") @@ -75,11 +61,6 @@ process CAT_FASTQ { """ echo '' | gzip > ${prefix}_1.merged.fastq.gz echo '' | gzip > ${prefix}_2.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ file pairs to concatenate in the process input") diff --git a/modules/nf-core/cat/fastq/meta.yml b/modules/nf-core/cat/fastq/meta.yml index 91ff2fb5f6..6fefd6e0ec 100644 --- a/modules/nf-core/cat/fastq/meta.yml +++ b/modules/nf-core/cat/fastq/meta.yml @@ -1,9 +1,10 @@ name: cat_fastq -description: Concatenates fastq files +description: Concatenates fastq files. Supports both compressed (.gz) and uncompressed inputs; uncompressed files are automatically gzip-compressed during concatenation. keywords: - cat - fastq - concatenate + - compress tools: - cat: description: | @@ -21,9 +22,11 @@ input: type: file description: | List of input FastQ files to be concatenated. + Accepts both gzip-compressed (.fastq.gz) and uncompressed (.fastq) files. + ontologies: [] output: - - reads: - - meta: + reads: + - - meta: type: map description: | Groovy Map containing sample information @@ -32,11 +35,30 @@ output: type: file description: Merged fastq file pattern: "*.{merged.fastq.gz}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_cat: + - - ${task.process}: + type: string + description: The process the versions were collected from + - cat: + type: string + description: The tool name + - cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//': + 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 + - cat: + type: string + description: The tool name + - cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//': + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/dragmap/align/main.nf b/modules/nf-core/dragmap/align/main.nf index 3f6ea75366..045443e643 100644 --- a/modules/nf-core/dragmap/align/main.nf +++ b/modules/nf-core/dragmap/align/main.nf @@ -4,9 +4,9 @@ process DRAGMAP_ALIGN { conda "${moduleDir}/environment.yml" // WARN: Do not update this tool to 1.3.0 until https://github.com/Illumina/DRAGMAP/issues/47 is resolved - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-580d344d9d4a496cd403932da8765f9e0187774d:df80ed8d23d0a2c43181a2b3dd1b39f2d00fab5c-0' - : 'biocontainers/mulled-v2-580d344d9d4a496cd403932da8765f9e0187774d:df80ed8d23d0a2c43181a2b3dd1b39f2d00fab5c-0'}" + : 'quay.io/biocontainers/mulled-v2-580d344d9d4a496cd403932da8765f9e0187774d:df80ed8d23d0a2c43181a2b3dd1b39f2d00fab5c-0'}" input: tuple val(meta), path(reads) @@ -21,7 +21,9 @@ process DRAGMAP_ALIGN { tuple val(meta), path("*.crai"), emit: crai, optional: true tuple val(meta), path("*.csi"), emit: csi, optional: true tuple val(meta), path('*.log'), emit: log - path "versions.yml", emit: versions + tuple val("${task.process}"), val('dragmap'), eval("dragen-os --version 2>&1"), emit: versions_dragmap, topic: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), emit: versions_samtools, topic: versions + tuple val("${task.process}"), val('pigz'), eval("pigz --version 2>&1 | sed 's/pigz //'"), emit: versions_pigz, topic: versions when: task.ext.when == null || task.ext.when @@ -46,15 +48,8 @@ process DRAGMAP_ALIGN { ${args} \\ --num-threads ${task.cpus} \\ ${reads_command} \\ - 2> >(tee ${prefix}.dragmap.log >&2) \\ + 2>| >(tee ${prefix}.dragmap.log >&2) \\ | samtools ${samtools_command} ${args2} --threads ${task.cpus} ${reference} -o ${prefix}.${extension} - - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - dragmap: \$(echo \$(dragen-os --version 2>&1)) - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS """ stub: @@ -79,12 +74,5 @@ process DRAGMAP_ALIGN { touch ${prefix}.${extension} ${create_index} touch ${prefix}.log - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - dragmap: \$(echo \$(dragen-os --version 2>&1)) - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - pigz: \$( pigz --version 2>&1 | sed 's/pigz //g' ) - END_VERSIONS """ } diff --git a/modules/nf-core/dragmap/align/meta.yml b/modules/nf-core/dragmap/align/meta.yml index 80f020f58f..bdb7f00a80 100644 --- a/modules/nf-core/dragmap/align/meta.yml +++ b/modules/nf-core/dragmap/align/meta.yml @@ -12,7 +12,8 @@ tools: homepage: https://github.com/Illumina/dragmap documentation: https://github.com/Illumina/dragmap tool_dev_url: https://github.com/Illumina/dragmap#basic-command-line-usage - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: "" input: - - meta: @@ -25,6 +26,8 @@ input: description: | List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. + ontologies: + - edam: http://edamontology.org/format_1930 - - meta2: type: map description: | @@ -34,6 +37,7 @@ input: type: file description: DRAGMAP hash table pattern: "Directory containing DRAGMAP hash table *.{cmp,.bin,.txt}" + ontologies: [] - - meta3: type: map description: | @@ -43,12 +47,14 @@ input: type: file description: Genome fasta reference files pattern: "*.{fa,fasta,fna}" - - - sort_bam: - type: boolean - description: Sort the BAM file + ontologies: + - edam: http://edamontology.org/format_1929 + - sort_bam: + type: boolean + description: Sort the BAM file output: - - sam: - - meta: + sam: + - - meta: type: map description: | Groovy Map containing sample information @@ -57,17 +63,22 @@ output: type: file description: Output SAM file containing read alignments pattern: "*.{sam}" - - bam: - - meta: - type: file - description: Output BAM file containing read alignments - pattern: "*.{bam}" + ontologies: + - edam: http://edamontology.org/format_2571 + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - "*.bam": type: file description: Output BAM file containing read alignments pattern: "*.{bam}" - - cram: - - meta: + ontologies: + - edam: http://edamontology.org/format_2572 + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -76,8 +87,10 @@ output: type: file description: Output CRAM file containing read alignments pattern: "*.{cram}" - - crai: - - meta: + ontologies: + - edam: http://edamontology.org/format_2573 + crai: + - - meta: type: map description: | Groovy Map containing sample information @@ -86,8 +99,9 @@ output: type: file description: Index file for CRAM file pattern: "*.{crai}" - - csi: - - meta: + ontologies: [] + csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -96,8 +110,9 @@ output: type: file description: Index file for CRAM file pattern: "*.{csi}" - - log: - - meta: + ontologies: [] + log: + - - meta: type: map description: | Groovy Map containing sample information @@ -106,11 +121,67 @@ output: type: file description: Log file pattern: "*.{log}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3888 + versions_dragmap: + - - ${task.process}: + type: string + description: The name of the process + - dragmap: + type: string + description: The name of the tool + - dragen-os --version 2>&1: + type: eval + description: The expression to obtain the version of the tool + 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 + versions_pigz: + - - ${task.process}: + type: string + description: The name of the process + - pigz: + type: string + description: The name of the tool + - pigz --version 2>&1 | sed 's/pigz //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - dragmap: + type: string + description: The name of the tool + - dragen-os --version 2>&1: + type: eval + description: The expression to obtain the version of the tool + - - ${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 + - - ${task.process}: + type: string + description: The name of the process + - pigz: + type: string + description: The name of the tool + - pigz --version 2>&1 | sed 's/pigz //': + type: eval + description: The expression to obtain the version of the tool authors: - "@edmundmiller" maintainers: diff --git a/modules/nf-core/dragmap/hashtable/main.nf b/modules/nf-core/dragmap/hashtable/main.nf index e86b110094..ff49b73e3d 100644 --- a/modules/nf-core/dragmap/hashtable/main.nf +++ b/modules/nf-core/dragmap/hashtable/main.nf @@ -4,16 +4,16 @@ process DRAGMAP_HASHTABLE { conda "${moduleDir}/environment.yml" // WARN: Do not update this tool to 1.3.0 until https://github.com/Illumina/DRAGMAP/issues/47 is resolved - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/dragmap:1.2.1--h72d16da_1' - : 'biocontainers/dragmap:1.2.1--h72d16da_1'}" + : 'quay.io/biocontainers/dragmap:1.2.1--h72d16da_1'}" input: tuple val(meta), path(fasta) output: tuple val(meta), path("dragmap"), emit: hashmap - path "versions.yml", emit: versions + tuple val("${task.process}"), val('dragmap'), eval("dragen-os --version 2>&1"), emit: versions_dragmap, topic: versions when: task.ext.when == null || task.ext.when @@ -28,20 +28,10 @@ process DRAGMAP_HASHTABLE { --output-directory dragmap \\ ${args} \\ --ht-num-threads ${task.cpus} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - dragmap: \$(echo \$(dragen-os --version 2>&1)) - END_VERSIONS """ stub: """ mkdir dragmap - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - dragmap: \$(echo \$(dragen-os --version 2>&1)) - END_VERSIONS """ } diff --git a/modules/nf-core/dragmap/hashtable/meta.yml b/modules/nf-core/dragmap/hashtable/meta.yml index c6367b4739..5d2e3929fa 100644 --- a/modules/nf-core/dragmap/hashtable/meta.yml +++ b/modules/nf-core/dragmap/hashtable/meta.yml @@ -11,7 +11,8 @@ tools: homepage: https://github.com/Illumina/dragmap documentation: https://github.com/Illumina/dragmap tool_dev_url: https://github.com/Illumina/dragmap#basic-command-line-usage - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: "" input: - - meta: @@ -22,7 +23,8 @@ input: - fasta: type: file description: Input genome fasta file - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_1929 output: hashmap: - - meta: @@ -31,17 +33,35 @@ output: Groovy Map containing reference information e.g. [ id:'test', single_end:false ] - dragmap: - type: file + type: string + description: DRAGMAP hash table + pattern: "*.{cmp,.bin,.txt}" + ontologies: [] + versions_dragmap: + - - ${task.process}: + type: string + description: The name of the process + - dragmap: + type: string description: DRAGMAP hash table pattern: "*.{cmp,.bin,.txt}" ontologies: [] + - dragen-os --version 2>&1: + 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 + - dragmap: + type: string + description: DRAGMAP hash table + pattern: "*.{cmp,.bin,.txt}" + ontologies: [] + - dragen-os --version 2>&1: + type: eval + description: The expression to obtain the version of the tool authors: - "@edmundmiller" maintainers: diff --git a/modules/nf-core/fastp/environment.yml b/modules/nf-core/fastp/environment.yml index 90adcd2c52..b04ba3680e 100644 --- a/modules/nf-core/fastp/environment.yml +++ b/modules/nf-core/fastp/environment.yml @@ -4,4 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::fastp=0.24.0 + # renovate: datasource=conda depName=bioconda/fastp + - bioconda::fastp=1.1.0 diff --git a/modules/nf-core/fastp/main.nf b/modules/nf-core/fastp/main.nf index 1342741d53..7b58e32273 100644 --- a/modules/nf-core/fastp/main.nf +++ b/modules/nf-core/fastp/main.nf @@ -3,13 +3,12 @@ process FASTP { 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/88/889a182b8066804f4799f3808a5813ad601381a8a0e3baa4ab8d73e739b97001/data' : - 'community.wave.seqera.io/library/fastp:0.24.0--62c97b06e8447690' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/55/556474e164daf5a5e218cd5d497681dcba0645047cf24698f88e3e078eacbd09/data' : + 'community.wave.seqera.io/library/fastp:1.1.0--08aa7c5662a30d57' }" input: - tuple val(meta), path(reads) - path adapter_fasta + tuple val(meta), path(reads), path(adapter_fasta) val discard_trimmed_pass val save_trimmed_fail val save_merged @@ -21,7 +20,7 @@ process FASTP { tuple val(meta), path('*.log') , emit: log tuple val(meta), path('*.fail.fastq.gz') , optional:true, emit: reads_fail tuple val(meta), path('*.merged.fastq.gz'), optional:true, emit: reads_merged - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('fastp'), eval('fastp --version 2>&1 | sed -e "s/fastp //g"'), emit: versions_fastp, topic: versions when: task.ext.when == null || task.ext.when @@ -30,9 +29,9 @@ process FASTP { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def adapter_list = adapter_fasta ? "--adapter_fasta ${adapter_fasta}" : "" - def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--failed_out ${prefix}.paired.fail.fastq.gz --unpaired1 ${prefix}_1.fail.fastq.gz --unpaired2 ${prefix}_2.fail.fastq.gz" : '' - def out_fq1 = discard_trimmed_pass ?: ( meta.single_end ? "--out1 ${prefix}.fastp.fastq.gz" : "--out1 ${prefix}_1.fastp.fastq.gz" ) - def out_fq2 = discard_trimmed_pass ?: "--out2 ${prefix}_2.fastp.fastq.gz" + def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--failed_out ${prefix}.paired.fail.fastq.gz --unpaired1 ${prefix}_R1.fail.fastq.gz --unpaired2 ${prefix}_R2.fail.fastq.gz" : '' + def out_fq1 = discard_trimmed_pass ?: ( meta.single_end ? "--out1 ${prefix}.fastp.fastq.gz" : "--out1 ${prefix}_R1.fastp.fastq.gz" ) + def out_fq2 = discard_trimmed_pass ?: "--out2 ${prefix}_R2.fastp.fastq.gz" // Added soft-links to original fastqs for consistent naming in MultiQC // Use single ended for interleaved. Add --interleaved_in in config. if ( task.ext.args?.contains('--interleaved_in') ) { @@ -48,13 +47,8 @@ process FASTP { $adapter_list \\ $fail_fastq \\ $args \\ - 2> >(tee ${prefix}.fastp.log >&2) \\ + 2>| >(tee ${prefix}.fastp.log >&2) \\ | gzip -c > ${prefix}.fastp.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastp: \$(fastp --version 2>&1 | sed -e "s/fastp //g") - END_VERSIONS """ } else if (meta.single_end) { """ @@ -69,21 +63,16 @@ process FASTP { $adapter_list \\ $fail_fastq \\ $args \\ - 2> >(tee ${prefix}.fastp.log >&2) - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastp: \$(fastp --version 2>&1 | sed -e "s/fastp //g") - END_VERSIONS + 2>| >(tee ${prefix}.fastp.log >&2) """ } else { def merge_fastq = save_merged ? "-m --merged_out ${prefix}.merged.fastq.gz" : '' """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -sf ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -sf ${reads[1]} ${prefix}_2.fastq.gz + [ ! -f ${prefix}_R1.fastq.gz ] && ln -sf ${reads[0]} ${prefix}_R1.fastq.gz + [ ! -f ${prefix}_R2.fastq.gz ] && ln -sf ${reads[1]} ${prefix}_R2.fastq.gz fastp \\ - --in1 ${prefix}_1.fastq.gz \\ - --in2 ${prefix}_2.fastq.gz \\ + --in1 ${prefix}_R1.fastq.gz \\ + --in2 ${prefix}_R2.fastq.gz \\ $out_fq1 \\ $out_fq2 \\ --json ${prefix}.fastp.json \\ @@ -94,21 +83,16 @@ process FASTP { --thread $task.cpus \\ --detect_adapter_for_pe \\ $args \\ - 2> >(tee ${prefix}.fastp.log >&2) - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastp: \$(fastp --version 2>&1 | sed -e "s/fastp //g") - END_VERSIONS + 2>| >(tee ${prefix}.fastp.log >&2) """ } stub: def prefix = task.ext.prefix ?: "${meta.id}" def is_single_output = task.ext.args?.contains('--interleaved_in') || meta.single_end - def touch_reads = (discard_trimmed_pass) ? "" : (is_single_output) ? "echo '' | gzip > ${prefix}.fastp.fastq.gz" : "echo '' | gzip > ${prefix}_1.fastp.fastq.gz ; echo '' | gzip > ${prefix}_2.fastp.fastq.gz" + def touch_reads = (discard_trimmed_pass) ? "" : (is_single_output) ? "echo '' | gzip > ${prefix}.fastp.fastq.gz" : "echo '' | gzip > ${prefix}_R1.fastp.fastq.gz ; echo '' | gzip > ${prefix}_R2.fastp.fastq.gz" def touch_merged = (!is_single_output && save_merged) ? "echo '' | gzip > ${prefix}.merged.fastq.gz" : "" - def touch_fail_fastq = (!save_trimmed_fail) ? "" : meta.single_end ? "echo '' | gzip > ${prefix}.fail.fastq.gz" : "echo '' | gzip > ${prefix}.paired.fail.fastq.gz ; echo '' | gzip > ${prefix}_1.fail.fastq.gz ; echo '' | gzip > ${prefix}_2.fail.fastq.gz" + def touch_fail_fastq = (!save_trimmed_fail) ? "" : meta.single_end ? "echo '' | gzip > ${prefix}.fail.fastq.gz" : "echo '' | gzip > ${prefix}.paired.fail.fastq.gz ; echo '' | gzip > ${prefix}_R1.fail.fastq.gz ; echo '' | gzip > ${prefix}_R2.fail.fastq.gz" """ $touch_reads $touch_fail_fastq @@ -116,10 +100,5 @@ process FASTP { touch "${prefix}.fastp.json" touch "${prefix}.fastp.html" touch "${prefix}.fastp.log" - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastp: \$(fastp --version 2>&1 | sed -e "s/fastp //g") - END_VERSIONS """ } diff --git a/modules/nf-core/fastp/meta.yml b/modules/nf-core/fastp/meta.yml index 9c4b245844..a67be395b8 100644 --- a/modules/nf-core/fastp/meta.yml +++ b/modules/nf-core/fastp/meta.yml @@ -24,25 +24,27 @@ input: List of input FastQ files of size 1 and 2 for single-end and paired-end data, respectively. If you wish to run interleaved paired-end data, supply as single-end data but with `--interleaved_in` in your `modules.conf`'s `ext.args` for the module. - - - adapter_fasta: + ontologies: [] + - adapter_fasta: type: file description: File in FASTA format containing possible adapters to remove. pattern: "*.{fasta,fna,fas,fa}" - - - discard_trimmed_pass: - type: boolean - description: | - Specify true to not write any reads that pass trimming thresholds. - This can be used to use fastp for the output report only. - - - save_trimmed_fail: - type: boolean - description: Specify true to save files that failed to pass trimming thresholds - ending in `*.fail.fastq.gz` - - - save_merged: - type: boolean - description: Specify true to save all merged reads to a file ending in `*.merged.fastq.gz` + ontologies: [] + - discard_trimmed_pass: + type: boolean + description: | + Specify true to not write any reads that pass trimming thresholds. + This can be used to use fastp for the output report only. + - save_trimmed_fail: + type: boolean + description: Specify true to save files that failed to pass trimming thresholds + ending in `*.fail.fastq.gz` + - save_merged: + type: boolean + description: Specify true to save all merged reads to a file ending in `*.merged.fastq.gz` output: - - reads: - - meta: + reads: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,8 +53,11 @@ output: type: file description: The trimmed/modified/unmerged fastq reads pattern: "*fastp.fastq.gz" - - json: - - meta: + ontologies: + - edam: http://edamontology.org/format_1930 # FASTQ + - edam: http://edamontology.org/format_3989 # GZIP format + json: + - - meta: type: map description: | Groovy Map containing sample information @@ -61,8 +66,10 @@ output: type: file description: Results in JSON format pattern: "*.json" - - html: - - meta: + ontologies: + - edam: http://edamontology.org/format_3464 # JSON + html: + - - meta: type: map description: | Groovy Map containing sample information @@ -71,8 +78,9 @@ output: type: file description: Results in HTML format pattern: "*.html" - - log: - - meta: + ontologies: [] + log: + - - meta: type: map description: | Groovy Map containing sample information @@ -81,8 +89,9 @@ output: type: file description: fastq log file pattern: "*.log" - - reads_fail: - - meta: + ontologies: [] + reads_fail: + - - meta: type: map description: | Groovy Map containing sample information @@ -91,8 +100,11 @@ output: type: file description: Reads the failed the preprocessing pattern: "*fail.fastq.gz" - - reads_merged: - - meta: + ontologies: + - edam: http://edamontology.org/format_1930 # FASTQ + - edam: http://edamontology.org/format_3989 # GZIP format + reads_merged: + - - meta: type: map description: | Groovy Map containing sample information @@ -101,14 +113,32 @@ output: type: file description: Reads that were successfully merged pattern: "*.{merged.fastq.gz}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_fastp: + - - "${task.process}": + type: string + description: The name of the process + - fastp: + type: string + description: The name of the tool + - 'fastp --version 2>&1 | sed -e "s/fastp //g"': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - "${task.process}": + type: string + description: The name of the process + - fastp: + type: string + description: The name of the tool + - 'fastp --version 2>&1 | sed -e "s/fastp //g"': + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@kevinmenden" + - "@eit-maxlcummins" maintainers: - "@drpatelh" - "@kevinmenden" diff --git a/modules/nf-core/fgbio/callmolecularconsensusreads/environment.yml b/modules/nf-core/fgbio/callmolecularconsensusreads/environment.yml index 4ebc0924d7..6af3be6aa4 100644 --- a/modules/nf-core/fgbio/callmolecularconsensusreads/environment.yml +++ b/modules/nf-core/fgbio/callmolecularconsensusreads/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::fgbio=2.4.0 + - bioconda::fgbio=3.1.2 diff --git a/modules/nf-core/fgbio/callmolecularconsensusreads/main.nf b/modules/nf-core/fgbio/callmolecularconsensusreads/main.nf index 7d2e660d02..bf07bcd9e2 100644 --- a/modules/nf-core/fgbio/callmolecularconsensusreads/main.nf +++ b/modules/nf-core/fgbio/callmolecularconsensusreads/main.nf @@ -1,11 +1,11 @@ process FGBIO_CALLMOLECULARCONSENSUSREADS { - 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/87/87626ef674e2f19366ae6214575a114fe80ce598e796894820550731706a84be/data' : - 'community.wave.seqera.io/library/fgbio:2.4.0--913bad9d47ff8ddc' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4d/4d1150a2e123f49f8c268f0ab429847afae642376fa52af713b846b084df4a9f/data' + : 'community.wave.seqera.io/library/fgbio:3.1.2--6e9400d507a9dc55'}" input: tuple val(meta), path(grouped_bam) @@ -14,7 +14,7 @@ process FGBIO_CALLMOLECULARCONSENSUSREADS { output: tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('fgbio'), eval('fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\\[.*$//"'), topic: versions, emit: versions_fgbio when: task.ext.when == null || task.ext.when @@ -24,11 +24,14 @@ process FGBIO_CALLMOLECULARCONSENSUSREADS { def prefix = task.ext.prefix ?: "${meta.id}_consensus_unmapped" def mem_gb = 8 if (!task.memory) { - log.info '[fgbio CallMolecularConsensusReads] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.' - } else { + log.info('[fgbio CallMolecularConsensusReads] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.') + } + else { mem_gb = task.memory.giga } - if ("$grouped_bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${grouped_bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } """ fgbio \\ -Xmx${mem_gb}g \\ @@ -36,29 +39,20 @@ process FGBIO_CALLMOLECULARCONSENSUSREADS { --async-io=true \\ --compression=1 \\ CallMolecularConsensusReads \\ - --input $grouped_bam \\ + --input ${grouped_bam} \\ --output ${prefix}.bam \\ --min-reads ${min_reads} \\ --min-input-base-quality ${min_baseq} \\ --threads ${task.cpus} \\ - $args; - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$( echo \$(fgbio --version 2>&1 | tr -d '[:cntrl:]' ) | sed -e 's/^.*Version: //;s/\\[.*\$//') - END_VERSIONS + ${args} """ stub: prefix = task.ext.prefix ?: "${meta.id}_consensus_unmapped" - if ("$grouped_bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${grouped_bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } """ touch ${prefix}.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$( echo \$(fgbio --version 2>&1 | tr -d '[:cntrl:]' ) | sed -e 's/^.*Version: //;s/\\[.*\$//') - END_VERSIONS """ - } diff --git a/modules/nf-core/fgbio/callmolecularconsensusreads/meta.yml b/modules/nf-core/fgbio/callmolecularconsensusreads/meta.yml index 846c297b19..6bc57de7d2 100644 --- a/modules/nf-core/fgbio/callmolecularconsensusreads/meta.yml +++ b/modules/nf-core/fgbio/callmolecularconsensusreads/meta.yml @@ -1,12 +1,14 @@ name: fgbio_callmolecularconsensusreads -description: Calls consensus sequences from reads with the same unique molecular tag. +description: Calls consensus sequences from reads with the same unique molecular + tag. keywords: - UMIs - consensus sequence - bam tools: - fgbio: - description: Tools for working with genomic and high throughput sequencing data. + description: Tools for working with genomic and high throughput sequencing + data. homepage: https://github.com/fulcrumgenomics/fgbio documentation: http://fulcrumgenomics.github.io/fgbio/ licence: ["MIT"] @@ -22,15 +24,16 @@ input: description: | The input SAM or BAM file, grouped by UMIs pattern: "*.{bam,sam}" - - - min_reads: - type: integer - description: Minimum number of original reads to build each consensus read. - - - min_baseq: - type: integer - description: Ignore bases in raw reads that have Q below this value. + ontologies: [] + - min_reads: + type: integer + description: Minimum number of original reads to build each consensus read. + - min_baseq: + type: integer + description: Ignore bases in raw reads that have Q below this value. output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -40,11 +43,29 @@ output: description: | Output SAM or BAM file to write consensus reads. pattern: "*.{bam,sam}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_fgbio: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + 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 + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + type: eval + description: The expression to obtain the version of the tool authors: - "@sruthipsuresh" maintainers: diff --git a/modules/nf-core/fgbio/copyumifromreadname/environment.yml b/modules/nf-core/fgbio/copyumifromreadname/environment.yml index 4ebc0924d7..6af3be6aa4 100644 --- a/modules/nf-core/fgbio/copyumifromreadname/environment.yml +++ b/modules/nf-core/fgbio/copyumifromreadname/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::fgbio=2.4.0 + - bioconda::fgbio=3.1.2 diff --git a/modules/nf-core/fgbio/copyumifromreadname/main.nf b/modules/nf-core/fgbio/copyumifromreadname/main.nf index b15c970af1..eafccacf51 100644 --- a/modules/nf-core/fgbio/copyumifromreadname/main.nf +++ b/modules/nf-core/fgbio/copyumifromreadname/main.nf @@ -1,11 +1,11 @@ process FGBIO_COPYUMIFROMREADNAME { - tag "$meta.id" + 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/87/87626ef674e2f19366ae6214575a114fe80ce598e796894820550731706a84be/data' : - 'community.wave.seqera.io/library/fgbio:2.4.0--913bad9d47ff8ddc' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4d/4d1150a2e123f49f8c268f0ab429847afae642376fa52af713b846b084df4a9f/data' + : 'community.wave.seqera.io/library/fgbio:3.1.2--6e9400d507a9dc55'}" input: tuple val(meta), path(bam), path(bai) @@ -13,22 +13,23 @@ process FGBIO_COPYUMIFROMREADNAME { output: tuple val(meta), path("*.bam"), emit: bam tuple val(meta), path("*.bai"), emit: bai - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('fgbio'), eval('fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\\[.*$//"'), topic: versions, emit: versions_fgbio when: task.ext.when == null || task.ext.when - script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}_umi_extracted" def mem_gb = 8 if (!task.memory) { - log.info '[fgbio CopyUmiFromReadName] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.' - } else if (mem_gb > task.memory.giga) { + log.info('[fgbio CopyUmiFromReadName] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.') + } + else if (mem_gb > task.memory.giga) { if (task.memory.giga < 2) { mem_gb = 1 - } else { + } + else { mem_gb = task.memory.giga - 1 } } @@ -41,24 +42,12 @@ process FGBIO_COPYUMIFROMREADNAME { ${args} \\ --input ${bam} \\ --output ${prefix}.bam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$( echo \$(fgbio --version 2>&1 | tr -d '[:cntrl:]' ) | sed -e 's/^.*Version: //;s/\\[.*\$//') - END_VERSIONS """ - stub: def prefix = task.ext.prefix ?: "${meta.id}_umi_extracted" """ - touch ${prefix}.bam touch ${prefix}.bai - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$(fgbio --version) - END_VERSIONS """ } diff --git a/modules/nf-core/fgbio/copyumifromreadname/meta.yml b/modules/nf-core/fgbio/copyumifromreadname/meta.yml index 7e7b30f71d..27a9825e82 100644 --- a/modules/nf-core/fgbio/copyumifromreadname/meta.yml +++ b/modules/nf-core/fgbio/copyumifromreadname/meta.yml @@ -2,9 +2,10 @@ name: "fgbio_copyumifromreadname" description: Copies the UMI at the end of a bam files read name to the RX tag. keywords: - - sort - - example - - genomics + - fgbio + - copy + - umi + - readname tools: - "fgbio": description: "A set of tools for working with genomic and high throughput sequencing @@ -65,14 +66,28 @@ output: pattern: "*.{bai}" ontologies: - edam: "http://edamontology.org/format_3327" # BAI - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + versions_fgbio: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + type: eval + description: The expression to obtain the version of the tool - ontologies: - - edam: http://edamontology.org/format_3750 # YAML +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + type: eval + description: The expression to obtain the version of the tool authors: - "@sppearce" maintainers: diff --git a/modules/nf-core/fgbio/fastqtobam/environment.yml b/modules/nf-core/fgbio/fastqtobam/environment.yml index 4ebc0924d7..6af3be6aa4 100644 --- a/modules/nf-core/fgbio/fastqtobam/environment.yml +++ b/modules/nf-core/fgbio/fastqtobam/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::fgbio=2.4.0 + - bioconda::fgbio=3.1.2 diff --git a/modules/nf-core/fgbio/fastqtobam/main.nf b/modules/nf-core/fgbio/fastqtobam/main.nf index b4223db0f8..bc7b7faad4 100644 --- a/modules/nf-core/fgbio/fastqtobam/main.nf +++ b/modules/nf-core/fgbio/fastqtobam/main.nf @@ -1,19 +1,18 @@ process FGBIO_FASTQTOBAM { - tag "$meta.id" + 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/87/87626ef674e2f19366ae6214575a114fe80ce598e796894820550731706a84be/data' : - 'community.wave.seqera.io/library/fgbio:2.4.0--913bad9d47ff8ddc' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4d/4d1150a2e123f49f8c268f0ab429847afae642376fa52af713b846b084df4a9f/data' + : 'community.wave.seqera.io/library/fgbio:3.1.2--6e9400d507a9dc55'}" input: tuple val(meta), path(reads) output: - tuple val(meta), path("*.bam") , emit: bam , optional: true - tuple val(meta), path("*.cram"), emit: cram, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.{bam,cram}"), emit: bam + tuple val("${task.process}"), val('fgbio'), eval('fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\\[.*$//"'), topic: versions, emit: versions_fgbio when: task.ext.when == null || task.ext.when @@ -27,11 +26,13 @@ process FGBIO_FASTQTOBAM { def mem_gb = 8 if (!task.memory) { - log.info '[fgbio FastqToBam] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.' - } else if (mem_gb > task.memory.giga) { + log.info('[fgbio FastqToBam] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.') + } + else if (mem_gb > task.memory.giga) { if (task.memory.giga < 2) { mem_gb = 1 - } else { + } + else { mem_gb = task.memory.giga - 1 } } @@ -47,24 +48,12 @@ process FGBIO_FASTQTOBAM { --output ${prefix}.${suffix} \\ ${sample_name} \\ ${library_name} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$( echo \$(fgbio --version 2>&1 | tr -d '[:cntrl:]' ) | sed -e 's/^.*Version: //;s/\\[.*\$//') - END_VERSIONS """ stub: - def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def suffix = task.ext.suffix ?: "bam" - """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$( echo \$(fgbio --version 2>&1 | tr -d '[:cntrl:]' ) | sed -e 's/^.*Version: //;s/\\[.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/fgbio/fastqtobam/meta.yml b/modules/nf-core/fgbio/fastqtobam/meta.yml index bce76cf8c0..89d67a9f30 100644 --- a/modules/nf-core/fgbio/fastqtobam/meta.yml +++ b/modules/nf-core/fgbio/fastqtobam/meta.yml @@ -7,8 +7,8 @@ keywords: - cram tools: - fgbio: - description: A set of tools for working with genomic and high throughput sequencing - data, including UMIs + description: A set of tools for working with genomic and high throughput + sequencing data, including UMIs homepage: http://fulcrumgenomics.github.io/fgbio/ documentation: http://fulcrumgenomics.github.io/fgbio/tools/latest/ tool_dev_url: https://github.com/fulcrumgenomics/fgbio @@ -24,32 +24,42 @@ input: type: file description: pair of reads to be converted into BAM file pattern: "*.{fastq.gz}" + ontologies: [] output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.bam": + - "*.{bam,cram}": type: file - description: Unaligned, unsorted BAM file - pattern: "*.{bam}" - - cram: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.cram": - type: file - description: Unaligned, unsorted CRAM file - pattern: "*.{cram}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + description: Unaligned, unsorted BAM or CRAM file + pattern: "*.{bam,cram}" + ontologies: [] + versions_fgbio: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + 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 + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + type: eval + description: The expression to obtain the version of the tool + authors: - "@lescai" - "@matthdsm" diff --git a/modules/nf-core/fgbio/groupreadsbyumi/environment.yml b/modules/nf-core/fgbio/groupreadsbyumi/environment.yml index 4ebc0924d7..6af3be6aa4 100644 --- a/modules/nf-core/fgbio/groupreadsbyumi/environment.yml +++ b/modules/nf-core/fgbio/groupreadsbyumi/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::fgbio=2.4.0 + - bioconda::fgbio=3.1.2 diff --git a/modules/nf-core/fgbio/groupreadsbyumi/main.nf b/modules/nf-core/fgbio/groupreadsbyumi/main.nf index c0506c9022..6a72ef3d79 100644 --- a/modules/nf-core/fgbio/groupreadsbyumi/main.nf +++ b/modules/nf-core/fgbio/groupreadsbyumi/main.nf @@ -1,20 +1,21 @@ process FGBIO_GROUPREADSBYUMI { - tag "$meta.id" + 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/87/87626ef674e2f19366ae6214575a114fe80ce598e796894820550731706a84be/data' : - 'community.wave.seqera.io/library/fgbio:2.4.0--913bad9d47ff8ddc' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/4d/4d1150a2e123f49f8c268f0ab429847afae642376fa52af713b846b084df4a9f/data' + : 'community.wave.seqera.io/library/fgbio:3.1.2--6e9400d507a9dc55'}" input: tuple val(meta), path(bam) - val(strategy) + val strategy output: - tuple val(meta), path("*.bam") , emit: bam + tuple val(meta), path("*.bam"), emit: bam tuple val(meta), path("*histogram.txt"), emit: histogram - path "versions.yml" , emit: versions + tuple val(meta), path("*read-metrics.txt"), emit: read_metrics + tuple val("${task.process}"), val('fgbio'), eval('fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\\[.*$//"'), topic: versions, emit: versions_fgbio when: task.ext.when == null || task.ext.when @@ -24,44 +25,42 @@ process FGBIO_GROUPREADSBYUMI { def prefix = task.ext.prefix ?: "${meta.id}_umi-grouped" def mem_gb = 8 if (!task.memory) { - log.info '[fgbio FilterConsensusReads] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.' - } else if (mem_gb > task.memory.giga) { + log.info('[fgbio FilterConsensusReads] Available memory not known - defaulting to 8GB. Specify process memory requirements to change this.') + } + else if (mem_gb > task.memory.giga) { if (task.memory.giga < 2) { mem_gb = 1 - } else { + } + else { mem_gb = task.memory.giga - 1 } } - if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } """ fgbio \\ -Xmx${mem_gb}g \\ --tmp-dir=. \\ GroupReadsByUmi \\ - -s $strategy \\ - $args \\ - -i $bam \\ + -s ${strategy} \\ + ${args} \\ + -i ${bam} \\ -o ${prefix}.bam \\ - -f ${prefix}_histogram.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$( echo \$(fgbio --version 2>&1 | tr -d '[:cntrl:]' ) | sed -e 's/^.*Version: //;s/\\[.*\$//') - END_VERSIONS + -f ${prefix}_histogram.txt \\ + --grouping-metrics ${prefix}_read-metrics.txt """ stub: def prefix = task.ext.prefix ?: "${meta.id}_umi-grouped" - if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } """ touch ${prefix}.bam touch ${prefix}_histogram.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fgbio: \$( echo \$(fgbio --version 2>&1 | tr -d '[:cntrl:]' ) | sed -e 's/^.*Version: //;s/\\[.*\$//') - END_VERSIONS + touch ${prefix}_read-metrics.txt """ } diff --git a/modules/nf-core/fgbio/groupreadsbyumi/meta.yml b/modules/nf-core/fgbio/groupreadsbyumi/meta.yml index c6d588daf1..34d38d7693 100644 --- a/modules/nf-core/fgbio/groupreadsbyumi/meta.yml +++ b/modules/nf-core/fgbio/groupreadsbyumi/meta.yml @@ -30,15 +30,16 @@ input: description: | BAM file. Note: the MQ tag is required on reads with mapped mates (!) pattern: "*.bam" - - - strategy: - type: string - enum: ["Identity", "Edit", "Adjacency", "Paired"] - description: | - Required argument: defines the UMI assignment strategy. - Must be chosen among: Identity, Edit, Adjacency, Paired. + ontologies: [] + - strategy: + type: string + enum: ["Identity", "Edit", "Adjacency", "Paired"] + description: | + Required argument: defines the UMI assignment strategy. + Must be chosen among: Identity, Edit, Adjacency, Paired. output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -47,8 +48,9 @@ output: type: file description: UMI-grouped BAM pattern: "*.bam" - - histogram: - - meta: + ontologies: [] + histogram: + - - meta: type: map description: | Groovy Map containing sample information @@ -57,11 +59,40 @@ output: type: file description: A text file containing the tag family size counts pattern: "*.txt" - - versions: - - versions.yml: + ontologies: [] + read_metrics: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*read-metrics.txt": type: file - description: File containing software versions - pattern: "versions.yml" + description: A text file containing the read count metrics from grouping + pattern: "*.txt" + ontologies: [] + versions_fgbio: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + 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 + - fgbio: + type: string + description: The tool name + - 'fgbio --version 2>&1 | tr -d "[:cntrl:]" | sed -e "s/^.*Version: //;s/\[.*$//"': + type: eval + description: The expression to obtain the version of the tool authors: - "@lescai" maintainers: diff --git a/modules/nf-core/gawk/environment.yml b/modules/nf-core/gawk/environment.yml index f52109e83b..185a0f5452 100644 --- a/modules/nf-core/gawk/environment.yml +++ b/modules/nf-core/gawk/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::gawk=5.3.0 + - conda-forge::gawk=5.3.1 diff --git a/modules/nf-core/gawk/main.nf b/modules/nf-core/gawk/main.nf index 615b2ce923..3b9447301b 100644 --- a/modules/nf-core/gawk/main.nf +++ b/modules/nf-core/gawk/main.nf @@ -3,9 +3,9 @@ process GAWK { label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gawk:5.3.0' : - 'biocontainers/gawk:5.3.0' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/a1/a125c778baf3865331101a104b60d249ee15fe1dca13bdafd888926cc5490a34/data' : + 'community.wave.seqera.io/library/gawk:5.3.1--e09efb5dfc4b8156' }" input: tuple val(meta), path(input, arity: '0..*') @@ -14,7 +14,7 @@ process GAWK { output: tuple val(meta), path("*.${suffix}"), emit: output - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('gawk'), eval("awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//'"), topic: versions, emit: versions_gawk when: task.ext.when == null || task.ext.when @@ -23,18 +23,18 @@ process GAWK { def args = task.ext.args ?: '' // args is used for the main arguments of the tool def args2 = task.ext.args2 ?: '' // args2 is used to specify a program when no program file has been given prefix = task.ext.prefix ?: "${meta.id}" - suffix = task.ext.suffix ?: "${input.collect{ it.getExtension()}.get(0)}" // use the first extension of the input files + suffix = task.ext.suffix ?: "${input.collect{ file -> file.getExtension()}.get(0)}" // use the first extension of the input files program = program_file ? "-f ${program_file}" : "${args2}" - lst_gz = input.findResults{ it.getExtension().endsWith("gz") ? it.toString() : null } + lst_gz = input.findResults{ file -> file.getExtension().endsWith("gz") ? file.toString() : null } unzip = lst_gz ? "gunzip -q -f ${lst_gz.join(" ")}" : "" - input_cmd = input.collect { it.toString() - ~/\.gz$/ }.join(" ") + input_cmd = input.collect { file -> file.toString() - ~/\.gz$/ }.join(" ") output_cmd = suffix.endsWith("gz") ? "| gzip > ${prefix}.${suffix}" : "> ${prefix}.${suffix}" output = disable_redirect_output ? "" : output_cmd - cleanup = lst_gz ? "rm ${lst_gz.collect{ it - ~/\.gz$/ }.join(" ")}" : "" + cleanup = lst_gz ? "rm ${lst_gz.collect{ file -> file - ~/\.gz$/ }.join(" ")}" : "" - input.collect{ - assert it.name != "${prefix}.${suffix}" : "Input and output names are the same, set prefix in module configuration to disambiguate!" + input.collect{ file -> + assert file.name != "${prefix}.${suffix}" : "Input and output names are the same, set prefix in module configuration to disambiguate!" } """ @@ -47,24 +47,14 @@ process GAWK { ${output} ${cleanup} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') - END_VERSIONS """ stub: prefix = task.ext.prefix ?: "${meta.id}" - suffix = task.ext.suffix ?: "${input.getExtension()}" + suffix = task.ext.suffix ?: "${input.collect{ file -> file.getExtension()}.get(0)}" def create_cmd = suffix.endsWith("gz") ? "echo '' | gzip >" : "touch" """ ${create_cmd} ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') - END_VERSIONS """ } diff --git a/modules/nf-core/gawk/meta.yml b/modules/nf-core/gawk/meta.yml index 34c50b125c..96cd0c72bc 100644 --- a/modules/nf-core/gawk/meta.yml +++ b/modules/nf-core/gawk/meta.yml @@ -15,7 +15,8 @@ tools: homepage: "https://www.gnu.org/software/gawk/" documentation: "https://www.gnu.org/software/gawk/manual/" tool_dev_url: "https://www.gnu.org/prep/ftp.html" - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: "" input: - - meta: @@ -25,38 +26,58 @@ input: e.g. [ id:'test', single_end:false ] - input: type: file - description: The input file - Specify the logic that needs to be executed on - this file on the `ext.args2` or in the program file. - If the files have a `.gz` extension, they will be unzipped using `zcat`. + description: The input file - Specify the logic that needs to be executed + on this file on the `ext.args2` or in the program file. If the files + have a `.gz` extension, they will be unzipped using `zcat`. pattern: "*" - - - program_file: - type: file - description: Optional file containing logic for awk to execute. If you don't - wish to use a file, you can use `ext.args2` to specify the logic. - pattern: "*" - - - disable_redirect_output: - type: boolean - description: Disable the redirection of awk output to a given file. This is - useful if you want to use awk's built-in redirect to write files instead - of the shell's redirect. + ontologies: [] + - program_file: + type: file + description: Optional file containing logic for awk to execute. If you don't + wish to use a file, you can use `ext.args2` to specify the logic. + pattern: "*" + ontologies: [] + - disable_redirect_output: + type: boolean + description: Disable the redirection of awk output to a given file. This is + useful if you want to use awk's built-in redirect to write files instead + of the shell's redirect. output: - - output: - - meta: + output: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.${suffix}": type: file - description: The output file - if using shell redirection, specify the name of this - file using `ext.prefix` and the extension using `ext.suffix`. Otherwise, ensure - the awk program produces files with the extension in `ext.suffix`. + description: The output file - if using shell redirection, specify the + name of this file using `ext.prefix` and the extension using + `ext.suffix`. Otherwise, ensure the awk program produces files with + the extension in `ext.suffix`. pattern: "*" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gawk: + - - ${task.process}: + type: string + description: The name of the process + - gawk: + type: string + description: The name of the tool + - awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - gawk: + type: string + description: The name of the tool + - awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//': + type: eval + description: The expression to obtain the version of the tool authors: - "@nvnieuwk" maintainers: diff --git a/modules/nf-core/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index 3ffc8e9264..6edffc5930 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -3,7 +3,7 @@ process GUNZIP { label 'process_single' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" @@ -12,15 +12,16 @@ process GUNZIP { output: tuple val(meta), path("${gunzip}"), emit: gunzip - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gunzip'), eval('gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//"'), topic: versions, emit: versions_gunzip when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def extension = (archive.toString() - '.gz').tokenize('.')[-1] - def name = archive.toString() - '.gz' - ".${extension}" + def nameWithoutGz = archive.extension == 'gz' ? archive.baseName : archive.name + def extension = file(nameWithoutGz).extension + def name = file(nameWithoutGz).baseName def prefix = task.ext.prefix ?: name gunzip = prefix + ".${extension}" """ @@ -32,24 +33,15 @@ process GUNZIP { ${args} \\ ${archive} \\ > ${gunzip} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: - def args = task.ext.args ?: '' - def extension = (archive.toString() - '.gz').tokenize('.')[-1] - def name = archive.toString() - '.gz' - ".${extension}" + def nameWithoutGz = archive.extension == 'gz' ? archive.baseName : archive.name + def extension = file(nameWithoutGz).extension + def name = file(nameWithoutGz).baseName def prefix = task.ext.prefix ?: name gunzip = prefix + ".${extension}" """ touch ${gunzip} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gunzip/meta.yml b/modules/nf-core/gunzip/meta.yml index 69d3102455..bba6b3ba70 100644 --- a/modules/nf-core/gunzip/meta.yml +++ b/modules/nf-core/gunzip/meta.yml @@ -21,21 +21,42 @@ input: type: file description: File to be compressed/uncompressed pattern: "*.*" + ontologies: [] output: - - gunzip: - - meta: + gunzip: + - - meta: type: file description: Compressed/uncompressed file pattern: "*.*" + ontologies: [] - ${gunzip}: type: file description: Compressed/uncompressed file pattern: "*.*" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_gunzip: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + 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 + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/spring/decompress/main.nf b/modules/nf-core/spring/decompress/main.nf index 86ced26906..585fc57792 100644 --- a/modules/nf-core/spring/decompress/main.nf +++ b/modules/nf-core/spring/decompress/main.nf @@ -3,9 +3,9 @@ process SPRING_DECOMPRESS { label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/spring:1.1.1--h4ac6f70_2' : - 'biocontainers/spring:1.1.1--h4ac6f70_2' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f6/f67f27c8cb2d1a149564f1a10f5f2b7a6acfa87ef3d3d27d2d8752dbe95e6acf/data' : + 'community.wave.seqera.io/library/spring:1.1.1--911a17b4ccfb85ee' }" input: tuple val(meta), path(spring) @@ -13,7 +13,8 @@ process SPRING_DECOMPRESS { output: tuple val(meta), path("*.fastq.gz"), emit: fastq - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('spring'), val('1.1.1'), topic: versions, emit: versions_spring + // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. when: task.ext.when == null || task.ext.when @@ -21,9 +22,7 @@ process SPRING_DECOMPRESS { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. def output = write_one_fastq_gz ? "-o ${prefix}.fastq.gz" : "-o ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz" - """ spring \\ -d \\ @@ -32,23 +31,12 @@ process SPRING_DECOMPRESS { $args \\ -i ${spring} \\ ${output} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - spring: ${VERSION} - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = '1.1.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. def output = write_one_fastq_gz ? "echo '' | gzip > ${prefix}.fastq.gz" : "echo '' | gzip > ${prefix}_R1.fastq.gz; echo '' | gzip > ${prefix}_R2.fastq.gz" """ ${output} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - spring: ${VERSION} - END_VERSIONS """ } diff --git a/modules/nf-core/spring/decompress/meta.yml b/modules/nf-core/spring/decompress/meta.yml index 72b72b75da..e41c4bf901 100644 --- a/modules/nf-core/spring/decompress/meta.yml +++ b/modules/nf-core/spring/decompress/meta.yml @@ -24,14 +24,15 @@ input: type: file description: Spring file to decompress. pattern: "*.{spring}" - - - write_one_fastq_gz: - type: boolean - description: | - Controls whether spring should write one fastq.gz file with reads from both directions or two fastq.gz files with reads from distinct directions - pattern: "true or false" + ontologies: [] + - write_one_fastq_gz: + type: boolean + description: | + Controls whether spring should write one fastq.gz file with reads from both directions or two fastq.gz files with reads from distinct directions + pattern: "true or false" output: - - fastq: - - meta: + fastq: + - - meta: type: map description: | Groovy Map containing sample information @@ -40,11 +41,28 @@ output: type: file description: Decompressed FASTQ file(s). pattern: "*.{fastq.gz}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_spring: + - - ${task.process}: + type: string + description: The name of the process + - spring: + type: string + description: The name of the tool + - 1.1.1: + type: string + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - spring: + type: string + description: The name of the tool + - 1.1.1: + type: string + description: The expression to obtain the version of the tool authors: - "@xec-cm" maintainers: diff --git a/modules/nf-core/untar/main.nf b/modules/nf-core/untar/main.nf index e712ebe63a..bf2c056c62 100644 --- a/modules/nf-core/untar/main.nf +++ b/modules/nf-core/untar/main.nf @@ -3,7 +3,7 @@ process UNTAR { label 'process_single' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" @@ -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 1b6bf491e6..571d8078a4 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 @@ -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/unzip/main.nf b/modules/nf-core/unzip/main.nf index a0c02109cd..eb020ba13f 100644 --- a/modules/nf-core/unzip/main.nf +++ b/modules/nf-core/unzip/main.nf @@ -3,16 +3,16 @@ process UNZIP { label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/p7zip:16.02' : - 'biocontainers/p7zip:16.02' }" + 'quay.io/biocontainers/p7zip:16.02' }" input: tuple val(meta), path(archive) output: tuple val(meta), path("${prefix}/"), emit: unzipped_archive - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('7za'), eval("7za 2>&1 | sed -n '2s/^.* \\([0-9.]*\\) .*/\\1/p'"), topic: versions, emit: versions_7za when: task.ext.when == null || task.ext.when @@ -27,23 +27,12 @@ process UNZIP { -o"${prefix}"/ \\ $args \\ $archive - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') - END_VERSIONS """ 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) """ mkdir "${prefix}" - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - 7za: \$(echo \$(7za --help) | sed 's/.*p7zip Version //; s/(.*//') - END_VERSIONS """ } diff --git a/modules/nf-core/unzip/meta.yml b/modules/nf-core/unzip/meta.yml index ba1eb9129b..1c645556f7 100644 --- a/modules/nf-core/unzip/meta.yml +++ b/modules/nf-core/unzip/meta.yml @@ -7,12 +7,13 @@ keywords: - archiving tools: - unzip: - description: p7zip is a quick port of 7z.exe and 7za.exe (command line version - of 7zip, see www.7-zip.org) for Unix. + description: p7zip is a quick port of 7z.exe and 7za.exe (command line + version of 7zip, see www.7-zip.org) for Unix. homepage: https://sourceforge.net/projects/p7zip/ documentation: https://sourceforge.net/projects/p7zip/ tool_dev_url: https://sourceforge.net/projects/p7zip" - licence: ["LGPL-2.1-or-later"] + licence: + - "LGPL-2.1-or-later" identifier: "" input: - - meta: @@ -25,7 +26,7 @@ input: description: ZIP file pattern: "*.zip" ontologies: - - edam: http://edamontology.org/format_3987 # ZIP format + - edam: http://edamontology.org/format_3987 output: unzipped_archive: - - meta: @@ -37,13 +38,27 @@ output: type: directory description: Directory contents of the unzipped archive pattern: "${archive.baseName}/" + versions_7za: + - - ${task.process}: + type: string + description: The name of the process + - 7za: + type: string + description: The name of the tool + - 7za 2>&1 | sed -n '2s/^.* \([0-9.]*\) .*/\1/p': + 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 + - 7za: + type: string + description: The name of the tool + - 7za 2>&1 | sed -n '2s/^.* \([0-9.]*\) .*/\1/p': + type: eval + description: The expression to obtain the version of the tool authors: - "@jfy133" maintainers: diff --git a/subworkflows/local/bam_convert_samtools/main.nf b/subworkflows/local/bam_convert_samtools/main.nf index d101f34b45..56ee28f72b 100644 --- a/subworkflows/local/bam_convert_samtools/main.nf +++ b/subworkflows/local/bam_convert_samtools/main.nf @@ -60,7 +60,6 @@ workflow BAM_CONVERT_SAMTOOLS { reads = CAT_FASTQ.out.reads // Gather versions of all tools used - versions = versions.mix(CAT_FASTQ.out.versions) versions = versions.mix(COLLATE_FASTQ_MAP.out.versions) versions = versions.mix(COLLATE_FASTQ_UNMAP.out.versions) versions = versions.mix(SAMTOOLS_MERGE_UNMAP.out.versions) diff --git a/subworkflows/local/bam_variant_calling_mpileup/main.nf b/subworkflows/local/bam_variant_calling_mpileup/main.nf index d46aa77b1b..125a4a4684 100644 --- a/subworkflows/local/bam_variant_calling_mpileup/main.nf +++ b/subworkflows/local/bam_variant_calling_mpileup/main.nf @@ -75,7 +75,6 @@ workflow BAM_VARIANT_CALLING_MPILEUP { .map { meta, tbi -> [meta - meta.subMap('num_intervals') + [variantcaller: 'bcftools'], tbi] } versions = versions.mix(SAMTOOLS_MPILEUP.out.versions) - versions = versions.mix(CAT_MPILEUP.out.versions) emit: mpileup diff --git a/subworkflows/local/fastq_align/main.nf b/subworkflows/local/fastq_align/main.nf index f6e5f8a6ec..2c711a8259 100644 --- a/subworkflows/local/fastq_align/main.nf +++ b/subworkflows/local/fastq_align/main.nf @@ -19,7 +19,6 @@ workflow FASTQ_ALIGN { main: - versions = channel.empty() reports = channel.empty() // Only one of the following should be run @@ -42,13 +41,8 @@ workflow FASTQ_ALIGN { // Gather reports of all tools used reports = reports.mix(DRAGMAP_ALIGN.out.log) - // Gather versions of all tools used - versions = versions.mix(BWAMEM1_MEM.out.versions) - versions = versions.mix(BWAMEM2_MEM.out.versions) - versions = versions.mix(DRAGMAP_ALIGN.out.versions) emit: bam // channel: [ [meta], bam ] bai // channel: [ [meta], bai ] reports - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf b/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf index 68851c58b7..f173a52108 100644 --- a/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf +++ b/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf @@ -73,10 +73,6 @@ workflow FASTQ_CREATE_UMI_CONSENSUS_FGBIO { CALLUMICONSENSUS(GROUPREADSBYUMI.out.bam, call_min_reads, call_min_baseq) ch_versions = ch_versions.mix(BAM2FASTQ.out.versions) - ch_versions = ch_versions.mix(ALIGN_UMI.out.versions) - ch_versions = ch_versions.mix(CALLUMICONSENSUS.out.versions) - ch_versions = ch_versions.mix(FASTQTOBAM.out.versions) - ch_versions = ch_versions.mix(GROUPREADSBYUMI.out.versions) ch_versions = ch_versions.mix(MERGE_CONSENSUS.out.versions) emit: diff --git a/subworkflows/local/fastq_preprocess_gatk/main.nf b/subworkflows/local/fastq_preprocess_gatk/main.nf index cbce80043e..df793c1de8 100644 --- a/subworkflows/local/fastq_preprocess_gatk/main.nf +++ b/subworkflows/local/fastq_preprocess_gatk/main.nf @@ -109,8 +109,7 @@ workflow FASTQ_PREPROCESS_GATK { save_trimmed_fail = false save_merged = false FASTP( - reads_for_fastp, - [], // we are not using any adapter fastas at the moment + reads_for_fastp.map { meta, reads -> [ meta, reads, [] ] }, // adapter_fasta folded into the reads tuple (unused) false, // we don't use discard_trimmed_pass at the moment save_trimmed_fail, save_merged @@ -126,7 +125,6 @@ workflow FASTQ_PREPROCESS_GATK { }.transpose() } else reads_for_bbsplit = FASTP.out.reads - versions = versions.mix(FASTP.out.versions) } else { reads_for_bbsplit = reads_for_fastp @@ -182,7 +180,6 @@ workflow FASTQ_PREPROCESS_GATK { FGBIO_COPYUMIFROMREADNAME(FASTQ_ALIGN.out.bam.map{meta, bam -> [meta, bam, []]}) aligned_bam = FGBIO_COPYUMIFROMREADNAME.out.bam aligned_bai = FGBIO_COPYUMIFROMREADNAME.out.bai - versions = versions.mix(FGBIO_COPYUMIFROMREADNAME.out.versions) } else { aligned_bam = FASTQ_ALIGN.out.bam aligned_bai = FASTQ_ALIGN.out.bai @@ -250,8 +247,6 @@ workflow FASTQ_PREPROCESS_GATK { versions = versions.mix(BAM_TO_CRAM_MAPPING.out.versions) } - // Gather used softwares versions - versions = versions.mix(FASTQ_ALIGN.out.versions) } if (params.step in ['mapping', 'markduplicates']) { @@ -270,7 +265,6 @@ workflow FASTQ_PREPROCESS_GATK { if(params.step == 'markduplicates' && params.umi_in_read_header) { FGBIO_COPYUMIFROMREADNAME(cram_for_markduplicates.map{ meta, bam -> [ meta, bam, [] ] }) cram_for_markduplicates = FGBIO_COPYUMIFROMREADNAME.out.bam - versions = versions.mix(FGBIO_COPYUMIFROMREADNAME.out.versions) } // if no MD is done, then run QC on mapped & converted CRAM files diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 195355676e..5193807d1d 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -64,7 +64,6 @@ workflow PREPARE_GENOME { if (!bwa_in && (aligner == "bwa-mem" || aligner == "sentieon-bwamem" || aligner == "parabricks")) { BWAMEM1_INDEX(fasta) index_alignment = BWAMEM1_INDEX.out.index.collect() - versions = versions.mix(BWAMEM1_INDEX.out.versions) } else if (aligner == "bwa-mem" || aligner == "sentieon-bwamem" || aligner == "parabricks") { index_alignment = channel.fromPath(bwa_in).map { index -> [[id: 'bwa'], index] }.collect() @@ -72,7 +71,6 @@ workflow PREPARE_GENOME { else if (!bwamem2_in && aligner == 'bwa-mem2') { BWAMEM2_INDEX(fasta) index_alignment = BWAMEM2_INDEX.out.index.collect() - versions = versions.mix(BWAMEM2_INDEX.out.versions) } else if (aligner == 'bwa-mem2') { index_alignment = channel.fromPath(bwamem2_in).map { index -> [[id: 'bwamem2'], index] }.collect() @@ -80,7 +78,6 @@ workflow PREPARE_GENOME { else if (!dragmap_in && aligner == 'dragmap') { DRAGMAP_HASHTABLE(fasta) index_alignment = DRAGMAP_HASHTABLE.out.hashmap.collect() - versions = versions.mix(DRAGMAP_HASHTABLE.out.versions) } else if (aligner == 'dragmap') { index_alignment = channel.fromPath(dragmap_in).map { index -> [[id: 'dragmap'], index] }.collect() @@ -120,7 +117,6 @@ workflow PREPARE_GENOME { // Use user-provided bbsplit index if (bbsplit_index_in.endsWith('.tar.gz')) { bbsplit_index = UNTAR_BBSPLIT_INDEX([[id: 'bbsplit_index'], file(bbsplit_index_in, checkIfExists: true)]).untar.map { _meta, index -> index } - versions = versions.mix(UNTAR_BBSPLIT_INDEX.out.versions) } else { bbsplit_index = channel.value(file(bbsplit_index_in, checkIfExists: true)) @@ -210,7 +206,6 @@ workflow PREPARE_GENOME { if (msisensor2_models_in && msisensor2_models_in.endsWith(".tar.gz") && tools.split(',').contains('msisensor2')) { UNTAR_MSISENSOR2_MODELS(channel.fromPath(file(msisensor2_models_in)).map { archive -> [[id: archive.baseName], archive] }) msisensor2_models = UNTAR_MSISENSOR2_MODELS.out.untar.collect() - versions = versions.mix(UNTAR_MSISENSOR2_MODELS.out.versions) } else if (msisensor2_models_in && tools.split(',').contains('msisensor2')) { msisensor2_models = channel.fromPath(msisensor2_models_in).map { model -> [[id:model.baseName], model] }.collect() @@ -238,7 +233,6 @@ workflow PREPARE_GENOME { else if (ascat_alleles_in.endsWith(".zip") && tools.split(',').contains('ascat')) { UNZIP_ALLELES(channel.fromPath(file(ascat_alleles_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_alleles = UNZIP_ALLELES.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() - versions = versions.mix(UNZIP_ALLELES.out.versions) } else { ascat_alleles = channel.fromPath(ascat_alleles_in).collect() @@ -250,7 +244,6 @@ workflow PREPARE_GENOME { else if (ascat_loci_in.endsWith(".zip") && tools.split(',').contains('ascat')) { UNZIP_LOCI(channel.fromPath(file(ascat_loci_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_loci = UNZIP_LOCI.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() - versions = versions.mix(UNZIP_LOCI.out.versions) } else { ascat_loci = channel.fromPath(ascat_loci_in).collect() @@ -262,7 +255,6 @@ workflow PREPARE_GENOME { else if (ascat_loci_gc_in.endsWith(".zip") && tools.split(',').contains('ascat')) { UNZIP_GC(channel.fromPath(file(ascat_loci_gc_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_loci_gc = UNZIP_GC.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() - versions = versions.mix(UNZIP_GC.out.versions) } else { ascat_loci_gc = channel.fromPath(ascat_loci_gc_in).collect() @@ -274,7 +266,6 @@ workflow PREPARE_GENOME { else if (ascat_loci_rt_in.endsWith(".zip") && tools.split(',').contains('ascat')) { UNZIP_RT(channel.fromPath(file(ascat_loci_rt_in)).map { archive -> [[id: archive.baseName], archive] }) ascat_loci_rt = UNZIP_RT.out.unzipped_archive.map { _meta, extracted_archive -> extracted_archive }.collect() - versions = versions.mix(UNZIP_RT.out.versions) } else { ascat_loci_rt = channel.fromPath(ascat_loci_rt_in).collect() @@ -286,7 +277,6 @@ workflow PREPARE_GENOME { else if (chr_dir_in.endsWith(".tar.gz") && tools.split(',').contains('controlfreec')) { UNTAR_CHR_DIR(channel.fromPath(file(chr_dir_in)).map { archive -> [[id: archive.baseName], archive] }) chr_dir = UNTAR_CHR_DIR.out.untar.map { _meta, extracted_archive -> extracted_archive }.collect() - versions = versions.mix(UNTAR_CHR_DIR.out.versions) } else { chr_dir = channel.fromPath(chr_dir_in).collect() diff --git a/subworkflows/local/prepare_intervals/main.nf b/subworkflows/local/prepare_intervals/main.nf index 6973896efb..55bf2e233a 100644 --- a/subworkflows/local/prepare_intervals/main.nf +++ b/subworkflows/local/prepare_intervals/main.nf @@ -47,7 +47,6 @@ workflow PREPARE_INTERVALS { intervals_bed = CREATE_INTERVALS_BED.out.bed - versions = versions.mix(BUILD_INTERVALS.out.versions) versions = versions.mix(CREATE_INTERVALS_BED.out.versions) } else { intervals_combined = channel.fromPath(file(intervals)).map{bed -> [ [ id:bed.baseName ], bed ] } diff --git a/tests/aligner-bwa-mem.nf.test.snap b/tests/aligner-bwa-mem.nf.test.snap index fb1f52fe06..0ca5918bbd 100644 --- a/tests/aligner-bwa-mem.nf.test.snap +++ b/tests/aligner-bwa-mem.nf.test.snap @@ -7,11 +7,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -90,7 +90,7 @@ 5, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -141,7 +141,7 @@ 5, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -207,11 +207,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/aligner-bwa-mem2.nf.test.snap b/tests/aligner-bwa-mem2.nf.test.snap index d03b12f392..da63c14f1b 100644 --- a/tests/aligner-bwa-mem2.nf.test.snap +++ b/tests/aligner-bwa-mem2.nf.test.snap @@ -74,7 +74,7 @@ }, "BWAMEM2_MEM": { "bwamem2": "2.2.1", - "samtools": 1.21 + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -211,7 +211,7 @@ }, "BWAMEM2_MEM": { "bwamem2": "2.2.1", - "samtools": 1.21 + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/aligner-parabricks.nf.test.snap b/tests/aligner-parabricks.nf.test.snap index 1cd537c5ed..bcd4637927 100644 --- a/tests/aligner-parabricks.nf.test.snap +++ b/tests/aligner-parabricks.nf.test.snap @@ -4,7 +4,7 @@ 15, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CRAM_TO_BAM": { "samtools": 1.21 @@ -237,7 +237,7 @@ 14, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -476,7 +476,7 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CALCULATECONTAMINATION": { "gatk4": "4.6.2.0" @@ -797,7 +797,7 @@ 13, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/alignment_from_everything.nf.test.snap b/tests/alignment_from_everything.nf.test.snap index a01f7e60cc..14e2c4a9d6 100644 --- a/tests/alignment_from_everything.nf.test.snap +++ b/tests/alignment_from_everything.nf.test.snap @@ -4,14 +4,14 @@ 61, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CAT_FASTQ": { - "cat": 9.5 + "cat": "9.5" }, "COLLATE_FASTQ_MAP": { "samtools": 1.21 diff --git a/tests/alignment_to_fastq.nf.test.snap b/tests/alignment_to_fastq.nf.test.snap index 605d3e424f..7511faf85a 100644 --- a/tests/alignment_to_fastq.nf.test.snap +++ b/tests/alignment_to_fastq.nf.test.snap @@ -4,14 +4,14 @@ 25, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CAT_FASTQ": { - "cat": 9.5 + "cat": "9.5" }, "COLLATE_FASTQ_MAP": { "samtools": 1.21 diff --git a/tests/bbsplit.nf.test.snap b/tests/bbsplit.nf.test.snap index 28b1cfe2b9..f465be1784 100644 --- a/tests/bbsplit.nf.test.snap +++ b/tests/bbsplit.nf.test.snap @@ -13,11 +13,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -377,11 +377,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -601,14 +601,14 @@ "bbmap": "39.18" }, "BUILD_INTERVALS": { - "gawk": "5.3.0" + "gawk": "5.3.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 4a3e6a3bf0..c578704c66 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -7,11 +7,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -334,11 +334,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/fastp.nf.test.snap b/tests/fastp.nf.test.snap index 25e72cefa1..111b6110ba 100644 --- a/tests/fastp.nf.test.snap +++ b/tests/fastp.nf.test.snap @@ -4,17 +4,17 @@ 20, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "FASTP": { - "fastp": "0.24.0" + "fastp": "1.1.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -235,10 +235,10 @@ "preprocessing", "preprocessing/fastp", "preprocessing/fastp/test", - "preprocessing/fastp/test/test-test_L1_1.fastp.fastq.gz", - "preprocessing/fastp/test/test-test_L1_2.fastp.fastq.gz", - "preprocessing/fastp/test/test-test_L2_1.fastp.fastq.gz", - "preprocessing/fastp/test/test-test_L2_2.fastp.fastq.gz", + "preprocessing/fastp/test/test-test_L1_R1.fastp.fastq.gz", + "preprocessing/fastp/test/test-test_L1_R2.fastp.fastq.gz", + "preprocessing/fastp/test/test-test_L2_R1.fastp.fastq.gz", + "preprocessing/fastp/test/test-test_L2_R2.fastp.fastq.gz", "preprocessing/markduplicates", "preprocessing/markduplicates/test", "preprocessing/markduplicates/test/test.md.cram", @@ -320,7 +320,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,d97ac04e524b20bf9d261c009ac92b6a", "mosdepth_perchrom.txt:md5,29af8f8744a88e2ec0486292d541559f", "multiqc_citations.txt:md5,0e2971e7a873c92592112775fa99fb02", - "multiqc_fastp.txt:md5,2f22f6c961e432974f27a4e56d877cec", + "multiqc_fastp.txt:md5,39b27871814457c42ea33aa131b8ecfc", "multiqc_fastqc.txt:md5,bde0d0bffa62228b33fb68b7e25b6ff8", "picard_MarkIlluminaAdapters_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", @@ -329,12 +329,12 @@ "samtools-stats-dp.txt:md5,58ea8c88565a359af678aa588e44895c", "samtools_alignment_plot.txt:md5,aac925e42c9da438ab9f0fb7ae77e2fa", "samtools_insert_size.txt:md5,9eccc96ce006c0161497782ed3afc147", - "test-test_L1_1.fastp.fastq.gz:md5,f1a5c524cae7be9b5ca9a4138f847cfa", - "test-test_L1_2.fastp.fastq.gz:md5,e366994a1db55b5ed3cd12482f33cee7", - "test-test_L2_1.fastp.fastq.gz:md5,f1a5c524cae7be9b5ca9a4138f847cfa", - "test-test_L2_2.fastp.fastq.gz:md5,e366994a1db55b5ed3cd12482f33cee7", - "test-test_L1.fastp.json:md5,fb88c7b5807f6c7478b01baddf8ca4e8", - "test-test_L2.fastp.json:md5,708187bd90c12b1c8c3fa7046b69dc35", + "test-test_L1_R1.fastp.fastq.gz:md5,f1a5c524cae7be9b5ca9a4138f847cfa", + "test-test_L1_R2.fastp.fastq.gz:md5,e366994a1db55b5ed3cd12482f33cee7", + "test-test_L2_R1.fastp.fastq.gz:md5,f1a5c524cae7be9b5ca9a4138f847cfa", + "test-test_L2_R2.fastp.fastq.gz:md5,e366994a1db55b5ed3cd12482f33cee7", + "test-test_L1.fastp.json:md5,80fa7cc86ef9fa02eeb9c9d25c6f2672", + "test-test_L2.fastp.json:md5,138a8dbd84d89dcf19c303fdc05754e9", "test.md.mosdepth.global.dist.txt:md5,b1c26e3381f220e65d683048ab6b6e2a", "test.md.mosdepth.region.dist.txt:md5,02d51752367e753a6984c12f059499ba", "test.md.mosdepth.summary.txt:md5,f18e776c3ee8e6947c3a69c136f54860", @@ -367,17 +367,17 @@ 26, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "FASTP": { - "fastp": "0.24.0" + "fastp": "1.1.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -598,22 +598,22 @@ "preprocessing", "preprocessing/fastp", "preprocessing/fastp/test", - "preprocessing/fastp/test/0001.test-test_L1_1.fastp.fastq.gz", - "preprocessing/fastp/test/0001.test-test_L1_2.fastp.fastq.gz", - "preprocessing/fastp/test/0001.test-test_L2_1.fastp.fastq.gz", - "preprocessing/fastp/test/0001.test-test_L2_2.fastp.fastq.gz", - "preprocessing/fastp/test/0002.test-test_L1_1.fastp.fastq.gz", - "preprocessing/fastp/test/0002.test-test_L1_2.fastp.fastq.gz", - "preprocessing/fastp/test/0002.test-test_L2_1.fastp.fastq.gz", - "preprocessing/fastp/test/0002.test-test_L2_2.fastp.fastq.gz", - "preprocessing/fastp/test/0003.test-test_L1_1.fastp.fastq.gz", - "preprocessing/fastp/test/0003.test-test_L1_2.fastp.fastq.gz", - "preprocessing/fastp/test/0003.test-test_L2_1.fastp.fastq.gz", - "preprocessing/fastp/test/0003.test-test_L2_2.fastp.fastq.gz", - "preprocessing/fastp/test/0004.test-test_L1_1.fastp.fastq.gz", - "preprocessing/fastp/test/0004.test-test_L1_2.fastp.fastq.gz", - "preprocessing/fastp/test/0004.test-test_L2_1.fastp.fastq.gz", - "preprocessing/fastp/test/0004.test-test_L2_2.fastp.fastq.gz", + "preprocessing/fastp/test/0001.test-test_L1_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0001.test-test_L1_R2.fastp.fastq.gz", + "preprocessing/fastp/test/0001.test-test_L2_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0001.test-test_L2_R2.fastp.fastq.gz", + "preprocessing/fastp/test/0002.test-test_L1_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0002.test-test_L1_R2.fastp.fastq.gz", + "preprocessing/fastp/test/0002.test-test_L2_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0002.test-test_L2_R2.fastp.fastq.gz", + "preprocessing/fastp/test/0003.test-test_L1_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0003.test-test_L1_R2.fastp.fastq.gz", + "preprocessing/fastp/test/0003.test-test_L2_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0003.test-test_L2_R2.fastp.fastq.gz", + "preprocessing/fastp/test/0004.test-test_L1_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0004.test-test_L1_R2.fastp.fastq.gz", + "preprocessing/fastp/test/0004.test-test_L2_R1.fastp.fastq.gz", + "preprocessing/fastp/test/0004.test-test_L2_R2.fastp.fastq.gz", "preprocessing/markduplicates", "preprocessing/markduplicates/test", "preprocessing/markduplicates/test/test.md.cram", @@ -695,7 +695,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,722e8c7583dd52b2c8d8bb923718c912", "mosdepth_perchrom.txt:md5,b9304bb6dee33d25255e19693c0a4dd8", "multiqc_citations.txt:md5,0e2971e7a873c92592112775fa99fb02", - "multiqc_fastp.txt:md5,758582c0fafe6e69ad8488eb612008de", + "multiqc_fastp.txt:md5,e5a4f17bb627d529e829f11fda3bddc3", "multiqc_fastqc.txt:md5,bde0d0bffa62228b33fb68b7e25b6ff8", "picard_MarkIlluminaAdapters_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", @@ -704,24 +704,24 @@ "samtools-stats-dp.txt:md5,93ec69f6db74d9de7e4a549491ae2c73", "samtools_alignment_plot.txt:md5,962b7dd27f48ec4bbb668c8c32cbea1b", "samtools_insert_size.txt:md5,555c4ca8aac120c3b23e6cd2457922cd", - "0001.test-test_L1_1.fastp.fastq.gz:md5,f379a60cc2a41f39fa0c0d23edf6eb61", - "0001.test-test_L1_2.fastp.fastq.gz:md5,e54d912158088d98f8083854079e1f5c", - "0001.test-test_L2_1.fastp.fastq.gz:md5,f379a60cc2a41f39fa0c0d23edf6eb61", - "0001.test-test_L2_2.fastp.fastq.gz:md5,e54d912158088d98f8083854079e1f5c", - "0002.test-test_L1_1.fastp.fastq.gz:md5,366180a220f6b78c55b1b23b35dc7f96", - "0002.test-test_L1_2.fastp.fastq.gz:md5,66ca650f883997310858acac94c8d236", - "0002.test-test_L2_1.fastp.fastq.gz:md5,366180a220f6b78c55b1b23b35dc7f96", - "0002.test-test_L2_2.fastp.fastq.gz:md5,66ca650f883997310858acac94c8d236", - "0003.test-test_L1_1.fastp.fastq.gz:md5,46bc09415a26d50230163e613cb1324b", - "0003.test-test_L1_2.fastp.fastq.gz:md5,500404ef12d7c6f02eb3b5367f84a978", - "0003.test-test_L2_1.fastp.fastq.gz:md5,46bc09415a26d50230163e613cb1324b", - "0003.test-test_L2_2.fastp.fastq.gz:md5,500404ef12d7c6f02eb3b5367f84a978", - "0004.test-test_L1_1.fastp.fastq.gz:md5,f3b1d77aa32f019f3088810cac2605e9", - "0004.test-test_L1_2.fastp.fastq.gz:md5,e38c0529e6ba0abce221ac39c84263b0", - "0004.test-test_L2_1.fastp.fastq.gz:md5,f3b1d77aa32f019f3088810cac2605e9", - "0004.test-test_L2_2.fastp.fastq.gz:md5,e38c0529e6ba0abce221ac39c84263b0", - "test-test_L1.fastp.json:md5,2f72ca9fa3c55cfd4ff67a747f7c2e46", - "test-test_L2.fastp.json:md5,f8b183e541878de7b24e555e23e078f1", + "0001.test-test_L1_R1.fastp.fastq.gz:md5,f379a60cc2a41f39fa0c0d23edf6eb61", + "0001.test-test_L1_R2.fastp.fastq.gz:md5,e54d912158088d98f8083854079e1f5c", + "0001.test-test_L2_R1.fastp.fastq.gz:md5,f379a60cc2a41f39fa0c0d23edf6eb61", + "0001.test-test_L2_R2.fastp.fastq.gz:md5,e54d912158088d98f8083854079e1f5c", + "0002.test-test_L1_R1.fastp.fastq.gz:md5,366180a220f6b78c55b1b23b35dc7f96", + "0002.test-test_L1_R2.fastp.fastq.gz:md5,66ca650f883997310858acac94c8d236", + "0002.test-test_L2_R1.fastp.fastq.gz:md5,366180a220f6b78c55b1b23b35dc7f96", + "0002.test-test_L2_R2.fastp.fastq.gz:md5,66ca650f883997310858acac94c8d236", + "0003.test-test_L1_R1.fastp.fastq.gz:md5,46bc09415a26d50230163e613cb1324b", + "0003.test-test_L1_R2.fastp.fastq.gz:md5,500404ef12d7c6f02eb3b5367f84a978", + "0003.test-test_L2_R1.fastp.fastq.gz:md5,46bc09415a26d50230163e613cb1324b", + "0003.test-test_L2_R2.fastp.fastq.gz:md5,500404ef12d7c6f02eb3b5367f84a978", + "0004.test-test_L1_R1.fastp.fastq.gz:md5,f3b1d77aa32f019f3088810cac2605e9", + "0004.test-test_L1_R2.fastp.fastq.gz:md5,e38c0529e6ba0abce221ac39c84263b0", + "0004.test-test_L2_R1.fastp.fastq.gz:md5,f3b1d77aa32f019f3088810cac2605e9", + "0004.test-test_L2_R2.fastp.fastq.gz:md5,e38c0529e6ba0abce221ac39c84263b0", + "test-test_L1.fastp.json:md5,34c54addc091d14c6c9582ef2ed16a85", + "test-test_L2.fastp.json:md5,607e27e248389ec266eecc847c6f9936", "test.md.mosdepth.global.dist.txt:md5,e5d0c6bf323c32f5414bd48b90bb32fa", "test.md.mosdepth.region.dist.txt:md5,5062f8b7bb536c9b77a68f4ccd2315c2", "test.md.mosdepth.summary.txt:md5,455358d5943fd1e5f09853acff3e50b6", @@ -754,17 +754,17 @@ 20, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "FASTP": { - "fastp": "0.24.0" + "fastp": "1.1.0" }, "FASTQC": { "fastqc": "0.12.1" @@ -1064,7 +1064,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,caee7b9e5d1a451970f87d791c3e450b", "mosdepth_perchrom.txt:md5,a0990e98cdd2cd5540d07f504f516ccf", "multiqc_citations.txt:md5,0e2971e7a873c92592112775fa99fb02", - "multiqc_fastp.txt:md5,2e4305ae77790e1948c19acc778b508c", + "multiqc_fastp.txt:md5,8c270b44aaec9ee1bd7bf19d2150a51e", "multiqc_fastqc.txt:md5,bde0d0bffa62228b33fb68b7e25b6ff8", "picard_MarkIlluminaAdapters_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", @@ -1073,8 +1073,8 @@ "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", - "test-test_L1.fastp.json:md5,ced0232bc3be313b392a9f59ff970cc2", - "test-test_L2.fastp.json:md5,d05b922b85ecd0e087ba05af543f8ff8", + "test-test_L1.fastp.json:md5,a7746b05c3ffb374c8f5d204f971879e", + "test-test_L2.fastp.json:md5,d896569d921616f61a829b62477c1ffa", "test.md.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", diff --git a/tests/intervals.nf.test.snap b/tests/intervals.nf.test.snap index d7af934a8a..d4af6db508 100644 --- a/tests/intervals.nf.test.snap +++ b/tests/intervals.nf.test.snap @@ -7,14 +7,14 @@ "samtools": 1.21 }, "BUILD_INTERVALS": { - "gawk": "5.3.0" + "gawk": "5.3.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -91,11 +91,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -153,11 +153,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -211,11 +211,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -264,11 +264,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -321,14 +321,14 @@ "samtools": 1.21 }, "BUILD_INTERVALS": { - "gawk": "5.3.0" + "gawk": "5.3.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/joint_calling_mutect2.nf.test.snap b/tests/joint_calling_mutect2.nf.test.snap index 794d5c6ed3..6721c744eb 100644 --- a/tests/joint_calling_mutect2.nf.test.snap +++ b/tests/joint_calling_mutect2.nf.test.snap @@ -238,7 +238,7 @@ "bcftools": "1.23.1" }, "BUILD_INTERVALS": { - "gawk": "5.3.0" + "gawk": "5.3.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/lane_integer.nf.test.snap b/tests/lane_integer.nf.test.snap index 19bd1a0e5f..e6d0a7f91a 100644 --- a/tests/lane_integer.nf.test.snap +++ b/tests/lane_integer.nf.test.snap @@ -7,11 +7,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/multi_lane.nf.test.snap b/tests/multi_lane.nf.test.snap index a9541143a4..334e9fbdbe 100644 --- a/tests/multi_lane.nf.test.snap +++ b/tests/multi_lane.nf.test.snap @@ -7,11 +7,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -125,17 +125,17 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CALLUMICONSENSUS": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "CAT_FASTQ": { - "cat": 9.5 + "cat": "9.5" }, "COLLATE_FASTQ_MAP": { "samtools": 1.21 @@ -147,13 +147,13 @@ "gawk": "5.3.0" }, "FASTQTOBAM": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_INTERVALLISTTOBED": { "gatk4": "4.6.2.0" }, "GROUPREADSBYUMI": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "INDEX_MERGE_BAM": { "samtools": 1.21 @@ -203,16 +203,18 @@ "reference", "reports", "reports/umi", - "reports/umi/test_umi-grouped_histogram.txt" + "reports/umi/test_umi-grouped_histogram.txt", + "reports/umi/test_umi-grouped_read-metrics.txt" ], [ - "test_umi-grouped_histogram.txt:md5,47440eca0cc1e70be22fe2a2ce81dfbf" + "test_umi-grouped_histogram.txt:md5,4e3bc8b3ed89ddf32ee3543af98f1033", + "test_umi-grouped_read-metrics.txt:md5,c0319b6e16385163f66b647091a48550" ], [ - "test_umi-consensus.bam:md5,122d60b069b76a217b6fe91d1765dae3" + "test_umi-consensus.bam:md5,d77fca0cc9d628d9966556d64be72460" ], [ - "test.sorted.cram:md5,450f711661b0222e8496ea3140fe7fff" + "test.sorted.cram:md5,d07bc9529dff41207c4cac3ecbd47071" ], "No VCF files", [ diff --git a/tests/save_mapped.nf.test.snap b/tests/save_mapped.nf.test.snap index 1c277f5804..36e862f55e 100644 --- a/tests/save_mapped.nf.test.snap +++ b/tests/save_mapped.nf.test.snap @@ -7,11 +7,11 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/save_output_as_bam.nf.test.snap b/tests/save_output_as_bam.nf.test.snap index 52e6dde2b8..6ecc236aa4 100644 --- a/tests/save_output_as_bam.nf.test.snap +++ b/tests/save_output_as_bam.nf.test.snap @@ -7,11 +7,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CNVKIT_ANTITARGET": { "cnvkit": "0.9.11" @@ -377,11 +377,11 @@ 9, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/sentieon.nf.test.snap b/tests/sentieon.nf.test.snap index 5d52871cb0..5387d5cdb8 100644 --- a/tests/sentieon.nf.test.snap +++ b/tests/sentieon.nf.test.snap @@ -4,7 +4,7 @@ 18, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/sentieon_aligner_bwamem.nf.test.snap b/tests/sentieon_aligner_bwamem.nf.test.snap index 4e05c5ff0c..48c7ef8233 100644 --- a/tests/sentieon_aligner_bwamem.nf.test.snap +++ b/tests/sentieon_aligner_bwamem.nf.test.snap @@ -7,7 +7,7 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -90,16 +90,16 @@ 9, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "FASTP": { - "fastp": "0.24.0" + "fastp": "1.1.0" }, "FGBIO_COPYUMIFROMREADNAME": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_INTERVALLISTTOBED": { "gatk4": "4.6.2.0" @@ -145,7 +145,7 @@ "reports/sentieon_dedup/test/test.dedup.cram.metrics.multiqc.tsv" ], [ - "test-test_L1.fastp.json:md5,d9107ec414e44408d0698b167cc445f9" + "test-test_L1.fastp.json:md5,5146ada16c3aae0e55e3e993b9d587af" ], "No BAM files", [ @@ -167,7 +167,7 @@ 5, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/sentieon_dedup.nf.test.snap b/tests/sentieon_dedup.nf.test.snap index 4f48082aaf..b2424d75a7 100644 --- a/tests/sentieon_dedup.nf.test.snap +++ b/tests/sentieon_dedup.nf.test.snap @@ -583,7 +583,7 @@ "gawk": "5.3.0" }, "FGBIO_COPYUMIFROMREADNAME": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_APPLYBQSR": { "gatk4": "4.6.2.0" @@ -778,7 +778,7 @@ "gawk": "5.3.0" }, "FGBIO_COPYUMIFROMREADNAME": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_APPLYBQSR": { "gatk4": "4.6.2.0" diff --git a/tests/spark.nf.test.snap b/tests/spark.nf.test.snap index 9606f3e91b..294289be2b 100644 --- a/tests/spark.nf.test.snap +++ b/tests/spark.nf.test.snap @@ -4,11 +4,11 @@ 18, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -253,11 +253,11 @@ 11, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/tumor-normal-pair.nf.test.snap b/tests/tumor-normal-pair.nf.test.snap index 89c1068628..17b602b3c5 100644 --- a/tests/tumor-normal-pair.nf.test.snap +++ b/tests/tumor-normal-pair.nf.test.snap @@ -7,11 +7,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/umi_fastp.nf.test.snap b/tests/umi_fastp.nf.test.snap index 54e35ad2af..ce8a858825 100644 --- a/tests/umi_fastp.nf.test.snap +++ b/tests/umi_fastp.nf.test.snap @@ -4,23 +4,23 @@ 18, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "FASTP": { - "fastp": "0.24.0" + "fastp": "1.1.0" }, "FASTQC": { "fastqc": "0.12.1" }, "FGBIO_COPYUMIFROMREADNAME": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_APPLYBQSR": { "gatk4": "4.6.2.0" @@ -318,7 +318,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,5e049e05573f1afd0bb893f2cb4076c6", "mosdepth_perchrom.txt:md5,45bca136491a7675ebba87def2534f26", "multiqc_citations.txt:md5,0e2971e7a873c92592112775fa99fb02", - "multiqc_fastp.txt:md5,8e11d751e997877e4ffc487c52756f62", + "multiqc_fastp.txt:md5,542e41a81f66bd647eff0e741a377b04", "multiqc_fastqc.txt:md5,0ca2cba4204d9076a1eb17596379d10c", "picard_MarkIlluminaAdapters_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", @@ -327,7 +327,7 @@ "samtools-stats-dp.txt:md5,a6f11f838a72299e4913a54dd327f2e6", "samtools_alignment_plot.txt:md5,111d8b457e8c34dc919a527f12f27d4a", "samtools_insert_size.txt:md5,5dbef29f8a260b9aa05de422676ab81a", - "test-test_L1.fastp.json:md5,d9107ec414e44408d0698b167cc445f9", + "test-test_L1.fastp.json:md5,5146ada16c3aae0e55e3e993b9d587af", "test.md.mosdepth.global.dist.txt:md5,40bf266b2080717f92b405cb42fab4a7", "test.md.mosdepth.region.dist.txt:md5,94b080042f51f484fa178339cc9324bc", "test.md.mosdepth.summary.txt:md5,7958c5422bb4b5181afe9782e38a735a", diff --git a/tests/umi_fgbio.nf.test.snap b/tests/umi_fgbio.nf.test.snap index 2504ee455e..da94f581b4 100644 --- a/tests/umi_fgbio.nf.test.snap +++ b/tests/umi_fgbio.nf.test.snap @@ -27,17 +27,17 @@ "samtools": 1.21 }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CALLUMICONSENSUS": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "CAT_FASTQ": { - "cat": 9.5 + "cat": "9.5" }, "COLLATE_FASTQ_MAP": { "samtools": 1.21 @@ -52,7 +52,7 @@ "fastqc": "0.12.1" }, "FASTQTOBAM": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_APPLYBQSR": { "gatk4": "4.6.2.0" @@ -68,7 +68,7 @@ "samtools": "1.21" }, "GROUPREADSBYUMI": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "INDEX_CRAM": { "samtools": 1.21 @@ -276,7 +276,8 @@ "reports/samtools/test/test.md.cram.stats", "reports/samtools/test/test.recal.cram.stats", "reports/umi", - "reports/umi/test_umi-grouped_histogram.txt" + "reports/umi/test_umi-grouped_histogram.txt", + "reports/umi/test_umi-grouped_read-metrics.txt" ], [ "fastqc-status-check-heatmap.txt:md5,92fcedba625d8394492d1ef6e2eb64f0", @@ -290,36 +291,37 @@ "fastqc_sequence_counts_plot.txt:md5,1a4aab87f1bd4fd9f69cabef40f5e5ed", "fastqc_sequence_duplication_levels_plot.txt:md5,72e6366160d000a2990b2bbd321300a7", "fastqc_sequence_length_distribution_plot.txt:md5,7c07faf0c0b90613cdc82a9f09bc1f19", - "mosdepth-coverage-per-contig-single.txt:md5,800ad271050c46d24bf53c0f8bdf7b6e", - "mosdepth-cumcoverage-dist-id.txt:md5,3c526ec6da433233b419bdbdd19a1b56", - "mosdepth_perchrom.txt:md5,800ad271050c46d24bf53c0f8bdf7b6e", + "mosdepth-coverage-per-contig-single.txt:md5,fc8d90478e230b3cbad16ef68ede3a62", + "mosdepth-cumcoverage-dist-id.txt:md5,7985d3196b234be9907f6c417c4fe0df", + "mosdepth_perchrom.txt:md5,fc8d90478e230b3cbad16ef68ede3a62", "multiqc_citations.txt:md5,7d0b4b866fa577272c48a1f3ad72e75d", "multiqc_fastqc.txt:md5,0ca2cba4204d9076a1eb17596379d10c", "picard_MarkIlluminaAdapters_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,4d27768d75a69a61daf23bf5efe17687", - "samtools_alignment_plot.txt:md5,3c2a882852a7ffe06610c9027f0a312a", - "samtools_insert_size.txt:md5,728c8cd8979768e4912f608f59fe1222", - "test.md.mosdepth.global.dist.txt:md5,09d22913aa50a0207f97a3f85b182c6e", - "test.md.mosdepth.region.dist.txt:md5,61676a4a3668c0e84eb0f56dc6bda1ae", - "test.md.mosdepth.summary.txt:md5,9bbea5e4d213a51f501c2aadff8d4526", - "test.md.regions.bed.gz:md5,e24c18ad56e54376c41fdaacec372f9e", - "test.md.regions.bed.gz.csi:md5,d0713716f63ac573f4a3385733e9a537", - "test.recal.mosdepth.global.dist.txt:md5,09d22913aa50a0207f97a3f85b182c6e", - "test.recal.mosdepth.region.dist.txt:md5,61676a4a3668c0e84eb0f56dc6bda1ae", - "test.recal.mosdepth.summary.txt:md5,9bbea5e4d213a51f501c2aadff8d4526", - "test.recal.regions.bed.gz:md5,e24c18ad56e54376c41fdaacec372f9e", - "test.recal.regions.bed.gz.csi:md5,d0713716f63ac573f4a3385733e9a537", - "test_umi-grouped_histogram.txt:md5,85292e9acb83edf17110dce17be27f44" + "samtools-stats-dp.txt:md5,49a0910af4cea91b46a1df076c08c5b5", + "samtools_alignment_plot.txt:md5,60b8f1d48124a8f28b06dc0d15ca4d59", + "samtools_insert_size.txt:md5,ef2a81138667814cda3e5c8c2628c549", + "test.md.mosdepth.global.dist.txt:md5,bb51e76c9cf2f3929cb5ce560f559dd6", + "test.md.mosdepth.region.dist.txt:md5,11dc4683f9038de1938b4874e02974d6", + "test.md.mosdepth.summary.txt:md5,d6cda5af0f2bf21973e256cf198aa47a", + "test.md.regions.bed.gz:md5,b420210d41279bbc93f211491f7d4f02", + "test.md.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.mosdepth.global.dist.txt:md5,bb51e76c9cf2f3929cb5ce560f559dd6", + "test.recal.mosdepth.region.dist.txt:md5,11dc4683f9038de1938b4874e02974d6", + "test.recal.mosdepth.summary.txt:md5,d6cda5af0f2bf21973e256cf198aa47a", + "test.recal.regions.bed.gz:md5,b420210d41279bbc93f211491f7d4f02", + "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test_umi-grouped_histogram.txt:md5,85292e9acb83edf17110dce17be27f44", + "test_umi-grouped_read-metrics.txt:md5,cb2aecfe82357aa06e091d69b4606b9e" ], [ - "test_umi-consensus.bam:md5,18d420720f72366289d3a324f4552522" + "test_umi-consensus.bam:md5,86ddd035aced3a9e7b6e618794824050" ], [ - "test.md.cram:md5,2d0c176fed158d84a061b69e1947994c", - "test.recal.cram:md5,6927569ca52dbba512d27f8742bc6aae" + "test.md.cram:md5,a8f60b321cc24e782dcf6470fd310b08", + "test.recal.cram:md5,a8f60b321cc24e782dcf6470fd310b08" ], "No VCF files", [ diff --git a/tests/umi_in_read_names.nf.test.snap b/tests/umi_in_read_names.nf.test.snap index a61ced6604..3c42b848d9 100644 --- a/tests/umi_in_read_names.nf.test.snap +++ b/tests/umi_in_read_names.nf.test.snap @@ -10,7 +10,7 @@ "gawk": "5.3.0" }, "FGBIO_COPYUMIFROMREADNAME": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_APPLYBQSR": { "gatk4": "4.6.2.0" @@ -269,14 +269,14 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CAT_FASTQ": { - "cat": 9.5 + "cat": "9.5" }, "COLLATE_FASTQ_MAP": { "samtools": 1.21 @@ -291,7 +291,7 @@ "fastqc": "0.12.1" }, "FGBIO_COPYUMIFROMREADNAME": { - "fgbio": "2.4.0" + "fgbio": "3.1.2" }, "GATK4_APPLYBQSR": { "gatk4": "4.6.2.0" diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index 33a2044c8f..4415537702 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -13,11 +13,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CNVKIT_ANTITARGET": { "cnvkit": "0.9.11" @@ -654,11 +654,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CNVKIT_ANTITARGET": { "cnvkit": "0.9.11" @@ -1148,11 +1148,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CALCULATECONTAMINATION": { "gatk4": "4.6.2.0" diff --git a/tests/variant_calling_controlfreec.nf.test.snap b/tests/variant_calling_controlfreec.nf.test.snap index 812a819430..2e78020160 100644 --- a/tests/variant_calling_controlfreec.nf.test.snap +++ b/tests/variant_calling_controlfreec.nf.test.snap @@ -32,7 +32,7 @@ "tabix": "1.21" }, "UNTAR_CHR_DIR": { - "untar": 1.34 + "untar": "1.34" } }, [ @@ -189,7 +189,7 @@ "tabix": "1.21" }, "UNTAR_CHR_DIR": { - "untar": 1.34 + "untar": "1.34" } }, [ @@ -361,7 +361,7 @@ "tabix": "1.21" }, "UNTAR_CHR_DIR": { - "untar": 1.34 + "untar": "1.34" } }, [ @@ -480,7 +480,7 @@ "tabix": "1.21" }, "UNTAR_CHR_DIR": { - "untar": 1.34 + "untar": "1.34" } }, [ diff --git a/tests/variant_calling_freebayes.nf.test.snap b/tests/variant_calling_freebayes.nf.test.snap index 683a3576c9..94c0efd52b 100644 --- a/tests/variant_calling_freebayes.nf.test.snap +++ b/tests/variant_calling_freebayes.nf.test.snap @@ -221,11 +221,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "FASTQC": { "fastqc": "0.12.1" @@ -626,11 +626,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -995,11 +995,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "FASTQC": { "fastqc": "0.12.1" @@ -1547,11 +1547,11 @@ "bcftools": "1.23.1" }, "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "BWAMEM1_MEM": { - "bwa": "0.7.18-r1243-dirty", - "samtools": 1.21 + "bwa": "0.7.19-r1273", + "samtools": "1.22.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/variant_calling_msisensor2.nf.test.snap b/tests/variant_calling_msisensor2.nf.test.snap index 19d0e935d5..23997e71d4 100644 --- a/tests/variant_calling_msisensor2.nf.test.snap +++ b/tests/variant_calling_msisensor2.nf.test.snap @@ -11,7 +11,7 @@ "tabix": "1.21" }, "UNTAR_MSISENSOR2_MODELS": { - "untar": 1.34 + "untar": "1.34" } }, [ @@ -104,7 +104,7 @@ "tabix": "1.21" }, "UNTAR_MSISENSOR2_MODELS": { - "untar": 1.34 + "untar": "1.34" } }, [ @@ -184,7 +184,7 @@ "tabix": "1.21" }, "UNTAR_MSISENSOR2_MODELS": { - "untar": 1.34 + "untar": "1.34" } }, [ diff --git a/tests/variant_calling_mutect2.nf.test.snap b/tests/variant_calling_mutect2.nf.test.snap index 57a9c11a95..a6adc2992f 100644 --- a/tests/variant_calling_mutect2.nf.test.snap +++ b/tests/variant_calling_mutect2.nf.test.snap @@ -606,7 +606,7 @@ "bcftools": "1.23.1" }, "BUILD_INTERVALS": { - "gawk": "5.3.0" + "gawk": "5.3.1" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/tests/variant_calling_sentieon_tnscope.nf.test.snap b/tests/variant_calling_sentieon_tnscope.nf.test.snap index 7278a9d721..ee0421f02f 100644 --- a/tests/variant_calling_sentieon_tnscope.nf.test.snap +++ b/tests/variant_calling_sentieon_tnscope.nf.test.snap @@ -4,7 +4,7 @@ 11, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -91,7 +91,7 @@ 19, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -204,7 +204,7 @@ 10, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "SENTIEON_BWAMEM": { "bwa": "0.7.17-r1188", @@ -292,7 +292,7 @@ 13, { "BWAMEM1_INDEX": { - "bwa": "0.7.18-r1243-dirty" + "bwa": "0.7.19-r1273" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 8bb7129737..2ee53dc1be 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -168,9 +168,6 @@ workflow SAREK { true, ) - versions = versions.mix(SPRING_DECOMPRESS_TO_R1_FQ.out.versions) - versions = versions.mix(SPRING_DECOMPRESS_TO_R2_FQ.out.versions) - versions = versions.mix(SPRING_DECOMPRESS_TO_FQ_PAIR.out.versions) two_fastq_gz_from_spring = r1_fastq_gz_from_spring.fastq.join(r2_fastq_gz_from_spring.fastq).map { meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]] } From c8c2348f8adae8049f7a7156a7eb00174ff1b52c Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Thu, 23 Jul 2026 11:35:49 +0200 Subject: [PATCH 16/27] chore(modules): migrate variant-calling modules to versions topic channel (#2240) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates variant-calling / VCF modules to the `versions` topic channel. **Stacked on #2239** (base: `topic/alignment-utils`). ### Changes - Updates `freebayes`, `strelka`, `manta`, `tiddit`, `lofreq`, `svdb`, `vcflib`, `vcftools` to their topic-channel versions. - Removes the corresponding `.out.versions` wiring from subworkflows (empty `versions` channels left in place for now — a follow-up PR will strip now-unused init/emit pipeline-wide). - Tool bumps: svdb 2.8.2 → 2.8.4, tiddit 3.6.1 → 3.9.5, vcftools 0.1.16 → 0.1.17. Test snapshots need regenerating in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 4 + modules.json | 22 +- modules/nf-core/freebayes/main.nf | 19 +- modules/nf-core/freebayes/meta.yml | 77 ++- modules/nf-core/lofreq/callparallel/main.nf | 43 +- modules/nf-core/lofreq/callparallel/meta.yml | 41 +- .../nf-core/manta/germline/environment.yml | 2 +- modules/nf-core/manta/germline/main.nf | 28 +- modules/nf-core/manta/germline/meta.yml | 28 +- modules/nf-core/manta/somatic/environment.yml | 2 +- modules/nf-core/manta/somatic/main.nf | 14 +- modules/nf-core/manta/somatic/meta.yml | 28 +- .../nf-core/manta/tumoronly/environment.yml | 2 +- modules/nf-core/manta/tumoronly/main.nf | 14 +- modules/nf-core/manta/tumoronly/meta.yml | 28 +- .../nf-core/strelka/germline/environment.yml | 2 +- modules/nf-core/strelka/germline/main.nf | 16 +- modules/nf-core/strelka/germline/meta.yml | 42 +- .../nf-core/strelka/somatic/environment.yml | 2 +- modules/nf-core/strelka/somatic/main.nf | 16 +- modules/nf-core/strelka/somatic/meta.yml | 44 +- modules/nf-core/svdb/merge/environment.yml | 5 +- modules/nf-core/svdb/merge/main.nf | 53 +- modules/nf-core/svdb/merge/meta.yml | 85 ++- modules/nf-core/tiddit/sv/environment.yml | 2 +- modules/nf-core/tiddit/sv/main.nf | 42 +- modules/nf-core/tiddit/sv/meta.yml | 52 +- modules/nf-core/vcflib/vcffilter/main.nf | 21 +- modules/nf-core/vcflib/vcffilter/meta.yml | 29 +- modules/nf-core/vcftools/environment.yml | 2 +- modules/nf-core/vcftools/main.nf | 34 +- modules/nf-core/vcftools/meta.yml | 483 +++++++++++------- .../bam_variant_calling_freebayes/main.nf | 2 - .../bam_variant_calling_germline_all/main.nf | 4 +- .../main.nf | 4 - .../main.nf | 4 - .../bam_variant_calling_single_tiddit/main.nf | 7 +- .../bam_variant_calling_somatic_all/main.nf | 4 +- .../bam_variant_calling_somatic_manta/main.nf | 4 - .../main.nf | 4 - .../main.nf | 12 +- .../main.nf | 4 +- .../main.nf | 4 - .../main.nf | 4 - .../local/vcf_qc_bcftools_vcftools/main.nf | 5 - tests/aligner-parabricks.nf.test.snap | 8 +- tests/bbsplit.nf.test.snap | 16 +- tests/default.nf.test.snap | 16 +- ...joint_calling_haplotypecaller.nf.test.snap | 16 +- tests/joint_calling_mutect2.nf.test.snap | 16 +- tests/postprocess_concatenation.nf.test.snap | 8 +- ...s_concatenation_normalization.nf.test.snap | 16 +- tests/postprocess_consensus.nf.test.snap | 24 +- tests/postprocess_filtering.nf.test.snap | 8 +- tests/postprocess_normalization.nf.test.snap | 8 +- tests/postprocess_varlociraptor.nf.test.snap | 24 +- tests/save_output_as_bam.nf.test.snap | 8 +- ...art_from_preparerecalibration.nf.test.snap | 16 +- tests/start_from_recalibration.nf.test.snap | 16 +- tests/tumor-normal-pair.nf.test.snap | 8 +- tests/umi_in_read_names.nf.test.snap | 16 +- tests/variant_calling_all.nf.test.snap | 54 +- .../variant_calling_deepvariant.nf.test.snap | 32 +- tests/variant_calling_freebayes.nf.test.snap | 48 +- ...riant_calling_haplotypecaller.nf.test.snap | 32 +- tests/variant_calling_lofreq.nf.test.snap | 12 + tests/variant_calling_manta.nf.test.snap | 56 +- tests/variant_calling_mpileup.nf.test.snap | 32 +- tests/variant_calling_muse.nf.test.snap | 16 +- tests/variant_calling_mutect2.nf.test.snap | 32 +- ...ant_calling_sentieon_dnascope.nf.test.snap | 24 +- ...ling_sentieon_haplotypecaller.nf.test.snap | 32 +- ...iant_calling_sentieon_tnscope.nf.test.snap | 32 +- tests/variant_calling_strelka.nf.test.snap | 40 +- tests/variant_calling_strelka_bp.nf.test.snap | 16 +- tests/variant_calling_tiddit.nf.test.snap | 34 +- workflows/sarek.nf | 1 - 77 files changed, 1365 insertions(+), 696 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12fcf16783..3e28d64d3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2235](https://github.com/nf-core/sarek/pull/2235) - germline CNVKIT reuses the shared `CRAM_TO_BAM` conversion instead of re-converting CRAM internally, avoiding a duplicate conversion. Side effect: with `--step variant_calling` (user-supplied CRAM/BAM), CNVKit output files are named after the input file rather than the sample; runs from FASTQ are unaffected. - [#2238](https://github.com/nf-core/sarek/pull/2238) - Migrate `gatk4`/`gatk4spark` modules to the versions topic channel (bumps gatk4spark 4.6.1.0 → 4.6.2.0) - [#2239](https://github.com/nf-core/sarek/pull/2239) - Migrate alignment/UMI/utility modules (`bwa`, `bwamem2`, `dragmap`, `fgbio`, `fastp`, `cat`, `gawk`, `gunzip`, `untar`, `unzip`, `spring`) to the versions topic channel (fastp 0.24.0 → 1.1.0) +- [#2240](https://github.com/nf-core/sarek/pull/2240) - Migrate variant-calling modules (`freebayes`, `strelka`, `manta`, `tiddit`, `lofreq`, `svdb`, `vcflib`, `vcftools`) to the versions topic channel ### Fixed @@ -44,6 +45,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | fgbio | 2.4.0 | 3.1.2 | | gawk | 5.3.0 | 5.3.1 | | pigz | 2.3.4 | 2.8 | +| svdb | 2.8.2 | 2.8.4 | +| tiddit | 3.6.1 | 3.9.5 | +| vcftools | 0.1.16 | 0.1.17 | ### Dependencies - plugins diff --git a/modules.json b/modules.json index d7a3851c68..e883cb77a7 100644 --- a/modules.json +++ b/modules.json @@ -203,7 +203,7 @@ }, "freebayes": { "branch": "master", - "git_sha": "d04951ee68e3e8b875ebf5ddb7ba6e05233624c1", + "git_sha": "6fd0d62609c3a24b08c9df3df45857f974efc7ad", "installed_by": ["modules"] }, "gatk4/applybqsr": { @@ -348,22 +348,22 @@ }, "lofreq/callparallel": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9707facbacc9c5c02ecf0b192f0604a29351b00a", "installed_by": ["modules"] }, "manta/germline": { "branch": "master", - "git_sha": "ae6b18e8930fe66595c8b08633b484d42970a564", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "manta/somatic": { "branch": "master", - "git_sha": "ae6b18e8930fe66595c8b08633b484d42970a564", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "manta/tumoronly": { "branch": "master", - "git_sha": "ae6b18e8930fe66595c8b08633b484d42970a564", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "mosdepth": { @@ -533,17 +533,17 @@ }, "strelka/germline": { "branch": "master", - "git_sha": "039730fab3f0150585ad46c402c6bf95396d88b5", + "git_sha": "db2491458130c466967c4e9b44686314c3f37141", "installed_by": ["modules"] }, "strelka/somatic": { "branch": "master", - "git_sha": "039730fab3f0150585ad46c402c6bf95396d88b5", + "git_sha": "db2491458130c466967c4e9b44686314c3f37141", "installed_by": ["modules"] }, "svdb/merge": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6bc8ff03ace2cb373f683b9502ce79930c8a07f0", "installed_by": ["modules"] }, "tabix/bgziptabix": { @@ -558,7 +558,7 @@ }, "tiddit/sv": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "untar": { @@ -593,12 +593,12 @@ }, "vcflib/vcffilter": { "branch": "master", - "git_sha": "401ec2b2b8d0938d12ae4f9e25819e14596b8f83", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "vcftools": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "094186cc8b196ebdded57d596d741611ff571cf3", "installed_by": ["modules"] }, "yte": { diff --git a/modules/nf-core/freebayes/main.nf b/modules/nf-core/freebayes/main.nf index 9d949add0b..4f3f8bb35d 100644 --- a/modules/nf-core/freebayes/main.nf +++ b/modules/nf-core/freebayes/main.nf @@ -3,9 +3,9 @@ process FREEBAYES { label 'process_single' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/freebayes:1.3.10--hbefcdb2_0' - : 'biocontainers/freebayes:1.3.10--hbefcdb2_0'}" + : 'quay.io/biocontainers/freebayes:1.3.10--hbefcdb2_0'}" input: tuple val(meta), path(input_1), path(input_1_index), path(input_2), path(input_2_index), path(target_bed) @@ -17,7 +17,8 @@ process FREEBAYES { output: tuple val(meta), path("*.vcf.gz"), emit: vcf - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('freebayes'), eval('freebayes --version 2>&1 | sed "s/version:\s*v//g"'), emit: versions_freebayes, topic: versions + when: task.ext.when == null || task.ext.when @@ -41,21 +42,11 @@ process FREEBAYES { ${input} > ${prefix}.vcf bgzip ${prefix}.vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - freebayes: \$(echo \$(freebayes --version 2>&1) | sed 's/version:\s*v//g' ) - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - echo | gzip > ${prefix}.vcf.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - freebayes: \$(echo \$(freebayes --version 2>&1) | sed 's/version:\s*v//g' ) - END_VERSIONS + echo "" | gzip > ${prefix}.vcf.gz """ } diff --git a/modules/nf-core/freebayes/meta.yml b/modules/nf-core/freebayes/meta.yml index 5593bcaaa9..17cc5d172b 100644 --- a/modules/nf-core/freebayes/meta.yml +++ b/modules/nf-core/freebayes/meta.yml @@ -15,7 +15,8 @@ tools: documentation: https://github.com/freebayes/freebayes tool_dev_url: https://github.com/freebayes/freebayes doi: "10.48550/arXiv.1207.3907" - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:freebayes input: - - meta: @@ -27,28 +28,37 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_2572 # BAM + - edam: http://edamontology.org/format_3462 # CRAM + - edam: http://edamontology.org/format_2573 # SAM - input_1_index: type: file description: BAM/CRAM/SAM index file pattern: "*.{bai,crai}" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_3327 # BAI/CRAI index - input_2: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_2572 # BAM + - edam: http://edamontology.org/format_3462 # CRAM + - edam: http://edamontology.org/format_2573 # SAM - input_2_index: type: file description: BAM/CRAM/SAM index file pattern: "*.{bai,crai}" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_3327 # BAI/CRAI index - target_bed: type: file - description: Optional - Limit analysis to targets listed in this BED-format - FILE. + description: Optional - Limit analysis to targets listed in this + BED-format FILE. pattern: "*.bed" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_3003 # BED - - meta2: type: map description: | @@ -58,7 +68,8 @@ input: type: file description: reference fasta file pattern: ".{fa,fa.gz,fasta,fasta.gz}" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_1929 # FASTA - - meta3: type: map description: | @@ -68,7 +79,8 @@ input: type: file description: reference fasta file index pattern: "*.{fa,fasta}.fai" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_3327 # FASTA index - - meta4: type: map description: | @@ -76,10 +88,11 @@ input: e.g. [ id:'test_samples' ] - samples: type: file - description: Optional - Limit analysis to samples listed (one per line) in the - FILE. + description: Optional - Limit analysis to samples listed (one per line) in + the FILE. pattern: "*.txt" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_2330 # Textual format - - meta5: type: map description: | @@ -87,10 +100,11 @@ input: e.g. [ id:'test_populations' ] - populations: type: file - description: Optional - Each line of FILE should list a sample and a population - which it is part of. + description: Optional - Each line of FILE should list a sample and a + population which it is part of. pattern: "*.txt" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_2330 # Textual format - - meta6: type: map description: | @@ -104,7 +118,8 @@ input: or a region-specific format: seq_name start end sample_name copy_number pattern: "*.bed" - ontologies: [] + ontologies: + - edam: http://edamontology.org/format_3003 # BED output: vcf: - - meta: @@ -117,14 +132,28 @@ output: description: Compressed VCF file pattern: "*.vcf.gz" ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format + - edam: http://edamontology.org/format_3989 + versions_freebayes: + - - ${task.process}: + type: string + description: The name of the process + - freebayes: + type: string + description: The name of the tool + - freebayes --version 2>&1 | sed "s/version:\s*v//g": + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software version - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - freebayes: + type: string + description: The name of the tool + - freebayes --version 2>&1 | sed "s/version:\s*v//g": + type: eval + description: The expression to obtain the version of the tool authors: - "@maxibor" - "@FriederikeHanssen" diff --git a/modules/nf-core/lofreq/callparallel/main.nf b/modules/nf-core/lofreq/callparallel/main.nf index 93f9a3dfb1..0b187150db 100644 --- a/modules/nf-core/lofreq/callparallel/main.nf +++ b/modules/nf-core/lofreq/callparallel/main.nf @@ -1,21 +1,21 @@ process LOFREQ_CALLPARALLEL { - tag "$meta.id" + tag "${meta.id}" label 'process_high' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/lofreq:2.1.5--py38h588ecb2_4' : - 'biocontainers/lofreq:2.1.5--py38h588ecb2_4' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/lofreq:2.1.5--py38h588ecb2_4' + : 'quay.io/biocontainers/lofreq:2.1.5--py38h588ecb2_4'}" input: - tuple val(meta) , path(bam), path(bai), path(intervals) + tuple val(meta), path(bam), path(bai), path(intervals) 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"), emit: vcf tuple val(meta), path("*.vcf.gz.tbi"), emit: tbi - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('lofreq'), eval("lofreq version | sed -n '1s/^.* //p'"), emit: versions_lofreq, topic: versions when: task.ext.when == null || task.ext.when @@ -25,35 +25,29 @@ process LOFREQ_CALLPARALLEL { def prefix = task.ext.prefix ?: "${meta.id}" def options_intervals = intervals ? "-l ${intervals}" : "" - def alignment_cram = bam.Extension == "cram" ? true : false - def alignment_bam = bam.Extension == "bam" ? true : false + def alignment_cram = bam.Extension == "cram" ? true : false def alignment_out = alignment_cram ? bam.BaseName + ".bam" : "${bam}" def samtools_cram_convert = '' - samtools_cram_convert += alignment_cram ? " samtools view -T ${fasta} ${bam} -@ $task.cpus -o ${alignment_out}\n" : '' + samtools_cram_convert += alignment_cram ? " samtools view -T ${fasta} ${bam} -@ ${task.cpus} -o ${alignment_out}\n" : '' samtools_cram_convert += alignment_cram ? " samtools index ${alignment_out}\n" : '' def samtools_cram_remove = '' samtools_cram_remove += alignment_cram ? " rm ${alignment_out}\n" : '' samtools_cram_remove += alignment_cram ? " rm ${alignment_out}.bai\n " : '' """ - $samtools_cram_convert + ${samtools_cram_convert} lofreq \\ call-parallel \\ - --pp-threads $task.cpus \\ - $args \\ - $options_intervals \\ - -f $fasta \\ + --pp-threads ${task.cpus} \\ + ${args} \\ + ${options_intervals} \\ + -f ${fasta} \\ -o ${prefix}.vcf.gz \\ - $alignment_out + ${alignment_out} - $samtools_cram_remove - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - lofreq: \$(echo \$(lofreq version 2>&1) | sed 's/^version: //; s/ *commit.*\$//') - END_VERSIONS + ${samtools_cram_remove} """ stub: @@ -61,10 +55,5 @@ process LOFREQ_CALLPARALLEL { """ echo "" | gzip > ${prefix}.vcf.gz echo "" | gzip > ${prefix}.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - lofreq: \$(echo \$(lofreq version 2>&1) | sed 's/^version: //; s/ *commit.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/lofreq/callparallel/meta.yml b/modules/nf-core/lofreq/callparallel/meta.yml index 25a33e85c4..7e74398d40 100644 --- a/modules/nf-core/lofreq/callparallel/meta.yml +++ b/modules/nf-core/lofreq/callparallel/meta.yml @@ -25,14 +25,17 @@ input: type: file description: Tumor sample sorted BAM file pattern: "*.{bam}" + ontologies: [] - bai: type: file description: BAM index file pattern: "*.{bam.bai}" + ontologies: [] - intervals: type: file description: BED file containing target regions for variant calling pattern: "*.{bed}" + ontologies: [] - - meta2: type: map description: | @@ -42,6 +45,7 @@ input: type: file description: Reference genome FASTA file pattern: "*.{fasta}" + ontologies: [] - - meta3: type: map description: | @@ -51,9 +55,10 @@ input: type: file description: Reference genome FASTA index file pattern: "*.{fai}" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -62,8 +67,9 @@ output: type: file description: Predicted variants file pattern: "*.{vcf}" - - tbi: - - meta: + ontologies: [] + tbi: + - - meta: type: map description: | Groovy Map containing sample information @@ -72,11 +78,28 @@ output: type: file description: Index of vcf file pattern: "*.{vcf.gz.tbi}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_lofreq: + - - ${task.process}: + type: string + description: Process which generated the version + - lofreq: + type: string + description: Tool name + - "lofreq version | sed -n '1s/^.* //p'": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: Process which generated the version + - lofreq: + type: string + description: Tool name + - "lofreq version | sed -n '1s/^.* //p'": + type: eval + description: The expression to obtain the version of the tool authors: - "@kaurravneet4123" - "@bjohnnyd" diff --git a/modules/nf-core/manta/germline/environment.yml b/modules/nf-core/manta/germline/environment.yml index 3804c07f42..697c36d1c8 100644 --- a/modules/nf-core/manta/germline/environment.yml +++ b/modules/nf-core/manta/germline/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::python=2.7.15 - bioconda::manta=1.6.0 + - conda-forge::python=2.7.15 diff --git a/modules/nf-core/manta/germline/main.nf b/modules/nf-core/manta/germline/main.nf index 0fad64f31e..ddb19689b7 100644 --- a/modules/nf-core/manta/germline/main.nf +++ b/modules/nf-core/manta/germline/main.nf @@ -4,7 +4,7 @@ process MANTA_GERMLINE { label 'error_retry' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f6/f696c93e6209e33ac0d15f1ecfa799bc67329eec07b0569e065ea8b220b53953/data' : 'community.wave.seqera.io/library/manta_python:0eb71149179b3920' }" @@ -16,13 +16,13 @@ process MANTA_GERMLINE { path(config) output: - tuple val(meta), path("*candidate_small_indels.vcf.gz") , emit: candidate_small_indels_vcf - tuple val(meta), path("*candidate_small_indels.vcf.gz.tbi"), emit: candidate_small_indels_vcf_tbi - tuple val(meta), path("*candidate_sv.vcf.gz") , emit: candidate_sv_vcf - tuple val(meta), path("*candidate_sv.vcf.gz.tbi") , emit: candidate_sv_vcf_tbi - tuple val(meta), path("*diploid_sv.vcf.gz") , emit: diploid_sv_vcf - tuple val(meta), path("*diploid_sv.vcf.gz.tbi") , emit: diploid_sv_vcf_tbi - path "versions.yml" , emit: versions + tuple val(meta), path("*candidate_small_indels.vcf.gz") , emit: candidate_small_indels_vcf + tuple val(meta), path("*candidate_small_indels.vcf.gz.tbi") , emit: candidate_small_indels_vcf_tbi + tuple val(meta), path("*candidate_sv.vcf.gz") , emit: candidate_sv_vcf + tuple val(meta), path("*candidate_sv.vcf.gz.tbi") , emit: candidate_sv_vcf_tbi + tuple val(meta), path("*diploid_sv.vcf.gz") , emit: diploid_sv_vcf + tuple val(meta), path("*diploid_sv.vcf.gz.tbi") , emit: diploid_sv_vcf_tbi + tuple val("${task.process}"), val("manta"), eval("configManta.py --version"), topic: versions, emit: versions_manta when: task.ext.when == null || task.ext.when @@ -30,7 +30,7 @@ process MANTA_GERMLINE { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def input_files = input.collect{"--bam ${it}"}.join(' ') + def input_files = input.collect{ bam -> "--bam ${bam}"}.join(' ') def options_manta = target_bed ? "--callRegions $target_bed" : "" def config_option = config ? "--config ${config}" : "" """ @@ -56,11 +56,6 @@ process MANTA_GERMLINE { ${prefix}.diploid_sv.vcf.gz mv manta/results/variants/diploidSV.vcf.gz.tbi \\ ${prefix}.diploid_sv.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - manta: \$( configManta.py --version ) - END_VERSIONS """ stub: @@ -72,10 +67,5 @@ process MANTA_GERMLINE { touch ${prefix}.candidate_sv.vcf.gz.tbi echo "" | gzip > ${prefix}.diploid_sv.vcf.gz touch ${prefix}.diploid_sv.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - manta: \$( configManta.py --version ) - END_VERSIONS """ } diff --git a/modules/nf-core/manta/germline/meta.yml b/modules/nf-core/manta/germline/meta.yml index 9774e1a059..83ff420b88 100644 --- a/modules/nf-core/manta/germline/meta.yml +++ b/modules/nf-core/manta/germline/meta.yml @@ -137,13 +137,29 @@ output: description: Index for gzipped VCF file containing variants pattern: "*.{vcf.gz.tbi}" ontologies: [] + versions_manta: + - - ${task.process}: + type: string + description: The name of the process + - manta: + type: string + description: The name of the tool + - configManta.py --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 + - manta: + type: string + description: The name of the tool + - configManta.py --version: + type: eval + description: The expression to obtain the version of the tool + authors: - "@maxulysse" - "@ramprasadn" diff --git a/modules/nf-core/manta/somatic/environment.yml b/modules/nf-core/manta/somatic/environment.yml index 3804c07f42..697c36d1c8 100644 --- a/modules/nf-core/manta/somatic/environment.yml +++ b/modules/nf-core/manta/somatic/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::python=2.7.15 - bioconda::manta=1.6.0 + - conda-forge::python=2.7.15 diff --git a/modules/nf-core/manta/somatic/main.nf b/modules/nf-core/manta/somatic/main.nf index 317e3f484e..f2bb4d2f38 100644 --- a/modules/nf-core/manta/somatic/main.nf +++ b/modules/nf-core/manta/somatic/main.nf @@ -4,7 +4,7 @@ process MANTA_SOMATIC { label 'error_retry' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f6/f696c93e6209e33ac0d15f1ecfa799bc67329eec07b0569e065ea8b220b53953/data' : 'community.wave.seqera.io/library/manta_python:0eb71149179b3920' }" @@ -23,7 +23,7 @@ process MANTA_SOMATIC { tuple val(meta), path("*.diploid_sv.vcf.gz.tbi") , emit: diploid_sv_vcf_tbi tuple val(meta), path("*.somatic_sv.vcf.gz") , emit: somatic_sv_vcf tuple val(meta), path("*.somatic_sv.vcf.gz.tbi") , emit: somatic_sv_vcf_tbi - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("manta"), eval("configManta.py --version"), topic: versions, emit: versions_manta when: task.ext.when == null || task.ext.when @@ -61,11 +61,6 @@ process MANTA_SOMATIC { ${prefix}.somatic_sv.vcf.gz mv manta/results/variants/somaticSV.vcf.gz.tbi \\ ${prefix}.somatic_sv.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - manta: \$( configManta.py --version ) - END_VERSIONS """ stub: @@ -79,10 +74,5 @@ process MANTA_SOMATIC { touch ${prefix}.diploid_sv.vcf.gz.tbi echo "" | gzip > ${prefix}.somatic_sv.vcf.gz touch ${prefix}.somatic_sv.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - manta: \$( configManta.py --version ) - END_VERSIONS """ } diff --git a/modules/nf-core/manta/somatic/meta.yml b/modules/nf-core/manta/somatic/meta.yml index 3d619dd586..048c1342cd 100644 --- a/modules/nf-core/manta/somatic/meta.yml +++ b/modules/nf-core/manta/somatic/meta.yml @@ -169,13 +169,29 @@ output: description: Index for gzipped VCF file containing variants pattern: "*.{vcf.gz.tbi}" ontologies: [] + versions_manta: + - - ${task.process}: + type: string + description: The name of the process + - manta: + type: string + description: The name of the tool + - configManta.py --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 + - manta: + type: string + description: The name of the tool + - configManta.py --version: + type: eval + description: The expression to obtain the version of the tool + authors: - "@FriederikeHanssen" - "@nvnieuwk" diff --git a/modules/nf-core/manta/tumoronly/environment.yml b/modules/nf-core/manta/tumoronly/environment.yml index 3804c07f42..697c36d1c8 100644 --- a/modules/nf-core/manta/tumoronly/environment.yml +++ b/modules/nf-core/manta/tumoronly/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::python=2.7.15 - bioconda::manta=1.6.0 + - conda-forge::python=2.7.15 diff --git a/modules/nf-core/manta/tumoronly/main.nf b/modules/nf-core/manta/tumoronly/main.nf index b657468b58..ac3662b280 100644 --- a/modules/nf-core/manta/tumoronly/main.nf +++ b/modules/nf-core/manta/tumoronly/main.nf @@ -4,7 +4,7 @@ process MANTA_TUMORONLY { label 'error_retry' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f6/f696c93e6209e33ac0d15f1ecfa799bc67329eec07b0569e065ea8b220b53953/data' : 'community.wave.seqera.io/library/manta_python:0eb71149179b3920' }" @@ -21,7 +21,7 @@ process MANTA_TUMORONLY { tuple val(meta), path("*candidate_sv.vcf.gz.tbi") , emit: candidate_sv_vcf_tbi tuple val(meta), path("*tumor_sv.vcf.gz") , emit: tumor_sv_vcf tuple val(meta), path("*tumor_sv.vcf.gz.tbi") , emit: tumor_sv_vcf_tbi - path "versions.yml" , emit: versions + tuple val("${task.process}"), val("manta"), eval("configManta.py --version"), topic: versions, emit: versions_manta when: task.ext.when == null || task.ext.when @@ -54,11 +54,6 @@ process MANTA_TUMORONLY { ${prefix}.tumor_sv.vcf.gz mv manta/results/variants/tumorSV.vcf.gz.tbi \\ ${prefix}.tumor_sv.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - manta: \$( configManta.py --version ) - END_VERSIONS """ stub: @@ -70,10 +65,5 @@ process MANTA_TUMORONLY { touch ${prefix}.candidate_sv.vcf.gz.tbi echo "" | gzip > ${prefix}.tumor_sv.vcf.gz touch ${prefix}.tumor_sv.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - manta: \$( configManta.py --version ) - END_VERSIONS """ } diff --git a/modules/nf-core/manta/tumoronly/meta.yml b/modules/nf-core/manta/tumoronly/meta.yml index 0773760b5a..b78a9e4844 100644 --- a/modules/nf-core/manta/tumoronly/meta.yml +++ b/modules/nf-core/manta/tumoronly/meta.yml @@ -137,13 +137,29 @@ output: description: Index for gzipped VCF file containing variants pattern: "*.{vcf.gz.tbi}" ontologies: [] + versions_manta: + - - ${task.process}: + type: string + description: The name of the process + - manta: + type: string + description: The name of the tool + - configManta.py --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 + - manta: + type: string + description: The name of the tool + - configManta.py --version: + type: eval + description: The expression to obtain the version of the tool + authors: - "@maxulysse" - "@nvnieuwk" diff --git a/modules/nf-core/strelka/germline/environment.yml b/modules/nf-core/strelka/germline/environment.yml index ad1ff8498d..fbe5608cce 100644 --- a/modules/nf-core/strelka/germline/environment.yml +++ b/modules/nf-core/strelka/germline/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::python=2.7.15 - bioconda::strelka=2.9.10=h9ee0642_1 + - conda-forge::python=2.7.15 diff --git a/modules/nf-core/strelka/germline/main.nf b/modules/nf-core/strelka/germline/main.nf index 00499135c0..67e2680fd0 100644 --- a/modules/nf-core/strelka/germline/main.nf +++ b/modules/nf-core/strelka/germline/main.nf @@ -4,9 +4,9 @@ process STRELKA_GERMLINE { label 'error_retry' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/strelka:2.9.10--h9ee0642_1' - : 'biocontainers/strelka:2.9.10--h9ee0642_1'}" + : 'quay.io/biocontainers/strelka:2.9.10--h9ee0642_1'}" input: tuple val(meta), path(input), path(input_index), path(target_bed), path(target_bed_index) @@ -18,7 +18,7 @@ process STRELKA_GERMLINE { tuple val(meta), path("*variants.vcf.gz.tbi"), emit: vcf_tbi tuple val(meta), path("*genome.vcf.gz"), emit: genome_vcf tuple val(meta), path("*genome.vcf.gz.tbi"), emit: genome_vcf_tbi - path "versions.yml", emit: versions + tuple val("${task.process}"), val('strelka'), eval("configureStrelkaGermlineWorkflow.py --version"), emit: versions_strelka, topic: versions when: task.ext.when == null || task.ext.when @@ -42,11 +42,6 @@ process STRELKA_GERMLINE { mv strelka/results/variants/genome.*.vcf.gz.tbi ${prefix}.genome.vcf.gz.tbi mv strelka/results/variants/variants.vcf.gz ${prefix}.variants.vcf.gz mv strelka/results/variants/variants.vcf.gz.tbi ${prefix}.variants.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - strelka: \$( configureStrelkaGermlineWorkflow.py --version ) - END_VERSIONS """ stub: @@ -56,10 +51,5 @@ process STRELKA_GERMLINE { touch ${prefix}.genome.vcf.gz.tbi echo "" | gzip > ${prefix}.variants.vcf.gz touch ${prefix}.variants.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - strelka: \$( configureStrelkaSomaticWorkflow.py --version ) - END_VERSIONS """ } diff --git a/modules/nf-core/strelka/germline/meta.yml b/modules/nf-core/strelka/germline/meta.yml index c20bf89a6a..4150d974b1 100644 --- a/modules/nf-core/strelka/germline/meta.yml +++ b/modules/nf-core/strelka/germline/meta.yml @@ -1,6 +1,6 @@ name: strelka_germline -description: Strelka2 is a fast and accurate small variant caller optimized for analysis - of germline variation +description: Strelka2 is a fast and accurate small variant caller optimized for + analysis of germline variation keywords: - variantcalling - germline @@ -9,13 +9,14 @@ keywords: - variants tools: - strelka: - description: Strelka calls somatic and germline small variants from mapped sequencing - reads + description: Strelka calls somatic and germline small variants from mapped + sequencing reads homepage: https://github.com/Illumina/strelka documentation: https://github.com/Illumina/strelka/blob/v2.9.x/docs/userGuide/README.md tool_dev_url: https://github.com/Illumina/strelka doi: 10.1038/s41592-018-0051-x - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: biotools:strelka input: - - meta: @@ -40,7 +41,8 @@ input: ontologies: [] - target_bed_index: type: file - description: Index for BED file containing target regions for variant calling + description: Index for BED file containing target regions for variant + calling pattern: "*.{bed.tbi}" ontologies: [] - fasta: @@ -99,13 +101,29 @@ output: description: index file for the genome_vcf file pattern: "*_genome.vcf.gz.tbi" ontologies: [] + versions_strelka: + - - ${task.process}: + type: string + description: The name of the process + - strelka: + type: string + description: The name of the tool + - configureStrelkaGermlineWorkflow.py --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 + - strelka: + type: string + description: The name of the tool + - configureStrelkaGermlineWorkflow.py --version: + type: eval + description: The expression to obtain the version of the tool + authors: - "@arontommi" maintainers: diff --git a/modules/nf-core/strelka/somatic/environment.yml b/modules/nf-core/strelka/somatic/environment.yml index ad1ff8498d..fbe5608cce 100644 --- a/modules/nf-core/strelka/somatic/environment.yml +++ b/modules/nf-core/strelka/somatic/environment.yml @@ -4,5 +4,5 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::python=2.7.15 - bioconda::strelka=2.9.10=h9ee0642_1 + - conda-forge::python=2.7.15 diff --git a/modules/nf-core/strelka/somatic/main.nf b/modules/nf-core/strelka/somatic/main.nf index 052cfee15f..8a30d11cb3 100644 --- a/modules/nf-core/strelka/somatic/main.nf +++ b/modules/nf-core/strelka/somatic/main.nf @@ -4,9 +4,9 @@ process STRELKA_SOMATIC { label 'error_retry' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/strelka:2.9.10--h9ee0642_1' - : 'biocontainers/strelka:2.9.10--h9ee0642_1'}" + : 'quay.io/biocontainers/strelka:2.9.10--h9ee0642_1'}" input: tuple val(meta), path(input_normal), path(input_index_normal), path(input_tumor), path(input_index_tumor), path(manta_candidate_small_indels), path(manta_candidate_small_indels_tbi), path(target_bed), path(target_bed_index) @@ -18,7 +18,7 @@ process STRELKA_SOMATIC { tuple val(meta), path("*.somatic_indels.vcf.gz.tbi"), emit: vcf_indels_tbi tuple val(meta), path("*.somatic_snvs.vcf.gz"), emit: vcf_snvs tuple val(meta), path("*.somatic_snvs.vcf.gz.tbi"), emit: vcf_snvs_tbi - path "versions.yml", emit: versions + tuple val("${task.process}"), val('strelka'), eval("configureStrelkaSomaticWorkflow.py --version"), emit: versions_strelka, topic: versions when: task.ext.when == null || task.ext.when @@ -45,11 +45,6 @@ process STRELKA_SOMATIC { mv strelka/results/variants/somatic.indels.vcf.gz.tbi ${prefix}.somatic_indels.vcf.gz.tbi mv strelka/results/variants/somatic.snvs.vcf.gz ${prefix}.somatic_snvs.vcf.gz mv strelka/results/variants/somatic.snvs.vcf.gz.tbi ${prefix}.somatic_snvs.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - strelka: \$( configureStrelkaSomaticWorkflow.py --version ) - END_VERSIONS """ stub: @@ -59,10 +54,5 @@ process STRELKA_SOMATIC { touch ${prefix}.somatic_indels.vcf.gz.tbi echo "" | gzip > ${prefix}.somatic_snvs.vcf.gz touch ${prefix}.somatic_snvs.vcf.gz.tbi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - strelka: \$( configureStrelkaSomaticWorkflow.py --version ) - END_VERSIONS """ } diff --git a/modules/nf-core/strelka/somatic/meta.yml b/modules/nf-core/strelka/somatic/meta.yml index eca9ea43f2..aeb3a8080a 100644 --- a/modules/nf-core/strelka/somatic/meta.yml +++ b/modules/nf-core/strelka/somatic/meta.yml @@ -1,7 +1,7 @@ name: strelka_somatic -description: Strelka2 is a fast and accurate small variant caller optimized for analysis - of germline variation in small cohorts and somatic variation in tumor/normal sample - pairs +description: Strelka2 is a fast and accurate small variant caller optimized for + analysis of germline variation in small cohorts and somatic variation in + tumor/normal sample pairs keywords: - variant calling - germline @@ -10,13 +10,14 @@ keywords: - variants tools: - strelka: - description: Strelka calls somatic and germline small variants from mapped sequencing - reads + description: Strelka calls somatic and germline small variants from mapped + sequencing reads homepage: https://github.com/Illumina/strelka documentation: https://github.com/Illumina/strelka/blob/v2.9.x/docs/userGuide/README.md tool_dev_url: https://github.com/Illumina/strelka doi: 10.1038/s41592-018-0051-x - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: biotools:strelka input: - - meta: @@ -61,7 +62,8 @@ input: ontologies: [] - target_bed_index: type: file - description: Index for BED file containing target regions for variant calling + description: Index for BED file containing target regions for variant + calling pattern: "*.{bed.tbi}" ontologies: [] - fasta: @@ -119,13 +121,29 @@ output: description: Index for gzipped VCF file containing variants pattern: "*.{vcf.gz.tbi}" ontologies: [] + versions_strelka: + - - ${task.process}: + type: string + description: The name of the process + - strelka: + type: string + description: The name of the tool + - configureStrelkaSomaticWorkflow.py --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 + - strelka: + type: string + description: The name of the tool + - configureStrelkaSomaticWorkflow.py --version: + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" maintainers: diff --git a/modules/nf-core/svdb/merge/environment.yml b/modules/nf-core/svdb/merge/environment.yml index dc587136eb..00d472a335 100644 --- a/modules/nf-core/svdb/merge/environment.yml +++ b/modules/nf-core/svdb/merge/environment.yml @@ -3,7 +3,6 @@ channels: - conda-forge - bioconda - dependencies: - - bcftools=1.21 - - svdb=2.8.2 + - bioconda::bcftools=1.23=* + - bioconda::svdb=2.8.4 diff --git a/modules/nf-core/svdb/merge/main.nf b/modules/nf-core/svdb/merge/main.nf index 104f5ad799..3963f64d1e 100644 --- a/modules/nf-core/svdb/merge/main.nf +++ b/modules/nf-core/svdb/merge/main.nf @@ -1,10 +1,11 @@ process SVDB_MERGE { 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/mulled-v2-375a758a4ca8c128fb9d38047a68a9f4322d2acd:b3615e06ef17566f2988a215ce9e10808c1d08bf-0': - 'biocontainers/mulled-v2-375a758a4ca8c128fb9d38047a68a9f4322d2acd:b3615e06ef17566f2988a215ce9e10808c1d08bf-0' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/f5/f59712ead354411dd8bea4918d777737ca4ef2ad1360289507fe35acb688e74f/data': + 'community.wave.seqera.io/library/bcftools_svdb:12db401acbacc624' }" input: tuple val(meta), path(vcfs) @@ -15,7 +16,8 @@ process SVDB_MERGE { 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("${task.process}"), val('svdb'), eval("svdb | sed -nE 's/.*SVDB-([0-9.]+).*/\\1/p'"), emit: versions_svdb, topic: versions + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), emit: versions_bcftools, topic: versions when: task.ext.when == null || task.ext.when @@ -29,31 +31,28 @@ process SVDB_MERGE { if (input_priority && vcfs.collect().size() != input_priority.collect().size()) { error "If priority is used, one tag per VCF is needed" } + // Convert to list if not already for simpler logic below + def vcf_list = vcfs instanceof List ? vcfs : [vcfs] - def input = "" - def prio = "" if (input_priority) { - if (vcfs.collect().size() > 1 && sort_inputs) { - // make vcf-priority pairs and sort on VCF name, so priority is also sorted the same - def pairs = vcfs.indices.collect { [vcfs[it], input_priority[it]] } - pairs = pairs.sort { a, b -> a[0].name <=> b[0].name } - vcfs = pairs.collect { it[0] } - priority = pairs.collect { it[1] } - } else { - priority = input_priority + pairs = vcf_list.indices.collect { index -> [vcf_list[index], input_priority[index]] } + + if(sort_inputs) { + pairs.sort { a, b -> a[0].name <=> b[0].name } } - // Build inputs prio = "--priority ${input_priority.join(',')}" - input = vcfs - .withIndex() - .collect { vcf, index -> "${vcf}:${priority[index]}" } - .join(" ") - + input = pairs.collect { vcf, priority -> "${vcf}:${priority}"} } else { - // if there's no priority input just sort the vcfs by name if possible - input = (vcfs.collect().size() > 1 && sort_inputs) ? vcfs.sort { it.name } : vcfs + if (sort_inputs) { + vcf_list.sort { vcf_file -> vcf_file.name } + } + + prio = "" + input = vcf_list } + // Convert from list to string + input = input.join(' ') def extension = args2.contains("--output-type b") || args2.contains("-Ob") ? "bcf.gz" : args2.contains("--output-type u") || args2.contains("-Ou") ? "bcf" : @@ -71,11 +70,6 @@ process SVDB_MERGE { --threads ${task.cpus} \\ --output ${prefix}.${extension} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ stub: @@ -96,10 +90,5 @@ process SVDB_MERGE { ${create_cmd} ${prefix}.${extension} ${create_index} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - svdb: \$( echo \$(svdb) | head -1 | sed 's/usage: SVDB-\\([0-9]\\.[0-9]\\.[0-9]\\).*/\\1/' ) - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/svdb/merge/meta.yml b/modules/nf-core/svdb/merge/meta.yml index c34a9cb157..48d73e47ec 100644 --- a/modules/nf-core/svdb/merge/meta.yml +++ b/modules/nf-core/svdb/merge/meta.yml @@ -1,5 +1,6 @@ name: svdb_merge -description: The merge module merges structural variants within one or more vcf files. +description: The merge module merges structural variants within one or more vcf + files. keywords: - structural variants - vcf @@ -23,20 +24,20 @@ input: One or more VCF files. The order and number of files should correspond to the order and number of tags in the `priority` input channel. pattern: "*.{vcf,vcf.gz}" - - - input_priority: - type: list - description: | - Prioritize the input VCF files according to this list, - e.g ['tiddit','cnvnator']. The order and number of tags should correspond to - the order and number of VCFs in the `vcfs` input channel. - - - sort_inputs: - type: boolean - description: | - Should the input files be sorted by name. The priority tag will be sorted - together with it's corresponding VCF file. + - input_priority: + type: list + description: | + Prioritize the input VCF files according to this list, + e.g ['tiddit','cnvnator']. The order and number of tags should correspond to + the order and number of VCFs in the `vcfs` input channel. + - sort_inputs: + type: boolean + description: | + Should the input files be sorted by name. The priority tag will be sorted + together with it's corresponding VCF file. output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -45,8 +46,9 @@ output: type: file description: VCF output file pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" - - tbi: - - meta: + ontologies: [] + tbi: + - - meta: type: map description: | Groovy Map containing sample information @@ -55,8 +57,9 @@ output: type: file description: Alternative VCF file index pattern: "*.tbi" - - csi: - - meta: + ontologies: [] + csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -65,11 +68,47 @@ output: type: file description: Default VCF file index pattern: "*.csi" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_svdb: + - - ${task.process}: + type: string + description: The name of the process + - svdb: + type: string + description: The name of the tool + - svdb | sed -nE 's/.*SVDB-([0-9.]+).*/\1/p': + type: eval + description: The expression to obtain the version of the tool + versions_bcftools: + - - ${task.process}: + type: string + description: The name of the process + - bcftools: + type: string + description: The tool name + - bcftools --version | sed '1!d; s/^.*bcftools //': + type: eval + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - svdb: + type: string + description: The name of the tool + - svdb | sed -nE 's/.*SVDB-([0-9.]+).*/\1/p': + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - bcftools: + type: string + description: The tool name + - bcftools --version | sed '1!d; s/^.*bcftools //': + type: eval + description: The command used to generate the version of the tool authors: - "@ramprasadn" maintainers: diff --git a/modules/nf-core/tiddit/sv/environment.yml b/modules/nf-core/tiddit/sv/environment.yml index a33b14c85f..d00f5e3630 100644 --- a/modules/nf-core/tiddit/sv/environment.yml +++ b/modules/nf-core/tiddit/sv/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::tiddit=3.6.1 + - bioconda::tiddit=3.9.5 diff --git a/modules/nf-core/tiddit/sv/main.nf b/modules/nf-core/tiddit/sv/main.nf index f350e31443..fd0af3dd26 100644 --- a/modules/nf-core/tiddit/sv/main.nf +++ b/modules/nf-core/tiddit/sv/main.nf @@ -3,54 +3,44 @@ process TIDDIT_SV { label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tiddit:3.6.1--py38h24c8ff8_0' : - 'biocontainers/tiddit:3.6.1--py38h24c8ff8_0' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/6a/6a427ef9929eb787b83224b3c8dd5d1dd7f7897e6921c60ecc5e58ef705daf6b/data' : + 'community.wave.seqera.io/library/tiddit:3.9.5--3fb6c287f34e6ab0' }" input: tuple val(meta), path(input), path(input_index) - tuple val(meta2), path(fasta) + tuple val(meta2), path(fasta), path(fai) tuple val(meta3), path(bwa_index) output: - tuple val(meta), path("*.vcf") , emit: vcf - tuple val(meta), path("*.ploidies.tab"), emit: ploidy - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}.vcf") , emit: vcf + tuple val(meta), path("${prefix}.ploidies.tab"), emit: ploidy + tuple val("${task.process}"), val('tiddit'), eval("tiddit | sed -n 's/^usage: tiddit-//; s/ .*//p'"), topic: versions, emit: versions_tiddit when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def bwa_command = bwa_index ? "[[ -d $bwa_index ]] && for i in $bwa_index/*; do [[ -f $fasta && ! \"\$i\" =~ .*\"$fasta.\".* ]] && ln -s \$i ${fasta}.\${i##*.} || ln -s \$i .; done" : "" + prefix = task.ext.prefix ?: "${meta.id}" + def bwa_command = bwa_index ? "[[ -d ${bwa_index} ]] && for i in ${bwa_index}/*; do [[ -f ${fasta} && ! \"\$i\" =~ .*\"${fasta}.\".* ]] && ln -s \$i ${fasta}.\${i##*.} || ln -s \$i .; done" : "" """ $bwa_command tiddit \\ --sv \\ - $args \\ + ${args} \\ --threads $task.cpus \\ - --bam $input \\ - --ref $fasta \\ - -o $prefix - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') - END_VERSIONS + --bam ${input} \\ + --ref ${fasta} \\ + -o ${prefix} """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.vcf - touch ${prefix}.ploidies.tab - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tiddit: \$(echo \$(tiddit 2>&1) | sed 's/^.*tiddit-//; s/ .*\$//') - END_VERSIONS + echo "" > ${prefix}.vcf + echo "" > ${prefix}.ploidies.tab """ } diff --git a/modules/nf-core/tiddit/sv/meta.yml b/modules/nf-core/tiddit/sv/meta.yml index 21527baf13..78232760c1 100644 --- a/modules/nf-core/tiddit/sv/meta.yml +++ b/modules/nf-core/tiddit/sv/meta.yml @@ -10,7 +10,8 @@ tools: homepage: https://github.com/SciLifeLab/TIDDIT documentation: https://github.com/SciLifeLab/TIDDIT/blob/master/README.md doi: 10.12688/f1000research.11168.1 - licence: ["GPL-3.0-or-later"] + licence: + - "GPL-3.0-or-later" identifier: biotools:tiddit input: - - meta: @@ -22,10 +23,12 @@ input: type: file description: BAM/CRAM file pattern: "*.{bam,cram}" + ontologies: [] - input_index: type: file description: BAM/CRAM index file pattern: "*.{bai,crai}" + ontologies: [] - - meta2: type: map description: | @@ -35,6 +38,12 @@ input: type: file description: Input FASTA file pattern: "*.{fasta,fa}" + ontologies: [] + - fai: + type: file + description: Input FASTA index file + pattern: "*.{fai}" + ontologies: [] - - meta3: type: map description: | @@ -44,32 +53,51 @@ input: type: file description: BWA genome index files pattern: "Directory containing BWA index *.{amb,ann,bwt,pac,sa}" + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.vcf": + - "${prefix}.vcf": type: file description: vcf pattern: "*.{vcf}" - - ploidy: - - meta: + ontologies: [] + ploidy: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.ploidies.tab": + - "${prefix}.ploidies.tab": type: file description: tab pattern: "*.{ploidies.tab}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_tiddit: + - - ${task.process}: + type: string + description: The name of the process + - tiddit: + type: string + description: The name of the tool + - "tiddit | sed -n 's/^usage: tiddit-//; s/ .*//p'": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - tiddit: + type: string + description: The name of the tool + - "tiddit | sed -n 's/^usage: tiddit-//; s/ .*//p'": + type: eval + description: The expression to obtain the version of the tool authors: - "@maxulysse" maintainers: diff --git a/modules/nf-core/vcflib/vcffilter/main.nf b/modules/nf-core/vcflib/vcffilter/main.nf index 9a375df3fd..1df008acee 100644 --- a/modules/nf-core/vcflib/vcffilter/main.nf +++ b/modules/nf-core/vcflib/vcffilter/main.nf @@ -3,7 +3,7 @@ process VCFLIB_VCFFILTER { label 'process_low' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/fc/fc33d59c090cef123aca26ae17fbddbd596640304d8325cbd5816229fa2c05ee/data' : 'community.wave.seqera.io/library/vcflib:1.0.14--cc8ffb2c1a080797'}" @@ -12,7 +12,8 @@ process VCFLIB_VCFFILTER { output: tuple val(meta), path("*.vcf.gz"), emit: vcf - path "versions.yml", emit: versions + tuple val("${task.process}"), val('vcflib'), val("1.0.14"), topic: versions, emit: versions_vcflib + // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. when: task.ext.when == null || task.ext.when @@ -21,8 +22,7 @@ process VCFLIB_VCFFILTER { def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}.filter" - // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - def VERSION = '1.0.14' + if (!(args.contains("-f") || args.contains("--info-filter") || args.contains("-g") || args.contains("--genotype-filter"))) { error("VCFLIB_VCFFILTER requires either the -f/--info-filter or -g/--genotype-filter arguments to be supplied using ext.args.") } @@ -34,26 +34,15 @@ process VCFLIB_VCFFILTER { ${args} \\ ${vcf} \\ | bgzip -c ${args2} > ${prefix}.vcf.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - vcflib: ${VERSION} - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}.filter" - // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - def VERSION = '1.0.14' + if ("${vcf}" == "${prefix}.vcf.gz") { error("Input and output names are the same, set prefix in module configuration to disambiguate!") } """ echo | gzip > ${prefix}.vcf.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - vcflib: ${VERSION} - END_VERSIONS """ } diff --git a/modules/nf-core/vcflib/vcffilter/meta.yml b/modules/nf-core/vcflib/vcffilter/meta.yml index 3e51ce3531..4082514658 100644 --- a/modules/nf-core/vcflib/vcffilter/meta.yml +++ b/modules/nf-core/vcflib/vcffilter/meta.yml @@ -12,7 +12,8 @@ tools: documentation: "https://github.com/vcflib/vcflib" tool_dev_url: "https://github.com/vcflib/vcflib" doi: "10.1371/journal.pcbi.1009123" - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:vcflib input: - - meta: @@ -42,13 +43,27 @@ output: description: Filtered VCF file pattern: "*.{vcf.gz}" ontologies: [] + versions_vcflib: + - - ${task.process}: + type: string + description: The name of the process + - vcflib: + type: string + description: The name of the tool + - 1.0.14: + type: string + 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 + - vcflib: + type: string + description: The name of the tool + - 1.0.14: + type: string + description: The expression to obtain the version of the tool authors: - "@zachary-foster" maintainers: diff --git a/modules/nf-core/vcftools/environment.yml b/modules/nf-core/vcftools/environment.yml index ff0e9d03cd..121a7b865a 100644 --- a/modules/nf-core/vcftools/environment.yml +++ b/modules/nf-core/vcftools/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::vcftools=0.1.16 + - bioconda::vcftools=0.1.17 diff --git a/modules/nf-core/vcftools/main.nf b/modules/nf-core/vcftools/main.nf index 67bca9af0c..ad5e08b513 100644 --- a/modules/nf-core/vcftools/main.nf +++ b/modules/nf-core/vcftools/main.nf @@ -3,9 +3,9 @@ process VCFTOOLS { label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/vcftools:0.1.16--he513fc3_4' : - 'biocontainers/vcftools:0.1.16--he513fc3_4' }" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/vcftools:0.1.17--pl5321h077b44d_0' : + 'quay.io/biocontainers/vcftools:0.1.17--pl5321h077b44d_0' }" input: // Owing to the nature of vcftools we here provide solutions to working with optional bed files and optional @@ -79,7 +79,7 @@ process VCFTOOLS { tuple val(meta), path("*.diff.indv") , optional:true, emit: diff_indv tuple val(meta), path("*.diff.discordance.matrix"), optional:true, emit: diff_discd_matrix tuple val(meta), path("*.diff.switch") , optional:true, emit: diff_switch_error - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('vcftools'), eval('vcftools --version 2>&1 | sed "s/^.*VCFtools (//;s/).*//"'), emit: versions_vcftools, topic: versions when: task.ext.when == null || task.ext.when @@ -94,18 +94,18 @@ process VCFTOOLS { (args.contains('--hapcount')) ? "--hapcount ${bed}" : (args.contains('--positions')) ? "--positions ${bed}" : (args.contains('--exclude-positions')) ? "--exclude-positions ${bed}" : '' - args_list.removeIf { it.contains('--bed') } - args_list.removeIf { it.contains('--exclude-bed') } - args_list.removeIf { it.contains('--hapcount') } - args_list.removeIf { it.contains('--positions') } - args_list.removeIf { it.contains('--exclude-positions') } + args_list.removeIf { arg -> arg.contains('--bed') } + args_list.removeIf { arg -> arg.contains('--exclude-bed') } + args_list.removeIf { arg -> arg.contains('--hapcount') } + args_list.removeIf { arg -> arg.contains('--positions') } + args_list.removeIf { arg -> arg.contains('--exclude-positions') } def diff_variant_arg = (args.contains('--diff')) ? "--diff ${diff_variant_file}" : (args.contains('--gzdiff')) ? "--gzdiff ${diff_variant_file}" : (args.contains('--diff-bcf')) ? "--diff-bcf ${diff_variant_file}" : '' - args_list.removeIf { it.contains('--diff') } - args_list.removeIf { it.contains('--gzdiff') } - args_list.removeIf { it.contains('--diff-bcf') } + args_list.removeIf { arg -> arg.contains('--diff') } + args_list.removeIf { arg -> arg.contains('--gzdiff') } + args_list.removeIf { arg -> arg.contains('--diff-bcf') } def input_file = ("$variant_file".endsWith(".vcf")) ? "--vcf ${variant_file}" : ("$variant_file".endsWith(".vcf.gz")) ? "--gzvcf ${variant_file}" : @@ -118,11 +118,6 @@ process VCFTOOLS { ${args_list.join(' ')} \\ $bed_arg \\ $diff_variant_arg - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - vcftools: \$(echo \$(vcftools --version 2>&1) | sed 's/^.*VCFtools (//;s/).*//') - END_VERSIONS """ stub: @@ -190,10 +185,5 @@ process VCFTOOLS { touch ${prefix}.diff.indv touch ${prefix}.diff.discordance.matrix touch ${prefix}.diff.switch - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - vcftools: \$(echo \$(vcftools --version 2>&1) | sed 's/^.*VCFtools (//;s/).*//') - END_VERSIONS """ } diff --git a/modules/nf-core/vcftools/meta.yml b/modules/nf-core/vcftools/meta.yml index b9bae4df12..3e663da0b7 100644 --- a/modules/nf-core/vcftools/meta.yml +++ b/modules/nf-core/vcftools/meta.yml @@ -6,12 +6,13 @@ keywords: - sort tools: - vcftools: - description: A set of tools written in Perl and C++ for working with VCF files. - This package only contains the C++ libraries whereas the package perl-vcftools-vcf - contains the perl libraries + description: A set of tools written in Perl and C++ for working with VCF + files. This package only contains the C++ libraries whereas the package + perl-vcftools-vcf contains the perl libraries homepage: http://vcftools.sourceforge.net/ documentation: http://vcftools.sourceforge.net/man_latest.html - licence: ["LGPL"] + licence: + - "LGPL" identifier: biotools:vcftools input: - - meta: @@ -22,17 +23,20 @@ input: - variant_file: type: file description: variant input file which can be vcf, vcf.gz, or bcf format. - - - bed: - type: file - description: bed file which can be used with different arguments in vcftools - (optional) - - - diff_variant_file: - type: file - description: secondary variant file which can be used with the 'diff' suite - of tools (optional) + ontologies: [] + - bed: + type: file + description: bed file which can be used with different arguments in vcftools + (optional) + ontologies: [] + - diff_variant_file: + type: file + description: secondary variant file which can be used with the 'diff' suite + of tools (optional) + ontologies: [] output: - - vcf: - - meta: + vcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -41,8 +45,9 @@ output: type: file description: vcf file (optional) pattern: "*.vcf" - - bcf: - - meta: + ontologies: [] + bcf: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,8 +56,9 @@ output: type: file description: bcf file (optional) pattern: "*.bcf" - - frq: - - meta: + ontologies: [] + frq: + - - meta: type: map description: | Groovy Map containing sample information @@ -61,8 +67,9 @@ output: type: file description: Allele frequency for each site (optional) pattern: "*.frq" - - frq_count: - - meta: + ontologies: [] + frq_count: + - - meta: type: map description: | Groovy Map containing sample information @@ -71,8 +78,9 @@ output: type: file description: Allele counts for each site (optional) pattern: "*.frq.count" - - idepth: - - meta: + ontologies: [] + idepth: + - - meta: type: map description: | Groovy Map containing sample information @@ -81,8 +89,9 @@ output: type: file description: mean depth per individual (optional) pattern: "*.idepth" - - ldepth: - - meta: + ontologies: [] + ldepth: + - - meta: type: map description: | Groovy Map containing sample information @@ -91,18 +100,21 @@ output: type: file description: depth per site summed across individuals (optional) pattern: "*.ildepth" - - ldepth_mean: - - meta: + ontologies: [] + ldepth_mean: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.ldepth.mean": type: file - description: mean depth per site calculated across individuals (optional) + description: mean depth per site calculated across individuals + (optional) pattern: "*.ldepth.mean" - - gdepth: - - meta: + ontologies: [] + gdepth: + - - meta: type: map description: | Groovy Map containing sample information @@ -111,8 +123,9 @@ output: type: file description: depth for each genotype in vcf file (optional) pattern: "*.gdepth" - - hap_ld: - - meta: + ontologies: [] + hap_ld: + - - meta: type: map description: | Groovy Map containing sample information @@ -121,83 +134,94 @@ output: type: file description: r2, D, and D’ statistics using phased haplotypes (optional) pattern: "*.hap.ld" - - geno_ld: - - meta: + ontologies: [] + geno_ld: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.geno.ld": type: file - description: squared correlation coefficient between genotypes encoded as 0, - 1 and 2 to represent the number of non-reference alleles in each individual - (optional) + description: squared correlation coefficient between genotypes encoded + as 0, 1 and 2 to represent the number of non-reference alleles in each + individual (optional) pattern: "*.geno.ld" - - geno_chisq: - - meta: + ontologies: [] + geno_chisq: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.geno.chisq": type: file - description: test for genotype independence via the chi-squared statistic (optional) + description: test for genotype independence via the chi-squared + statistic (optional) pattern: "*.geno.chisq" - - list_hap_ld: - - meta: + ontologies: [] + list_hap_ld: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.list.hap.ld": type: file - description: r2 statistics of the sites contained in the provided input file - verses all other sites (optional) + description: r2 statistics of the sites contained in the provided input + file verses all other sites (optional) pattern: "*.list.hap.ld" - - list_geno_ld: - - meta: + ontologies: [] + list_geno_ld: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.list.geno.ld": type: file - description: r2 statistics of the sites contained in the provided input file - verses all other sites (optional) + description: r2 statistics of the sites contained in the provided input + file verses all other sites (optional) pattern: "*.list.geno.ld" - - interchrom_hap_ld: - - meta: + ontologies: [] + interchrom_hap_ld: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.interchrom.hap.ld": type: file - description: r2 statistics for sites (haplotypes) on different chromosomes (optional) + description: r2 statistics for sites (haplotypes) on different + chromosomes (optional) pattern: "*.interchrom.hap.ld" - - interchrom_geno_ld: - - meta: + ontologies: [] + interchrom_geno_ld: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.interchrom.geno.ld": type: file - description: r2 statistics for sites (genotypes) on different chromosomes (optional) + description: r2 statistics for sites (genotypes) on different + chromosomes (optional) pattern: "*.interchrom.geno.ld" - - tstv: - - meta: + ontologies: [] + tstv: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.TsTv": type: file - description: Transition / Transversion ratio in bins of size defined in options - (optional) + description: Transition / Transversion ratio in bins of size defined in + options (optional) pattern: "*.TsTv" - - tstv_summary: - - meta: + ontologies: [] + tstv_summary: + - - meta: type: map description: | Groovy Map containing sample information @@ -206,41 +230,45 @@ output: type: file description: Summary of all Transitions and Transversions (optional) pattern: "*.TsTv.summary" - - tstv_count: - - meta: + ontologies: [] + tstv_count: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.TsTv.count": type: file - description: Transition / Transversion ratio as a function of alternative allele - count (optional) + description: Transition / Transversion ratio as a function of + alternative allele count (optional) pattern: "*.TsTv.count" - - tstv_qual: - - meta: + ontologies: [] + tstv_qual: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.TsTv.qual": type: file - description: Transition / Transversion ratio as a function of SNP quality threshold - (optional) + description: Transition / Transversion ratio as a function of SNP + quality threshold (optional) pattern: "*.TsTv.qual" - - filter_summary: - - meta: + ontologies: [] + filter_summary: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.FILTER.summary": type: file - description: Summary of the number of SNPs and Ts/Tv ratio for each FILTER category - (optional) + description: Summary of the number of SNPs and Ts/Tv ratio for each + FILTER category (optional) pattern: "*.FILTER.summary" - - sites_pi: - - meta: + ontologies: [] + sites_pi: + - - meta: type: map description: | Groovy Map containing sample information @@ -249,29 +277,33 @@ output: type: file description: Nucleotide divergency on a per-site basis (optional) pattern: "*.sites.pi" - - windowed_pi: - - meta: + ontologies: [] + windowed_pi: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.windowed.pi": type: file - description: Nucleotide diversity in windows, with window size determined by - options (optional) + description: Nucleotide diversity in windows, with window size + determined by options (optional) pattern: "*windowed.pi" - - weir_fst: - - meta: + ontologies: [] + weir_fst: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.weir.fst": type: file - description: Fst estimate from Weir and Cockerham’s 1984 paper (optional) + description: Fst estimate from Weir and Cockerham’s 1984 paper + (optional) pattern: "*.weir.fst" - - heterozygosity: - - meta: + ontologies: [] + heterozygosity: + - - meta: type: map description: | Groovy Map containing sample information @@ -280,41 +312,46 @@ output: type: file description: Heterozygosity on a per-individual basis (optional) pattern: "*.het" - - hwe: - - meta: + ontologies: [] + hwe: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.hwe": type: file - description: Contains the Observed numbers of Homozygotes and Heterozygotes - and the corresponding Expected numbers under HWE (optional) + description: Contains the Observed numbers of Homozygotes and + Heterozygotes and the corresponding Expected numbers under HWE + (optional) pattern: "*.hwe" - - tajima_d: - - meta: + ontologies: [] + tajima_d: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.Tajima.D": type: file - description: Tajima’s D statistic in bins with size of the specified number - in options (optional) + description: Tajima’s D statistic in bins with size of the specified + number in options (optional) pattern: "*.Tajima.D" - - freq_burden: - - meta: + ontologies: [] + freq_burden: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.ifreqburden": type: file - description: Number of variants within each individual of a specific frequency - in options (optional) + description: Number of variants within each individual of a specific + frequency in options (optional) pattern: "*.ifreqburden" - - lroh: - - meta: + ontologies: [] + lroh: + - - meta: type: map description: | Groovy Map containing sample information @@ -323,30 +360,34 @@ output: type: file description: Long Runs of Homozygosity (optional) pattern: "*.LROH" - - relatedness: - - meta: + ontologies: [] + relatedness: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.relatedness": type: file - description: Relatedness statistic based on the method of Yang et al, Nature - Genetics 2010 (doi:10.1038/ng.608) (optional) + description: Relatedness statistic based on the method of Yang et al, + Nature Genetics 2010 (doi:10.1038/ng.608) (optional) pattern: "*.relatedness" - - relatedness2: - - meta: + ontologies: [] + relatedness2: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.relatedness2": type: file - description: Relatedness statistic based on the method of Manichaikul et al., - BIOINFORMATICS 2010 (doi:10.1093/bioinformatics/btq559) (optional) + description: Relatedness statistic based on the method of Manichaikul et + al., BIOINFORMATICS 2010 (doi:10.1093/bioinformatics/btq559) + (optional) pattern: "*.relatedness2" - - lqual: - - meta: + ontologies: [] + lqual: + - - meta: type: map description: | Groovy Map containing sample information @@ -355,8 +396,9 @@ output: type: file description: per-site SNP quality (optional) pattern: "*.lqual" - - missing_individual: - - meta: + ontologies: [] + missing_individual: + - - meta: type: map description: | Groovy Map containing sample information @@ -365,8 +407,9 @@ output: type: file description: Missingness on a per-individual basis (optional) pattern: "*.imiss" - - missing_site: - - meta: + ontologies: [] + missing_site: + - - meta: type: map description: | Groovy Map containing sample information @@ -375,18 +418,21 @@ output: type: file description: Missingness on a per-site basis (optional) pattern: "*.lmiss" - - snp_density: - - meta: + ontologies: [] + snp_density: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.snpden": type: file - description: Number and density of SNPs in bins of size defined by option (optional) + description: Number and density of SNPs in bins of size defined by + option (optional) pattern: "*.snpden" - - kept_sites: - - meta: + ontologies: [] + kept_sites: + - - meta: type: map description: | Groovy Map containing sample information @@ -395,8 +441,9 @@ output: type: file description: All sites that have been kept after filtering (optional) pattern: "*.kept.sites" - - removed_sites: - - meta: + ontologies: [] + removed_sites: + - - meta: type: map description: | Groovy Map containing sample information @@ -405,28 +452,33 @@ output: type: file description: All sites that have been removed after filtering (optional) pattern: "*.removed.sites" - - singeltons: - - meta: + ontologies: [] + singeltons: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.singletons": type: file - description: Location of singletons, and the individual they occur in (optional) + description: Location of singletons, and the individual they occur in + (optional) pattern: "*.singeltons" - - indel_hist: - - meta: + ontologies: [] + indel_hist: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.indel.hist": type: file - description: Histogram file of the length of all indels (including SNPs) (optional) + description: Histogram file of the length of all indels (including SNPs) + (optional) pattern: "*.indel_hist" - - hapcount: - - meta: + ontologies: [] + hapcount: + - - meta: type: map description: | Groovy Map containing sample information @@ -435,8 +487,9 @@ output: type: file description: Unique haplotypes within user specified bins (optional) pattern: "*.hapcount" - - mendel: - - meta: + ontologies: [] + mendel: + - - meta: type: map description: | Groovy Map containing sample information @@ -445,29 +498,33 @@ output: type: file description: Mendel errors identified in trios (optional) pattern: "*.mendel" - - format: - - meta: + ontologies: [] + format: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.FORMAT": type: file - description: Extracted information from the genotype fields in the VCF file - relating to a specified FORMAT identifier (optional) + description: Extracted information from the genotype fields in the VCF + file relating to a specified FORMAT identifier (optional) pattern: "*.FORMAT" - - info: - - meta: + ontologies: [] + info: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.INFO": type: file - description: Extracted information from the INFO field in the VCF file (optional) + description: Extracted information from the INFO field in the VCF file + (optional) pattern: "*.INFO" - - genotypes_matrix: - - meta: + ontologies: [] + genotypes_matrix: + - - meta: type: map description: | Groovy Map containing sample information @@ -480,40 +537,45 @@ output: Genotypes are represented as 0, 1 and 2, where the number represent that number of non-reference alleles. Missing genotypes are represented by -1 (optional) pattern: "*.012" - - genotypes_matrix_individual: - - meta: + ontologies: [] + genotypes_matrix_individual: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.012.indv": type: file - description: Details the individuals included in the main genotypes_matrix file - (optional) + description: Details the individuals included in the main + genotypes_matrix file (optional) pattern: "*.012.indv" - - genotypes_matrix_position: - - meta: + ontologies: [] + genotypes_matrix_position: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.012.pos": type: file - description: Details the site locations included in the main genotypes_matrix - file (optional) + description: Details the site locations included in the main + genotypes_matrix file (optional) pattern: "*.012.pos" - - impute_hap: - - meta: + ontologies: [] + impute_hap: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.impute.hap": type: file - description: Phased haplotypes in IMPUTE reference-panel format (optional) + description: Phased haplotypes in IMPUTE reference-panel format + (optional) pattern: "*.impute.hap" - - impute_hap_legend: - - meta: + ontologies: [] + impute_hap_legend: + - - meta: type: map description: | Groovy Map containing sample information @@ -522,8 +584,9 @@ output: type: file description: Impute haplotype legend file (optional) pattern: "*.impute.hap.legend" - - impute_hap_indv: - - meta: + ontologies: [] + impute_hap_indv: + - - meta: type: map description: | Groovy Map containing sample information @@ -532,8 +595,9 @@ output: type: file description: Impute haplotype individuals file (optional) pattern: "*.impute.hap.indv" - - ldhat_sites: - - meta: + ontologies: [] + ldhat_sites: + - - meta: type: map description: | Groovy Map containing sample information @@ -542,8 +606,9 @@ output: type: file description: Output data in LDhat format, sites (optional) pattern: "*.ldhat.sites" - - ldhat_locs: - - meta: + ontologies: [] + ldhat_locs: + - - meta: type: map description: | Groovy Map containing sample information @@ -552,8 +617,9 @@ output: type: file description: output data in LDhat format, locations (optional) pattern: "*.ldhat.locs" - - beagle_gl: - - meta: + ontologies: [] + beagle_gl: + - - meta: type: map description: | Groovy Map containing sample information @@ -562,8 +628,9 @@ output: type: file description: Genotype likelihoods for biallelic sites (optional) pattern: "*.BEAGLE.GL" - - beagle_pl: - - meta: + ontologies: [] + beagle_pl: + - - meta: type: map description: | Groovy Map containing sample information @@ -572,8 +639,9 @@ output: type: file description: Genotype likelihoods for biallelic sites (optional) pattern: "*.BEAGLE.PL" - - ped: - - meta: + ontologies: [] + ped: + - - meta: type: map description: | Groovy Map containing sample information @@ -582,8 +650,9 @@ output: type: file description: output the genotype data in PLINK PED format (optional) pattern: "*.ped" - - map_: - - meta: + ontologies: [] + map_: + - - meta: type: map description: | Groovy Map containing sample information @@ -592,8 +661,9 @@ output: type: file description: output the genotype data in PLINK PED format (optional) pattern: "*.map" - - tped: - - meta: + ontologies: [] + tped: + - - meta: type: map description: | Groovy Map containing sample information @@ -602,8 +672,9 @@ output: type: file description: output the genotype data in PLINK PED format (optional) pattern: "*.tped" - - tfam: - - meta: + ontologies: [] + tfam: + - - meta: type: map description: | Groovy Map containing sample information @@ -612,62 +683,69 @@ output: type: file description: output the genotype data in PLINK PED format (optional) pattern: "*.tfam" - - diff_sites_in_files: - - meta: + ontologies: [] + diff_sites_in_files: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.diff.sites_in_files": type: file - description: Sites that are common / unique to each file specified in optional - inputs (optional) + description: Sites that are common / unique to each file specified in + optional inputs (optional) pattern: "*.diff.sites.in.files" - - diff_indv_in_files: - - meta: + ontologies: [] + diff_indv_in_files: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.diff.indv_in_files": type: file - description: Individuals that are common / unique to each file specified in - optional inputs (optional) + description: Individuals that are common / unique to each file specified + in optional inputs (optional) pattern: "*.diff.indv.in.files" - - diff_sites: - - meta: + ontologies: [] + diff_sites: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.diff.sites": type: file - description: Discordance on a site by site basis, specified in optional inputs - (optional) + description: Discordance on a site by site basis, specified in optional + inputs (optional) pattern: "*.diff.sites" - - diff_indv: - - meta: + ontologies: [] + diff_indv: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.diff.indv": type: file - description: Discordance on a individual by individual basis, specified in optional - inputs (optional) + description: Discordance on a individual by individual basis, specified + in optional inputs (optional) pattern: "*.diff.indv" - - diff_discd_matrix: - - meta: + ontologies: [] + diff_discd_matrix: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.diff.discordance.matrix": type: file - description: Discordance matrix between files specified in optional inputs (optional) + description: Discordance matrix between files specified in optional + inputs (optional) pattern: "*.diff.discordance.matrix" - - diff_switch_error: - - meta: + ontologies: [] + diff_switch_error: + - - meta: type: map description: | Groovy Map containing sample information @@ -676,11 +754,30 @@ output: type: file description: Switch errors found between sites (optional) pattern: "*.diff.switch" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_vcftools: + - - ${task.process}: + type: string + description: The name of the process + - vcftools: + type: string + description: The name of the tool + - vcftools --version 2>&1 | sed "s/^.*VCFtools (//;s/).*//": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - vcftools: + type: string + description: The name of the tool + - vcftools --version 2>&1 | sed "s/^.*VCFtools (//;s/).*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@Mark-S-Hill" maintainers: diff --git a/subworkflows/local/bam_variant_calling_freebayes/main.nf b/subworkflows/local/bam_variant_calling_freebayes/main.nf index e2a8d4d452..9491697a8a 100644 --- a/subworkflows/local/bam_variant_calling_freebayes/main.nf +++ b/subworkflows/local/bam_variant_calling_freebayes/main.nf @@ -64,10 +64,8 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { // Index the filtered VCFs TABIX_VC_FREEBAYES_FILT(vcf_filtered) - versions = versions.mix(FREEBAYES.out.versions) versions = versions.mix(TABIX_VC_FREEBAYES.out.versions) versions = versions.mix(TABIX_VC_FREEBAYES_FILT.out.versions) - versions = versions.mix(VCFLIB_VCFFILTER.out.versions) emit: vcf_unfiltered = ch_vcf // channel: [ meta, vcf, tbi ] diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index d09184133a..2fe3ed51c6 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -204,7 +204,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_manta = BAM_VARIANT_CALLING_GERMLINE_MANTA.out.diploid_sv_vcf tbi_manta = BAM_VARIANT_CALLING_GERMLINE_MANTA.out.diploid_sv_vcf_tbi - versions = versions.mix(BAM_VARIANT_CALLING_GERMLINE_MANTA.out.versions) } // INDEXCOV, for WGS only @@ -352,7 +351,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_strelka = BAM_VARIANT_CALLING_SINGLE_STRELKA.out.vcf tbi_strelka = BAM_VARIANT_CALLING_SINGLE_STRELKA.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_SINGLE_STRELKA.out.versions) } // TIDDIT @@ -361,12 +359,12 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { cram, // Remap channel to match module/subworkflow fasta, + fasta_fai, bwa ) vcf_tiddit = BAM_VARIANT_CALLING_SINGLE_TIDDIT.out.vcf tbi_tiddit = BAM_VARIANT_CALLING_SINGLE_TIDDIT.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_SINGLE_TIDDIT.out.versions) } vcf_all = channel.empty().mix( diff --git a/subworkflows/local/bam_variant_calling_germline_manta/main.nf b/subworkflows/local/bam_variant_calling_germline_manta/main.nf index 27289fb833..f81dd5c75e 100644 --- a/subworkflows/local/bam_variant_calling_germline_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_manta/main.nf @@ -15,7 +15,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_MANTA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi] or [ [], []] if no intervals; intervals file contains all intervals main: - versions = channel.empty() // Combine cram and intervals, account for 0 intervals cram_intervals = cram.combine(intervals).map{ combined -> @@ -35,8 +34,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_MANTA { diploid_sv_vcf = MANTA_GERMLINE.out.diploid_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } diploid_sv_vcf_tbi = MANTA_GERMLINE.out.diploid_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } - versions = versions.mix(MANTA_GERMLINE.out.versions) - emit: candidate_small_indels_vcf candidate_small_indels_vcf_tbi @@ -45,5 +42,4 @@ workflow BAM_VARIANT_CALLING_GERMLINE_MANTA { diploid_sv_vcf diploid_sv_vcf_tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_single_strelka/main.nf b/subworkflows/local/bam_variant_calling_single_strelka/main.nf index 004a57ca2c..6b8dbc3b9f 100644 --- a/subworkflows/local/bam_variant_calling_single_strelka/main.nf +++ b/subworkflows/local/bam_variant_calling_single_strelka/main.nf @@ -17,7 +17,6 @@ workflow BAM_VARIANT_CALLING_SINGLE_STRELKA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi, num_intervals ] or [ [], [], 0 ] if no intervals main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) @@ -64,11 +63,8 @@ workflow BAM_VARIANT_CALLING_SINGLE_STRELKA { // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], tbi ] } - versions = versions.mix(STRELKA_SINGLE.out.versions) - emit: vcf tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_single_tiddit/main.nf b/subworkflows/local/bam_variant_calling_single_tiddit/main.nf index cea076093f..001fabc257 100644 --- a/subworkflows/local/bam_variant_calling_single_tiddit/main.nf +++ b/subworkflows/local/bam_variant_calling_single_tiddit/main.nf @@ -11,12 +11,12 @@ workflow BAM_VARIANT_CALLING_SINGLE_TIDDIT { take: cram fasta + fasta_fai bwa main: - versions = channel.empty() - TIDDIT_SV(cram, fasta, bwa) + TIDDIT_SV(cram, fasta.combine(fasta_fai).map { fasta_meta, fasta_path, _fai_meta, fai_path -> [ fasta_meta, fasta_path, fai_path ] }, bwa) TABIX_BGZIP_TIDDIT_SV(TIDDIT_SV.out.vcf) @@ -24,11 +24,8 @@ workflow BAM_VARIANT_CALLING_SINGLE_TIDDIT { vcf = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, gz, _tbi -> [meta + [variantcaller: 'tiddit'], gz] } tbi = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, _gz, tbi -> [meta + [variantcaller: 'tiddit'], tbi] } - versions = versions.mix(TIDDIT_SV.out.versions) - emit: ploidy vcf tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index b856eaac93..10a7b40b8f 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -165,7 +165,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_manta = BAM_VARIANT_CALLING_SOMATIC_MANTA.out.diploid_sv_vcf.mix(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.somatic_sv_vcf) tbi_manta = BAM_VARIANT_CALLING_SOMATIC_MANTA.out.diploid_sv_vcf_tbi.mix(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.somatic_sv_vcf_tbi) - versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.versions) } @@ -200,7 +199,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_strelka = BAM_VARIANT_CALLING_SOMATIC_STRELKA.out.vcf tbi_strelka = BAM_VARIANT_CALLING_SOMATIC_STRELKA.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_STRELKA.out.versions) } // MSISENSORPRO @@ -279,12 +277,12 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { cram.map { meta, normal_cram, normal_crai, _tumor_cram, _tumor_crai -> [meta, normal_cram, normal_crai] }, cram.map { meta, _normal_cram, _normal_crai, tumor_cram, tumor_crai -> [meta, tumor_cram, tumor_crai] }, fasta, + fasta_fai, bwa, ) vcf_tiddit = BAM_VARIANT_CALLING_SOMATIC_TIDDIT.out.vcf tbi_tiddit = BAM_VARIANT_CALLING_SOMATIC_TIDDIT.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_TIDDIT.out.versions) } vcf_all = channel.empty() diff --git a/subworkflows/local/bam_variant_calling_somatic_manta/main.nf b/subworkflows/local/bam_variant_calling_somatic_manta/main.nf index f1766192c8..ce4abac08d 100644 --- a/subworkflows/local/bam_variant_calling_somatic_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_manta/main.nf @@ -14,7 +14,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MANTA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi ] or [ [], [] ] if no intervals main: - versions = channel.empty() // Combine cram and intervals, account for 0 intervals cram_intervals = cram.combine(intervals).map{ combined -> @@ -36,8 +35,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MANTA { somatic_sv_vcf = MANTA_SOMATIC.out.somatic_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } somatic_sv_vcf_tbi = MANTA_SOMATIC.out.somatic_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } - versions = versions.mix(MANTA_SOMATIC.out.versions) - emit: candidate_small_indels_vcf candidate_small_indels_vcf_tbi @@ -48,5 +45,4 @@ workflow BAM_VARIANT_CALLING_SOMATIC_MANTA { somatic_sv_vcf somatic_sv_vcf_tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf b/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf index ae73178155..001e021e47 100644 --- a/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_strelka/main.nf @@ -17,7 +17,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_STRELKA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi, num_intervals ] or [ [], [], 0 ] if no intervals main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram.combine(intervals) @@ -70,11 +69,8 @@ workflow BAM_VARIANT_CALLING_SOMATIC_STRELKA { // add variantcaller to meta map and remove no longer necessary field: num_intervals .map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'strelka' ], tbi ] } - versions = versions.mix(STRELKA_SOMATIC.out.versions) - emit: vcf tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf b/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf index 30eed94927..73d9cc9ef3 100644 --- a/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_tiddit/main.nf @@ -13,26 +13,20 @@ workflow BAM_VARIANT_CALLING_SOMATIC_TIDDIT { cram_normal cram_tumor fasta + fasta_fai bwa main: - versions = channel.empty() - - TIDDIT_NORMAL(cram_normal, fasta, bwa) - TIDDIT_TUMOR(cram_tumor, fasta, bwa) + TIDDIT_NORMAL(cram_normal, fasta, fasta_fai, bwa) + TIDDIT_TUMOR(cram_tumor, fasta, fasta_fai, bwa) SVDB_MERGE(TIDDIT_NORMAL.out.vcf.join(TIDDIT_TUMOR.out.vcf, failOnDuplicate: true, failOnMismatch: true).map{ meta, vcf_normal, vcf_tumor -> [ meta, [vcf_normal, vcf_tumor] ] }, false, true) vcf = SVDB_MERGE.out.vcf.map{ meta, vcf -> [ meta + [ variantcaller:'tiddit' ], vcf ] } tbi = SVDB_MERGE.out.tbi.map{ meta, tbi -> [ meta + [ variantcaller:'tiddit' ], tbi ] } - versions = versions.mix(TIDDIT_NORMAL.out.versions) - versions = versions.mix(TIDDIT_TUMOR.out.versions) - versions = versions.mix(SVDB_MERGE.out.versions) - emit: - versions vcf tbi } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 91afd8a217..12e2e570e5 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -167,7 +167,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { ) vcf_lofreq = BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ.out.vcf tbi_lofreq = BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ.out.versions) } // MANTA @@ -181,7 +180,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { vcf_manta = BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.tumor_sv_vcf tbi_manta = BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.tumor_sv_vcf_tbi - versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA.out.versions) } // TIDDIT @@ -189,12 +187,12 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { BAM_VARIANT_CALLING_SINGLE_TIDDIT( cram, fasta, + fasta_fai, bwa, ) vcf_tiddit = BAM_VARIANT_CALLING_SINGLE_TIDDIT.out.vcf tbi_tiddit = BAM_VARIANT_CALLING_SINGLE_TIDDIT.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_SINGLE_TIDDIT.out.versions) } // TNSCOPE diff --git a/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf index fd38480bbc..e8852db2e4 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_lofreq/main.nf @@ -10,7 +10,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ { dict // channel: /path/to/reference/fasta/dictionary main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy input_intervals = input.combine(intervals) @@ -43,10 +42,7 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_LOFREQ { vcf = channel.empty().mix(MERGE_LOFREQ.out.vcf, vcf_branch.no_intervals).map{ meta, vcf -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'lofreq' ], vcf ] } tbi = channel.empty().mix(MERGE_LOFREQ.out.tbi, tbi_branch.no_intervals).map{ meta, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'lofreq' ], tbi ] } - versions = versions.mix(LOFREQ.out.versions) - emit: vcf tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf index 380121ef9b..3e0c289604 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_manta/main.nf @@ -15,7 +15,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA { intervals // channel: [mandatory] [ interval.bed.gz, interval.bed.gz.tbi ] or [ [], [] ] if no intervals main: - versions = channel.empty() // Combine cram and intervals, account for 0 intervals cram_intervals = cram.combine(intervals).map{ combined -> @@ -35,8 +34,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA { tumor_sv_vcf = MANTA_TUMORONLY.out.tumor_sv_vcf.map{ meta, vcf -> [ meta + [ variantcaller:'manta' ], vcf ] } tumor_sv_vcf_tbi = MANTA_TUMORONLY.out.tumor_sv_vcf_tbi.map{ meta, tbi -> [ meta + [ variantcaller:'manta' ], tbi ] } - versions = versions.mix(MANTA_TUMORONLY.out.versions) - emit: candidate_small_indels_vcf candidate_small_indels_vcf_tbi @@ -45,5 +42,4 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_MANTA { tumor_sv_vcf tumor_sv_vcf_tbi - versions } diff --git a/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf b/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf index 85aa418968..031802d638 100644 --- a/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf +++ b/subworkflows/local/vcf_qc_bcftools_vcftools/main.nf @@ -10,20 +10,15 @@ workflow VCF_QC_BCFTOOLS_VCFTOOLS { main: - versions = channel.empty() - BCFTOOLS_STATS(vcf.map{ meta, vcf_ -> [ meta, vcf_, [] ] }, [[:],[]], [[:],[]], [[:],[]], [[:],[]], [[:],[]]) VCFTOOLS_TSTV_COUNT(vcf, target_bed, []) VCFTOOLS_TSTV_QUAL(vcf, target_bed, []) VCFTOOLS_SUMMARY(vcf, target_bed, []) - versions = versions.mix(VCFTOOLS_TSTV_COUNT.out.versions) - emit: bcftools_stats = BCFTOOLS_STATS.out.stats vcftools_tstv_counts = VCFTOOLS_TSTV_COUNT.out.tstv_count vcftools_tstv_qual = VCFTOOLS_TSTV_QUAL.out.tstv_qual vcftools_filter_summary = VCFTOOLS_SUMMARY.out.filter_summary - versions } diff --git a/tests/aligner-parabricks.nf.test.snap b/tests/aligner-parabricks.nf.test.snap index bcd4637927..5eba11e3e1 100644 --- a/tests/aligner-parabricks.nf.test.snap +++ b/tests/aligner-parabricks.nf.test.snap @@ -525,8 +525,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/bbsplit.nf.test.snap b/tests/bbsplit.nf.test.snap index f465be1784..7a68e41943 100644 --- a/tests/bbsplit.nf.test.snap +++ b/tests/bbsplit.nf.test.snap @@ -58,8 +58,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -422,8 +428,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index c578704c66..c2f891429b 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -52,8 +52,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -379,8 +385,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/joint_calling_haplotypecaller.nf.test.snap b/tests/joint_calling_haplotypecaller.nf.test.snap index 964d5f4f53..dd4c356dfe 100644 --- a/tests/joint_calling_haplotypecaller.nf.test.snap +++ b/tests/joint_calling_haplotypecaller.nf.test.snap @@ -41,8 +41,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -287,8 +293,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/joint_calling_mutect2.nf.test.snap b/tests/joint_calling_mutect2.nf.test.snap index 6721c744eb..2ecca9bc76 100644 --- a/tests/joint_calling_mutect2.nf.test.snap +++ b/tests/joint_calling_mutect2.nf.test.snap @@ -32,8 +32,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -266,8 +272,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/postprocess_concatenation.nf.test.snap b/tests/postprocess_concatenation.nf.test.snap index 0efeecd74f..9eb4b11103 100644 --- a/tests/postprocess_concatenation.nf.test.snap +++ b/tests/postprocess_concatenation.nf.test.snap @@ -57,8 +57,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/postprocess_concatenation_normalization.nf.test.snap b/tests/postprocess_concatenation_normalization.nf.test.snap index b37818373b..3c4a7ecd72 100644 --- a/tests/postprocess_concatenation_normalization.nf.test.snap +++ b/tests/postprocess_concatenation_normalization.nf.test.snap @@ -66,8 +66,14 @@ "VCFS_NORM_SORT": { "bcftools": "1.23.1" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -394,8 +400,14 @@ "VCFS_NORM_SORT": { "bcftools": "1.23.1" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/postprocess_consensus.nf.test.snap b/tests/postprocess_consensus.nf.test.snap index 03d1848ea3..4273d70f6d 100644 --- a/tests/postprocess_consensus.nf.test.snap +++ b/tests/postprocess_consensus.nf.test.snap @@ -67,8 +67,14 @@ "VCFS_NORM_SORT": { "bcftools": "1.23.1" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -430,8 +436,14 @@ "VCFS_NORM_SORT": { "bcftools": "1.23.1" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -759,8 +771,14 @@ "VCFS_NORM_SORT": { "bcftools": "1.23.1" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/postprocess_filtering.nf.test.snap b/tests/postprocess_filtering.nf.test.snap index f31b3554e2..b985b4bbda 100644 --- a/tests/postprocess_filtering.nf.test.snap +++ b/tests/postprocess_filtering.nf.test.snap @@ -47,8 +47,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/postprocess_normalization.nf.test.snap b/tests/postprocess_normalization.nf.test.snap index 2184783e7e..6465eb8a6e 100644 --- a/tests/postprocess_normalization.nf.test.snap +++ b/tests/postprocess_normalization.nf.test.snap @@ -57,8 +57,14 @@ "VCFS_NORM_SORT": { "bcftools": "1.23.1" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/postprocess_varlociraptor.nf.test.snap b/tests/postprocess_varlociraptor.nf.test.snap index 2cbbd34d14..30076c3c58 100644 --- a/tests/postprocess_varlociraptor.nf.test.snap +++ b/tests/postprocess_varlociraptor.nf.test.snap @@ -95,8 +95,14 @@ "VARLOCIRAPTOR_PREPROCESS": { "varlociraptor": "8.9.5" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -400,8 +406,14 @@ "VARLOCIRAPTOR_PREPROCESS": { "varlociraptor": "8.9.5" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -648,8 +660,14 @@ "VARLOCIRAPTOR_PREPROCESS": { "varlociraptor": "8.9.5" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/save_output_as_bam.nf.test.snap b/tests/save_output_as_bam.nf.test.snap index 6ecc236aa4..52c8d0fe9d 100644 --- a/tests/save_output_as_bam.nf.test.snap +++ b/tests/save_output_as_bam.nf.test.snap @@ -70,8 +70,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/start_from_preparerecalibration.nf.test.snap b/tests/start_from_preparerecalibration.nf.test.snap index 45e514d232..cb9de0448b 100644 --- a/tests/start_from_preparerecalibration.nf.test.snap +++ b/tests/start_from_preparerecalibration.nf.test.snap @@ -170,8 +170,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -298,8 +304,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/start_from_recalibration.nf.test.snap b/tests/start_from_recalibration.nf.test.snap index aa77cbc709..b5143c63bc 100644 --- a/tests/start_from_recalibration.nf.test.snap +++ b/tests/start_from_recalibration.nf.test.snap @@ -150,8 +150,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -278,8 +284,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/tumor-normal-pair.nf.test.snap b/tests/tumor-normal-pair.nf.test.snap index 17b602b3c5..2e35492574 100644 --- a/tests/tumor-normal-pair.nf.test.snap +++ b/tests/tumor-normal-pair.nf.test.snap @@ -55,8 +55,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/umi_in_read_names.nf.test.snap b/tests/umi_in_read_names.nf.test.snap index 3c42b848d9..29202ec5b1 100644 --- a/tests/umi_in_read_names.nf.test.snap +++ b/tests/umi_in_read_names.nf.test.snap @@ -45,8 +45,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -341,8 +347,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index 4415537702..c24a31fb1f 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -87,8 +87,8 @@ "strelka": "2.9.10" }, "SVDB_MERGE": { - "bcftools": 1.21, - "svdb": "2.8.2" + "bcftools": "1.23", + "svdb": "2.8.4" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -109,13 +109,19 @@ "tabix": 1.21 }, "TIDDIT_SV": { - "tiddit": "3.6.1" + "tiddit": "3.9.5" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -566,9 +572,9 @@ "test2_vs_test.strelka.somatic_indels.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f", "test2_vs_test.strelka.somatic_snvs.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "test2_vs_test.strelka.somatic_snvs.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f", - "test.tiddit.FILTER.summary:md5,2cb5598e2a83870e162787c5025c9518", + "test.tiddit.FILTER.summary:md5,34b4490cb507e54bce2cdff5d5594508", "test.tiddit.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", - "test2_vs_test.tiddit_sv_merge.FILTER.summary:md5,2cb5598e2a83870e162787c5025c9518", + "test2_vs_test.tiddit_sv_merge.FILTER.summary:md5,34b4490cb507e54bce2cdff5d5594508", "test2_vs_test.tiddit_sv_merge.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f", "genome.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "genome.target.bed:md5,ab3aafe8cc4cc3f1c40d527dfad64fda", @@ -624,10 +630,10 @@ "test.strelka.variants.vcf.gz:md5,666f835fdaf4952a179cdedd40c9d565", "test2_vs_test.strelka.somatic_indels.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e", "test2_vs_test.strelka.somatic_snvs.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.tiddit.vcf.gz:md5,c74645590b3d3c8d5f34e1e681ccd05b", - "test2_vs_test.tiddit.normal.vcf.gz:md5,c74645590b3d3c8d5f34e1e681ccd05b", - "test2_vs_test.tiddit.tumor.vcf.gz:md5,a4a162ddf9a49df61c62abbf704e2d19", - "test2_vs_test.tiddit_sv_merge.vcf.gz:md5,9105fb1263deef2521b302b38d77cad7" + "test.tiddit.vcf.gz:md5,73a3716cb5280de3f7e70b5eaf6dd1d", + "test2_vs_test.tiddit.normal.vcf.gz:md5,73a3716cb5280de3f7e70b5eaf6dd1d", + "test2_vs_test.tiddit.tumor.vcf.gz:md5,4dfb5e0e5aa2c961d887a1633167ba71", + "test2_vs_test.tiddit_sv_merge.vcf.gz:md5,720f6c1c5b88e02529cb62d7d3d0a543" ], [ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998513#1/1", @@ -737,13 +743,19 @@ "tabix": 1.21 }, "TIDDIT_SV": { - "tiddit": "3.6.1" + "tiddit": "3.9.5" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -1089,7 +1101,7 @@ "test.freebayes.filtered.TsTv.count:md5,845f64e5bb4224af98f3a47294cd5483", "test.strelka.variants.FILTER.summary:md5,dd87f507da7de20d5318841af312493b", "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", - "test.tiddit.FILTER.summary:md5,2cb5598e2a83870e162787c5025c9518", + "test.tiddit.FILTER.summary:md5,34b4490cb507e54bce2cdff5d5594508", "test.tiddit.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "genome.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "genome.target.bed:md5,ab3aafe8cc4cc3f1c40d527dfad64fda", @@ -1122,7 +1134,7 @@ "test.freebayes.filtered.vcf.gz:md5,bf085c88aa26191a55fbd23bff6a498f", "test.strelka.genome.vcf.gz:md5,16437a040679d88b7d84a9276f793d6c", "test.strelka.variants.vcf.gz:md5,666f835fdaf4952a179cdedd40c9d565", - "test.tiddit.vcf.gz:md5,ac44cc2f44ebec84f5377e3274131876" + "test.tiddit.vcf.gz:md5,5e603e7e628756413a2056ea873e14e1" ], [ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" @@ -1231,13 +1243,19 @@ "tabix": 1.21 }, "TIDDIT_SV": { - "tiddit": "3.6.1" + "tiddit": "3.9.5" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -1557,7 +1575,7 @@ "test2.freebayes.filtered.TsTv.count:md5,60b173b4a649483b651fcfedf1f5d790", "test2.mutect2.filtered.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "test2.mutect2.filtered.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", - "test2.tiddit.FILTER.summary:md5,cea83f893b7e8a5744bde7c54486013a", + "test2.tiddit.FILTER.summary:md5,d35d41bdd3566a05c48057b8ca3d0e64", "test2.tiddit.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "cnvkit.reference.antitarget-tmp.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "cnvkit.reference.target-tmp.bed:md5,14a7ba28453f8c8fc6ba5b044c517291", @@ -1579,7 +1597,7 @@ "test2.freebayes.filtered.vcf.gz:md5,8461ef8ccf651775bde7c29d0e563474", "test2.mutect2.filtered.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e", "test2.mutect2.vcf.gz:md5,d41d8cd98f00b204e9800998ecf8427e", - "test2.tiddit.vcf.gz:md5,a4a162ddf9a49df61c62abbf704e2d19" + "test2.tiddit.vcf.gz:md5,4dfb5e0e5aa2c961d887a1633167ba71" ], [ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998513#1/1", diff --git a/tests/variant_calling_deepvariant.nf.test.snap b/tests/variant_calling_deepvariant.nf.test.snap index 8e01a6b047..d713e12cbd 100644 --- a/tests/variant_calling_deepvariant.nf.test.snap +++ b/tests/variant_calling_deepvariant.nf.test.snap @@ -29,8 +29,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -214,8 +220,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -355,8 +367,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -499,8 +517,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_freebayes.nf.test.snap b/tests/variant_calling_freebayes.nf.test.snap index 94c0efd52b..c8c585f4d9 100644 --- a/tests/variant_calling_freebayes.nf.test.snap +++ b/tests/variant_calling_freebayes.nf.test.snap @@ -41,8 +41,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -265,8 +271,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -683,8 +695,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -1039,8 +1057,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -1370,8 +1394,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -1604,8 +1634,14 @@ "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_haplotypecaller.nf.test.snap b/tests/variant_calling_haplotypecaller.nf.test.snap index 3d2db0137f..7016f600b7 100644 --- a/tests/variant_calling_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_haplotypecaller.nf.test.snap @@ -19,8 +19,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -206,8 +212,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -392,8 +404,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -588,8 +606,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_lofreq.nf.test.snap b/tests/variant_calling_lofreq.nf.test.snap index 57807564f3..dae6d760ce 100644 --- a/tests/variant_calling_lofreq.nf.test.snap +++ b/tests/variant_calling_lofreq.nf.test.snap @@ -28,6 +28,12 @@ "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { "bgzip": "1.21", "tabix": "1.21" + }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -206,6 +212,12 @@ "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", "tabix": "1.21" + }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_manta.nf.test.snap b/tests/variant_calling_manta.nf.test.snap index b5b032807a..b24430a374 100644 --- a/tests/variant_calling_manta.nf.test.snap +++ b/tests/variant_calling_manta.nf.test.snap @@ -26,8 +26,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -172,8 +178,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -324,8 +336,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -516,8 +534,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -675,8 +699,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -906,8 +936,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -1088,8 +1124,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_mpileup.nf.test.snap b/tests/variant_calling_mpileup.nf.test.snap index 9cf0aebfc4..d4536963aa 100644 --- a/tests/variant_calling_mpileup.nf.test.snap +++ b/tests/variant_calling_mpileup.nf.test.snap @@ -26,8 +26,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -202,8 +208,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -381,8 +393,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -567,8 +585,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_muse.nf.test.snap b/tests/variant_calling_muse.nf.test.snap index 7bb29f3633..cb8540dbbb 100644 --- a/tests/variant_calling_muse.nf.test.snap +++ b/tests/variant_calling_muse.nf.test.snap @@ -36,8 +36,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -210,8 +216,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_mutect2.nf.test.snap b/tests/variant_calling_mutect2.nf.test.snap index a6adc2992f..c905361d6e 100644 --- a/tests/variant_calling_mutect2.nf.test.snap +++ b/tests/variant_calling_mutect2.nf.test.snap @@ -25,8 +25,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -219,8 +225,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -426,8 +438,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -634,8 +652,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_sentieon_dnascope.nf.test.snap b/tests/variant_calling_sentieon_dnascope.nf.test.snap index 4de48c9aaa..1440d01f1a 100644 --- a/tests/variant_calling_sentieon_dnascope.nf.test.snap +++ b/tests/variant_calling_sentieon_dnascope.nf.test.snap @@ -29,8 +29,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -218,8 +224,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -416,8 +428,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap index 9375b5cee3..c50574d646 100644 --- a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap @@ -50,8 +50,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -241,8 +247,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -433,8 +445,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -625,8 +643,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_sentieon_tnscope.nf.test.snap b/tests/variant_calling_sentieon_tnscope.nf.test.snap index ee0421f02f..924500df0d 100644 --- a/tests/variant_calling_sentieon_tnscope.nf.test.snap +++ b/tests/variant_calling_sentieon_tnscope.nf.test.snap @@ -30,8 +30,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -117,8 +123,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -220,8 +232,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -318,8 +336,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_strelka.nf.test.snap b/tests/variant_calling_strelka.nf.test.snap index 058077e09f..11ec9a4495 100644 --- a/tests/variant_calling_strelka.nf.test.snap +++ b/tests/variant_calling_strelka.nf.test.snap @@ -29,8 +29,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -251,8 +257,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -436,8 +448,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -677,8 +695,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -858,8 +882,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_strelka_bp.nf.test.snap b/tests/variant_calling_strelka_bp.nf.test.snap index 043b22d8fe..a24394f377 100644 --- a/tests/variant_calling_strelka_bp.nf.test.snap +++ b/tests/variant_calling_strelka_bp.nf.test.snap @@ -28,8 +28,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -301,8 +307,14 @@ "bgzip": "1.21", "tabix": "1.21" }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" + }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/tests/variant_calling_tiddit.nf.test.snap b/tests/variant_calling_tiddit.nf.test.snap index 40c6991379..2b872c1619 100644 --- a/tests/variant_calling_tiddit.nf.test.snap +++ b/tests/variant_calling_tiddit.nf.test.snap @@ -28,10 +28,16 @@ "tabix": "1.21" }, "TIDDIT_SV": { - "tiddit": "3.6.1" + "tiddit": "3.9.5" + }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -186,10 +192,16 @@ "tabix": "1.21" }, "TIDDIT_SV": { - "tiddit": "3.6.1" + "tiddit": "3.9.5" + }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ @@ -332,8 +344,8 @@ "samtools": 1.21 }, "SVDB_MERGE": { - "bcftools": 1.21, - "svdb": "2.8.2" + "bcftools": "1.23", + "svdb": "2.8.4" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -348,10 +360,16 @@ "tabix": "1.21" }, "TIDDIT_SV": { - "tiddit": "3.6.1" + "tiddit": "3.9.5" + }, + "VCFTOOLS_SUMMARY": { + "vcftools": "0.1.17" }, "VCFTOOLS_TSTV_COUNT": { - "vcftools": "0.1.16" + "vcftools": "0.1.17" + }, + "VCFTOOLS_TSTV_QUAL": { + "vcftools": "0.1.17" } }, [ diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 2ee53dc1be..eef91cfbc7 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -551,7 +551,6 @@ workflow SAREK { versions = versions.mix(BAM_VARIANT_CALLING_GERMLINE_ALL.out.versions) versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_ALL.out.versions) versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_ALL.out.versions) - versions = versions.mix(VCF_QC_BCFTOOLS_VCFTOOLS.out.versions) versions = versions.mix(POST_VARIANTCALLING.out.versions) // ANNOTATE From ac5e751eb030e3eb467cf8f97bbb730668fe8b5f Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Mon, 27 Jul 2026 14:42:13 +0200 Subject: [PATCH 17/27] chore(modules): migrate samtools modules to versions topic channel (#2241) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates the nf-core `samtools/*` modules to the `versions` topic channel. **Stacked on #2240** (base: `topic/variant-calling`). ### Changes - Updates `samtools/{bam2fq,collatefastq,convert,faidx,index,merge,mpileup,stats,view}` to their topic-channel versions. - Removes the corresponding `.out.versions` wiring. - Reworks call sites for the new input signatures: `fasta`+`fai` combined into one `[meta, fasta, fai]` tuple (faidx/convert/merge/view), `index_files`/`gzi` added to merge inputs, `view` given fai + qname-tuple + bed-tuple. - Tool bumps: samtools 1.21 → 1.24, htslib 1.21 → 1.24 (for the samtools modules). Test snapshots need regenerating in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- .github/actions/get-shards/action.yml | 10 +- .github/actions/nf-test/action.yml | 46 +++++- .github/workflows/nf-test-gpu.yml | 7 + .github/workflows/nf-test-sentieon.yml | 7 + .github/workflows/nf-test.yml | 7 + CHANGELOG.md | 4 + modules.json | 20 +-- modules/nf-core/mosdepth/environment.yml | 6 +- modules/nf-core/mosdepth/main.nf | 42 +++--- modules/nf-core/mosdepth/meta.yml | 126 +++++++++++----- .../nf-core/samtools/bam2fq/environment.yml | 7 +- modules/nf-core/samtools/bam2fq/main.nf | 61 +++++--- modules/nf-core/samtools/bam2fq/meta.yml | 72 +++++++--- .../samtools/collatefastq/environment.yml | 7 +- modules/nf-core/samtools/collatefastq/main.nf | 73 +++++----- .../nf-core/samtools/collatefastq/meta.yml | 108 ++++++++------ .../nf-core/samtools/convert/environment.yml | 6 +- modules/nf-core/samtools/convert/main.nf | 37 ++--- modules/nf-core/samtools/convert/meta.yml | 55 ++++--- .../nf-core/samtools/faidx/environment.yml | 6 +- modules/nf-core/samtools/faidx/main.nf | 36 ++--- modules/nf-core/samtools/faidx/meta.yml | 39 +++-- .../nf-core/samtools/index/environment.yml | 6 +- modules/nf-core/samtools/index/main.nf | 35 ++--- modules/nf-core/samtools/index/meta.yml | 61 ++++---- .../nf-core/samtools/merge/environment.yml | 6 +- modules/nf-core/samtools/merge/main.nf | 48 +++---- modules/nf-core/samtools/merge/meta.yml | 82 ++++++----- .../nf-core/samtools/mpileup/environment.yml | 7 +- modules/nf-core/samtools/mpileup/main.nf | 43 +++--- modules/nf-core/samtools/mpileup/meta.yml | 60 ++++++-- .../nf-core/samtools/stats/environment.yml | 6 +- modules/nf-core/samtools/stats/main.nf | 24 ++-- modules/nf-core/samtools/stats/meta.yml | 44 ++++-- modules/nf-core/samtools/view/environment.yml | 5 +- modules/nf-core/samtools/view/main.nf | 106 +++++++------- modules/nf-core/samtools/view/meta.yml | 110 ++++++++++---- subworkflows/local/bam_applybqsr/main.nf | 6 - .../local/bam_applybqsr_spark/main.nf | 6 - .../local/bam_convert_samtools/main.nf | 32 ++--- subworkflows/local/bam_markduplicates/main.nf | 2 +- .../local/bam_markduplicates_spark/main.nf | 5 +- .../local/bam_merge_index_samtools/main.nf | 10 +- subworkflows/local/bam_sentieon_dedup/main.nf | 2 +- .../bam_variant_calling_germline_all/main.nf | 2 - .../local/bam_variant_calling_mpileup/main.nf | 9 +- .../bam_variant_calling_somatic_all/main.nf | 4 - .../main.nf | 1 - .../local/cram_merge_index_samtools/main.nf | 10 +- .../local/cram_qc_mosdepth_samtools/main.nf | 11 +- subworkflows/local/cram_sampleqc/main.nf | 1 + .../fastq_create_umi_consensus_fgbio/main.nf | 7 +- .../local/fastq_preprocess_gatk/main.nf | 17 +-- .../local/fastq_preprocess_parabricks/main.nf | 7 +- subworkflows/local/prepare_genome/main.nf | 3 +- tests/aligner-bwa-mem.nf.test.snap | 12 +- tests/aligner-bwa-mem2.nf.test.snap | 12 +- tests/aligner-dragmap.nf.test.snap | 12 +- tests/aligner-parabricks.nf.test.snap | 96 +++++++------ tests/alignment_from_everything.nf.test.snap | 41 +++--- tests/alignment_to_fastq.nf.test.snap | 35 ++--- tests/bbsplit.nf.test.snap | 28 ++-- tests/default.nf.test.snap | 21 +-- tests/fastp.nf.test.snap | 63 ++++---- tests/intervals.nf.test.snap | 36 ++--- ...joint_calling_haplotypecaller.nf.test.snap | 46 +++--- tests/joint_calling_mutect2.nf.test.snap | 50 +++---- tests/lane_integer.nf.test.snap | 6 +- tests/multi_lane.nf.test.snap | 39 ++--- tests/postprocess_concatenation.nf.test.snap | 19 +-- ...s_concatenation_normalization.nf.test.snap | 38 ++--- tests/postprocess_consensus.nf.test.snap | 65 +++++---- tests/postprocess_filtering.nf.test.snap | 19 +-- tests/postprocess_normalization.nf.test.snap | 19 +-- tests/postprocess_varlociraptor.nf.test.snap | 55 +++---- tests/qc_ngscheckmate.nf.test.snap | 23 +-- tests/save_mapped.nf.test.snap | 6 +- tests/save_output_as_bam.nf.test.snap | 25 ++-- tests/sentieon.nf.test.snap | 4 +- tests/sentieon_aligner_bwamem.nf.test.snap | 6 +- tests/sentieon_dedup.nf.test.snap | 105 +++++++------- tests/spark.nf.test.snap | 27 ++-- tests/start_from_markduplicates.nf.test.snap | 84 +++++------ ...art_from_preparerecalibration.nf.test.snap | 38 ++--- tests/start_from_recalibration.nf.test.snap | 38 ++--- tests/tumor-normal-pair.nf.test.snap | 21 +-- tests/umi_fastp.nf.test.snap | 21 +-- tests/umi_fgbio.nf.test.snap | 38 ++--- tests/umi_in_read_names.nf.test.snap | 56 ++++---- tests/variant_calling_all.nf.test.snap | 67 ++++----- tests/variant_calling_ascat.nf.test.snap | 38 ++--- tests/variant_calling_cnvkit.nf.test.snap | 112 ++++++++------- .../variant_calling_controlfreec.nf.test.snap | 44 +++--- .../variant_calling_deepvariant.nf.test.snap | 34 ++--- tests/variant_calling_freebayes.nf.test.snap | 136 +++++++++--------- ...riant_calling_haplotypecaller.nf.test.snap | 72 +++++----- tests/variant_calling_lofreq.nf.test.snap | 28 ++-- tests/variant_calling_manta.nf.test.snap | 101 +++++++------ tests/variant_calling_mpileup.nf.test.snap | 68 ++++----- tests/variant_calling_msisensor2.nf.test.snap | 19 +-- .../variant_calling_msisensorpro.nf.test.snap | 23 +-- tests/variant_calling_muse.nf.test.snap | 25 ++-- tests/variant_calling_mutect2.nf.test.snap | 78 +++++----- ...ant_calling_sentieon_dnascope.nf.test.snap | 51 +++---- ...ling_sentieon_haplotypecaller.nf.test.snap | 68 ++++----- tests/variant_calling_strelka.nf.test.snap | 95 ++++++------ tests/variant_calling_strelka_bp.nf.test.snap | 38 ++--- tests/variant_calling_tiddit.nf.test.snap | 41 +++--- workflows/sarek.nf | 12 +- 109 files changed, 2147 insertions(+), 1767 deletions(-) diff --git a/.github/actions/get-shards/action.yml b/.github/actions/get-shards/action.yml index e2833ee979..671ac1e101 100644 --- a/.github/actions/get-shards/action.yml +++ b/.github/actions/get-shards/action.yml @@ -10,6 +10,10 @@ inputs: tags: description: "Tags to pass as argument for nf-test --tag parameter" required: false + all_tests: + description: "Count all tagged tests instead of only those changed since HEAD^ (used for snapshot regeneration)" + required: false + default: "false" outputs: shard: description: "Array of shard numbers" @@ -29,12 +33,16 @@ runs: shell: bash run: | # Run nf-test with dynamic parameter + # In all_tests mode (snapshot regeneration) count every tagged test, + # not just those changed since HEAD^. + CHANGED_SINCE="--changed-since HEAD^" + if [ "${{ inputs.all_tests }}" = "true" ]; then CHANGED_SINCE=""; fi nftest_output=$(nf-test test \ --profile +docker \ $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ --dry-run \ --ci \ - --changed-since HEAD^) || { + $CHANGED_SINCE) || { echo "nf-test command failed with exit code $?" echo "Full output: $nftest_output" exit 1 diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 0ad890dc3e..341139f2f3 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -16,6 +16,10 @@ inputs: tags: description: "Tags to pass as argument for nf-test --tag parameter" required: false + update_snapshots: + description: "Run with --update-snapshot over all tagged tests and upload regenerated snapshots as artifacts" + required: false + default: "false" runs: using: "composite" steps: @@ -70,12 +74,28 @@ runs: NFT_WORKDIR: ${{ env.NFT_WORKDIR }} SENTIEON_LICSRVR_IP: ${{ env.SENTIEON_LICSRVR_IP }} SENTIEON_AUTH_MECH: "GitHub Actions - token" + # Use nf-test's native differ instead of pdiff: pdiff wraps the snapshot + # diff to the terminal width and truncates md5 checksums in the CI log. + # The native differ prints full-length values on one line (scrapeable). + NFT_DIFF: diff run: | + # setup-nf-test exports NFT_DIFF_ARGS (pdiff flags) into the env; those + # flags suppress the native differ's output entirely, so drop them here. + unset NFT_DIFF_ARGS + # In update-snapshot mode, regenerate snapshots over ALL tagged tests + # (drop --changed-since, which is only meaningful for PR/push diffs). + CHANGED_SINCE="--changed-since HEAD^" + UPDATE_SNAPSHOT="" + if [ "${{ inputs.update_snapshots }}" = "true" ]; then + CHANGED_SINCE="" + UPDATE_SNAPSHOT="--update-snapshot" + fi nf-test test \ --profile=+${{ inputs.profile }} \ $(if [ -n "${{ inputs.tags }}" ]; then echo "--tag ${{ inputs.tags }}"; fi) \ --ci \ - --changed-since HEAD^ \ + $CHANGED_SINCE \ + $UPDATE_SNAPSHOT \ --verbose \ --tap=test.tap \ --shard ${{ inputs.shard }}/${{ inputs.total_shards }} @@ -83,6 +103,30 @@ runs: # Save the absolute path of the test.tap file to the output echo "tap_file_path=$(realpath test.tap)" >> $GITHUB_OUTPUT + # ---- update-snapshot mode: collect & upload regenerated snapshots ---- + # Only the canonical docker + pinned-Nextflow leg uploads, to avoid + # profile/version-specific artifact collisions. + - name: Collect updated snapshots + if: ${{ inputs.update_snapshots == 'true' && inputs.profile == 'docker' && env.NXF_VERSION == '25.10.4' }} + shell: bash + run: | + rm -rf updated-snaps && mkdir -p updated-snaps + git diff --name-only -- 'tests/*.snap' | while read -r f; do + mkdir -p "updated-snaps/$(dirname "$f")" + cp "$f" "updated-snaps/$f" + done + echo "Changed snapshot files (shard ${{ inputs.shard }}/${{ inputs.total_shards }}):" + git diff --name-only -- 'tests/*.snap' || true + + - name: Upload updated snapshots + if: ${{ inputs.update_snapshots == 'true' && inputs.profile == 'docker' && env.NXF_VERSION == '25.10.4' }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 + with: + name: updated-snapshots-shard-${{ inputs.shard }} + path: updated-snaps/ + if-no-files-found: ignore + retention-days: 5 + - name: Generate test summary if: always() shell: bash diff --git a/.github/workflows/nf-test-gpu.yml b/.github/workflows/nf-test-gpu.yml index e6ee69ddea..07734a673b 100644 --- a/.github/workflows/nf-test-gpu.yml +++ b/.github/workflows/nf-test-gpu.yml @@ -10,6 +10,11 @@ on: release: types: [published] workflow_dispatch: + inputs: + update_snapshots: + description: "Regenerate snapshots (--update-snapshot) over all tagged tests and upload them as artifacts" + type: boolean + default: false # Cancel if a newer run is started concurrency: @@ -51,6 +56,7 @@ jobs: with: tags: "gpu" max_shards: 2 + all_tests: ${{ github.event.inputs.update_snapshots || 'false' }} - name: debug run: | @@ -108,6 +114,7 @@ jobs: shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} tags: ${{ matrix.profile == 'conda' && 'gpu_conda' || 'gpu,gpu_conda' }} + update_snapshots: ${{ github.event.inputs.update_snapshots || 'false' }} - name: Report test status if: ${{ always() }} run: | diff --git a/.github/workflows/nf-test-sentieon.yml b/.github/workflows/nf-test-sentieon.yml index 6b7d5de27c..cdf6f5530c 100644 --- a/.github/workflows/nf-test-sentieon.yml +++ b/.github/workflows/nf-test-sentieon.yml @@ -10,6 +10,11 @@ on: release: types: [published] workflow_dispatch: + inputs: + update_snapshots: + description: "Regenerate snapshots (--update-snapshot) over all tagged tests and upload them as artifacts" + type: boolean + default: false # Cancel if a newer run is started concurrency: @@ -51,6 +56,7 @@ jobs: with: tags: "sentieon,sentieon_conda" max_shards: 10 + all_tests: ${{ github.event.inputs.update_snapshots || 'false' }} - name: debug run: | @@ -109,6 +115,7 @@ jobs: shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} tags: ${{ matrix.profile == 'conda' && 'sentieon_conda' || 'sentieon,sentieon_conda' }} + update_snapshots: ${{ github.event.inputs.update_snapshots || 'false' }} - name: Report test status if: ${{ always() }} run: | diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index 88ddc03266..29987b5c7a 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -10,6 +10,11 @@ on: release: types: [published] workflow_dispatch: + inputs: + update_snapshots: + description: "Regenerate snapshots (--update-snapshot) over all tagged tests and upload them as artifacts" + type: boolean + default: false # Cancel if a newer run is started concurrency: @@ -52,6 +57,7 @@ jobs: with: max_shards: 15 tags: "cpu,cpu_conda" + all_tests: ${{ github.event.inputs.update_snapshots || 'false' }} - name: debug run: | @@ -103,6 +109,7 @@ jobs: shard: ${{ matrix.shard }} total_shards: ${{ env.TOTAL_SHARDS }} tags: ${{ matrix.profile == 'conda' && 'cpu_conda' || 'cpu,cpu_conda' }} + update_snapshots: ${{ github.event.inputs.update_snapshots || 'false' }} - name: Report test status if: ${{ always() }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e28d64d3f..cbac014e25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,11 +21,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2238](https://github.com/nf-core/sarek/pull/2238) - Migrate `gatk4`/`gatk4spark` modules to the versions topic channel (bumps gatk4spark 4.6.1.0 → 4.6.2.0) - [#2239](https://github.com/nf-core/sarek/pull/2239) - Migrate alignment/UMI/utility modules (`bwa`, `bwamem2`, `dragmap`, `fgbio`, `fastp`, `cat`, `gawk`, `gunzip`, `untar`, `unzip`, `spring`) to the versions topic channel (fastp 0.24.0 → 1.1.0) - [#2240](https://github.com/nf-core/sarek/pull/2240) - Migrate variant-calling modules (`freebayes`, `strelka`, `manta`, `tiddit`, `lofreq`, `svdb`, `vcflib`, `vcftools`) to the versions topic channel +- [#2241](https://github.com/nf-core/sarek/pull/2241) - Migrate `samtools/*` and `mosdepth` modules to the versions topic channel ### Fixed - [#2184](https://github.com/nf-core/sarek/pull/2184) - Skip nf-schema path-existence validation for `snpeff_cache`, `vep_cache` and `igenomes_base` so pipeline launches succeed when the default S3 buckets are not accessible - [#2216](https://github.com/nf-core/sarek/pull/2216) - Fix `--normalize_vcfs` dropping a real ALT allele of `1/2` multiallelic sites (`bcftools norm --rm-dup all` → `--rm-dup exact`) +- [#2241](https://github.com/nf-core/sarek/pull/2241) - Bump `mosdepth` (0.3.10 → 0.3.14) so its htslib can decode CRAM 3.1 written by samtools 1.24; the previous container silently produced empty coverage files, dropping the mosdepth MultiQC sections (most visible in the parabricks path) ### Removed @@ -48,6 +50,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | svdb | 2.8.2 | 2.8.4 | | tiddit | 3.6.1 | 3.9.5 | | vcftools | 0.1.16 | 0.1.17 | +| samtools | 1.21 | 1.24 | +| mosdepth | 0.3.10 | 0.3.14 | ### Dependencies - plugins diff --git a/modules.json b/modules.json index e883cb77a7..fc37c5232f 100644 --- a/modules.json +++ b/modules.json @@ -368,7 +368,7 @@ }, "mosdepth": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "999b9db1d6b8bdc591e1168e183f4cc87d6606f9", "installed_by": ["modules"] }, "msisensor2/msi": { @@ -418,47 +418,47 @@ }, "samtools/bam2fq": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/collatefastq": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/convert": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/index": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/mpileup": { "branch": "master", - "git_sha": "7e20d971c70d78dbd9f610698267f37b7fb3d38a", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "samtools/view": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "9339809fcb90af8a8b7051e6cd914894d5c52002", "installed_by": ["modules"] }, "sentieon/applyvarcal": { diff --git a/modules/nf-core/mosdepth/environment.yml b/modules/nf-core/mosdepth/environment.yml index f871e054e4..1462ab3409 100644 --- a/modules/nf-core/mosdepth/environment.yml +++ b/modules/nf-core/mosdepth/environment.yml @@ -4,5 +4,9 @@ channels: - conda-forge - bioconda dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.23.1 # renovate: datasource=conda depName=bioconda/mosdepth - - mosdepth=0.3.10 + - bioconda::mosdepth=0.3.14 + # renovate: datasource=conda depName=conda-forge/gzip + - conda-forge::gzip=1.14 diff --git a/modules/nf-core/mosdepth/main.nf b/modules/nf-core/mosdepth/main.nf index 3bf945f909..ef82be0a17 100644 --- a/modules/nf-core/mosdepth/main.nf +++ b/modules/nf-core/mosdepth/main.nf @@ -3,13 +3,14 @@ process MOSDEPTH { label 'process_medium' 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'}" + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/a3/a3dc5ea2ce788c24079d24d1721ed28086874152c43b5e7dde3f638dcf64336a/data' : + 'community.wave.seqera.io/library/htslib_mosdepth_gzip:4108dd38be84e40a'}" input: tuple val(meta), path(bam), path(bai), path(bed) tuple val(meta2), path(fasta) + val(quantize_labels) output: tuple val(meta), path('*.global.dist.txt') , emit: global_txt @@ -24,8 +25,8 @@ 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 + tuple val("${task.process}"), val('gzip'), eval("gzip -V 2>&1 | sed 's/gzip \\([0-9.]*\\).*/\\1/;q'"), topic: versions, emit: versions_gzip when: task.ext.when == null || task.ext.when @@ -34,30 +35,38 @@ process MOSDEPTH { def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--fasta ${fasta}" : "" def interval = bed ? "--by ${bed}" : "" - if (bed && args.contains("--by")) { + def quantize_env_vars = [] + if (quantize_labels instanceof List && quantize_labels.size() > 0) { + quantize_labels.eachWithIndex { label, index -> + quantize_env_vars << "MOSDEPTH_Q${index}=${label}" + } + } + 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" } """ - mosdepth \\ + ${quantize_env_vars.join(" ")} mosdepth \\ --threads $task.cpus \\ $interval \\ $reference \\ $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 +80,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 dc783c9006..36097fca8e 100644 --- a/modules/nf-core/mosdepth/meta.yml +++ b/modules/nf-core/mosdepth/meta.yml @@ -11,7 +11,8 @@ tools: Fast BAM/CRAM depth calculation for WGS, exome, or targeted sequencing. documentation: https://github.com/brentp/mosdepth doi: 10.1093/bioinformatics/btx699 - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:mosdepth input: - - meta: @@ -23,14 +24,17 @@ input: type: file description: Input BAM/CRAM file pattern: "*.{bam,cram}" + ontologies: [] - bai: type: file description: Index for BAM/CRAM file pattern: "*.{bai,crai}" + ontologies: [] - bed: type: file description: BED file with intersected intervals pattern: "*.{bed}" + ontologies: [] - - meta2: type: map description: | @@ -40,9 +44,16 @@ input: type: file description: Reference genome FASTA file pattern: "*.{fa,fasta}" + ontologies: [] + - quantize_labels: + type: list + description: | + List of labels for quantized coverage bins, e.g. [ "NO_COVERAGE", "LOW_COVERAGE", "MEDIUM_COVERAGE", "HIGH_COVERAGE" ] + The first value will be assigned to the `MOSDEPTH_Q0` environment variable, the second to `MOSDEPTH_Q1`, and so on. + These can then be used in the `--quantize` option of mosdepth to assign labels to quantized coverage bins. output: - - global_txt: - - meta: + global_txt: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,18 +62,21 @@ output: type: file description: Text file with global cumulative coverage distribution pattern: "*.{global.dist.txt}" - - summary_txt: - - meta: + ontologies: [] + summary_txt: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.summary.txt": type: file - description: Text file with summary mean depths per chromosome and regions + description: Text file with summary mean depths per chromosome and + regions pattern: "*.{summary.txt}" - - regions_txt: - - meta: + ontologies: [] + regions_txt: + - - meta: type: map description: | Groovy Map containing sample information @@ -71,8 +85,9 @@ output: type: file description: Text file with region cumulative coverage distribution pattern: "*.{region.dist.txt}" - - per_base_d4: - - meta: + ontologies: [] + per_base_d4: + - - meta: type: map description: | Groovy Map containing sample information @@ -81,8 +96,9 @@ output: type: file description: D4 file with per-base coverage pattern: "*.{per-base.d4}" - - per_base_bed: - - meta: + ontologies: [] + per_base_bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -91,8 +107,9 @@ output: type: file description: BED file with per-base coverage pattern: "*.{per-base.bed.gz}" - - per_base_csi: - - meta: + ontologies: [] + per_base_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -101,8 +118,9 @@ output: type: file description: Index file for BED file with per-base coverage pattern: "*.{per-base.bed.gz.csi}" - - regions_bed: - - meta: + ontologies: [] + regions_bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -111,8 +129,9 @@ output: type: file description: BED file with per-region coverage pattern: "*.{regions.bed.gz}" - - regions_csi: - - meta: + ontologies: [] + regions_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -121,8 +140,9 @@ output: type: file description: Index file for BED file with per-region coverage pattern: "*.{regions.bed.gz.csi}" - - quantized_bed: - - meta: + ontologies: [] + quantized_bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -131,8 +151,9 @@ output: type: file description: BED file with binned coverage pattern: "*.{quantized.bed.gz}" - - quantized_csi: - - meta: + ontologies: [] + quantized_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -141,19 +162,21 @@ output: type: file description: Index file for BED file with binned coverage pattern: "*.{quantized.bed.gz.csi}" - - thresholds_bed: - - meta: + ontologies: [] + thresholds_bed: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.thresholds.bed.gz": type: file - description: BED file with the number of bases in each region that are covered - at or above each threshold + description: BED file with the number of bases in each region that are + covered at or above each threshold pattern: "*.{thresholds.bed.gz}" - - thresholds_csi: - - meta: + ontologies: [] + thresholds_csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -162,11 +185,47 @@ output: type: file description: Index file for BED file with threshold coverage pattern: "*.{thresholds.bed.gz.csi}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + 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: eval + description: The command used to generate the version of the tool + versions_gzip: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gzip: + type: string + description: The name of the tool + - gzip -V 2>&1 | sed 's/gzip \([0-9.]*\).*/\1/;q': + 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 + - mosdepth: + type: string + description: The tool name + - mosdepth --version | sed 's/mosdepth //g': + 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 + - gzip: + type: string + description: The name of the tool + - gzip -V 2>&1 | sed 's/gzip \([0-9.]*\).*/\1/;q': + type: eval + description: The expression to obtain the version of the tool authors: - "@joseespinosa" - "@drpatelh" @@ -174,6 +233,5 @@ authors: - "@matthdsm" maintainers: - "@joseespinosa" - - "@drpatelh" - "@ramprasadn" - "@matthdsm" diff --git a/modules/nf-core/samtools/bam2fq/environment.yml b/modules/nf-core/samtools/bam2fq/environment.yml index 62054fc97a..b08c7761d8 100644 --- a/modules/nf-core/samtools/bam2fq/environment.yml +++ b/modules/nf-core/samtools/bam2fq/environment.yml @@ -4,5 +4,8 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 + - conda-forge::xz=5.8.3 diff --git a/modules/nf-core/samtools/bam2fq/main.nf b/modules/nf-core/samtools/bam2fq/main.nf index 1d3049e565..d5fde581ac 100644 --- a/modules/nf-core/samtools/bam2fq/main.nf +++ b/modules/nf-core/samtools/bam2fq/main.nf @@ -1,11 +1,11 @@ process SAMTOOLS_BAM2FQ { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/31/315d2445cd42b0f5512fa37965a9c59bc93ae8614b7d105150caece6c61e2e71/data' + : 'community.wave.seqera.io/library/htslib_samtools_xz:1595ae0727655963'}" input: tuple val(meta), path(inputbam) @@ -13,7 +13,8 @@ process SAMTOOLS_BAM2FQ { output: tuple val(meta), path("*.fq.gz"), emit: reads - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools + tuple val("${task.process}"), val("bgzip"), eval('bgzip --version | head -1 | sed "s/bgzip (htslib) //"'), emit: versions_bgzip, topic: versions when: task.ext.when == null || task.ext.when @@ -22,35 +23,49 @@ process SAMTOOLS_BAM2FQ { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - if (split){ + if (split) { """ samtools \\ bam2fq \\ - $args \\ - -@ $task.cpus \\ + ${args} \\ + -@ ${task.cpus} \\ -1 ${prefix}_1.fq.gz \\ -2 ${prefix}_2.fq.gz \\ -0 ${prefix}_other.fq.gz \\ -s ${prefix}_singleton.fq.gz \\ - $inputbam - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${inputbam} """ - } else { + } + else { """ samtools \\ bam2fq \\ - $args \\ - -@ $task.cpus \\ - $inputbam | gzip --no-name > ${prefix}_interleaved.fq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${args} \\ + -@ ${task.cpus} \\ + ${inputbam} | bgzip > ${prefix}_interleaved.fq.gz + """ + } + + stub: + + def prefix = task.ext.prefix ?: "${meta.id}" + def bgzip_command_1 = "echo | bgzip -c > ${prefix}_1.fq.gz" + def bgzip_command_2 = "echo | bgzip -c > ${prefix}_2.fq.gz" + def bgzip_command_other = "echo | bgzip -c > ${prefix}_other.fq.gz" + def bgzip_command_singleton = "echo | bgzip -c > ${prefix}_singleton.fq.gz" + def bgzip_command_interleaved = "echo | bgzip -c > ${prefix}_interleaved.fq.gz" + + if (split) { + """ + ${bgzip_command_1} + ${bgzip_command_2} + ${bgzip_command_other} + ${bgzip_command_singleton} + """ + } + else { + """ + ${bgzip_command_interleaved} """ } } diff --git a/modules/nf-core/samtools/bam2fq/meta.yml b/modules/nf-core/samtools/bam2fq/meta.yml index b17ed608d0..1457ba3400 100644 --- a/modules/nf-core/samtools/bam2fq/meta.yml +++ b/modules/nf-core/samtools/bam2fq/meta.yml @@ -10,7 +10,8 @@ tools: - samtools: description: Tools for dealing with SAM, BAM and CRAM files documentation: http://www.htslib.org/doc/1.1/samtools.html - licence: ["MIT"] + licence: + - "MIT" identifier: biotools:samtools input: - - meta: @@ -22,17 +23,18 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - - - split: - type: boolean - description: | - TRUE/FALSE value to indicate if reads should be separated into - /1, /2 and if present other, or singleton. - Note: choosing TRUE will generate 4 different files. - Choosing FALSE will produce a single file, which will be interleaved in case - the input contains paired reads. + ontologies: [] + - split: + type: boolean + description: | + TRUE/FALSE value to indicate if reads should be separated into + /1, /2 and if present other, or singleton. + Note: choosing TRUE will generate 4 different files. + Choosing FALSE will produce a single file, which will be interleaved in case + the input contains paired reads. output: - - reads: - - meta: + reads: + - - meta: type: map description: | Groovy Map containing sample information @@ -43,12 +45,50 @@ output: FASTQ files, which will be either a group of 4 files (read_1, read_2, other and singleton) or a single interleaved .fq.gz file if the user chooses not to split the reads. pattern: "*.fq.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3989 + 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 + versions_bgzip: + - - ${task.process}: + type: string + description: The name of the process + - bgzip: + type: string + description: The name of the tool + - bgzip --version | head -1 | sed "s/bgzip (htslib) //": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${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 + - - ${task.process}: + type: string + description: The name of the process + - bgzip: + type: string + description: The name of the tool + - bgzip --version | head -1 | sed "s/bgzip (htslib) //": + type: eval + description: The expression to obtain the version of the tool authors: - "@lescai" maintainers: - "@lescai" + - "@matthdsm" diff --git a/modules/nf-core/samtools/collatefastq/environment.yml b/modules/nf-core/samtools/collatefastq/environment.yml index 62054fc97a..b08c7761d8 100644 --- a/modules/nf-core/samtools/collatefastq/environment.yml +++ b/modules/nf-core/samtools/collatefastq/environment.yml @@ -4,5 +4,8 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 + - conda-forge::xz=5.8.3 diff --git a/modules/nf-core/samtools/collatefastq/main.nf b/modules/nf-core/samtools/collatefastq/main.nf index 8b70ebd345..91b9020d7a 100644 --- a/modules/nf-core/samtools/collatefastq/main.nf +++ b/modules/nf-core/samtools/collatefastq/main.nf @@ -1,23 +1,23 @@ process SAMTOOLS_COLLATEFASTQ { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/31/315d2445cd42b0f5512fa37965a9c59bc93ae8614b7d105150caece6c61e2e71/data' + : 'community.wave.seqera.io/library/htslib_samtools_xz:1595ae0727655963'}" input: tuple val(meta), path(input) - tuple val(meta2), path(fasta) - val(interleave) + tuple val(meta2), path(fasta), path(fai) + val interleave output: - tuple val(meta), path("*_{1,2}.fq.gz") , optional:true, emit: fastq - tuple val(meta), path("*_interleaved.fq") , optional:true, emit: fastq_interleaved - tuple val(meta), path("*_other.fq.gz") , emit: fastq_other - tuple val(meta), path("*_singleton.fq.gz") , optional:true, emit: fastq_singleton - path "versions.yml" , emit: versions + tuple val(meta), path("*_{1,2}.fq.gz"), emit: fastq, optional: true + tuple val(meta), path("*_interleaved.fq"), emit: fastq_interleaved, optional: true + tuple val(meta), path("*_other.fq.gz"), emit: fastq_other + tuple val(meta), path("*_singleton.fq.gz"), emit: fastq_singleton, optional: true + 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 @@ -27,50 +27,43 @@ process SAMTOOLS_COLLATEFASTQ { def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" - def output = (interleave && ! meta.single_end) ? "> ${prefix}_interleaved.fq" : - meta.single_end ? "-1 ${prefix}_1.fq.gz -s ${prefix}_singleton.fq.gz" : - "-1 ${prefix}_1.fq.gz -2 ${prefix}_2.fq.gz -s ${prefix}_singleton.fq.gz" + def output = interleave && !meta.single_end + ? "> ${prefix}_interleaved.fq" + : meta.single_end + ? "-1 ${prefix}_1.fq.gz -s ${prefix}_singleton.fq.gz" + : "-1 ${prefix}_1.fq.gz -2 ${prefix}_2.fq.gz -s ${prefix}_singleton.fq.gz" """ samtools collate \\ - $args \\ - --threads $task.cpus \\ + ${args} \\ + --threads ${task.cpus} \\ ${reference} \\ -O \\ - $input \\ + ${input} \\ . | samtools fastq \\ - $args2 \\ - --threads $task.cpus \\ + ${args2} \\ + --threads ${task.cpus} \\ ${reference} \\ -0 ${prefix}_other.fq.gz \\ - $output - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${output} """ stub: def prefix = task.ext.prefix ?: "${meta.id}" - def empty = "echo '' | gzip " - def singletoncommand = "${empty}> ${prefix}_singleton.fq.gz" - def interleavecommand = interleave && !meta.single_end ? "${empty}> ${prefix}_interleaved.fq.gz" : "" - def output1command = !interleave ? "${empty}> ${prefix}_1.fq.gz" : "" - def output2command = !interleave && !meta.single_end ? "${empty}> ${prefix}_2.fq.gz" : "" + def empty = "echo | bgzip -c " + def interleave_command = interleave && !meta.single_end ? "${empty}> ${prefix}_interleaved.fq.gz" : "" + def other_command = "${empty} > ${prefix}_other.fq.gz" + def output1_command = !interleave ? "${empty}> ${prefix}_1.fq.gz" : "" + def output2_command = !interleave && !meta.single_end ? "${empty}> ${prefix}_2.fq.gz" : "" + def singleton_command = "${empty}> ${prefix}_singleton.fq.gz" """ - ${output1command} - ${output2command} - ${interleavecommand} - ${singletoncommand} - ${empty}> ${prefix}_other.fq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${interleave_command} + ${other_command} + ${output1_command} + ${output2_command} + ${singleton_command} """ } diff --git a/modules/nf-core/samtools/collatefastq/meta.yml b/modules/nf-core/samtools/collatefastq/meta.yml index 5bc912496e..0086c9f94f 100644 --- a/modules/nf-core/samtools/collatefastq/meta.yml +++ b/modules/nf-core/samtools/collatefastq/meta.yml @@ -9,9 +9,13 @@ keywords: tools: - samtools: description: Tools for dealing with SAM, BAM and CRAM files - documentation: http://www.htslib.org/doc/1.1/samtools.html + homepage: "http://www.htslib.org" + documentation: "https://www.htslib.org/doc/samtools.html" + tool_dev_url: "https://github.com/samtools/samtools" + doi: "10.1093/bioinformatics/btp352" licence: ["MIT"] identifier: biotools:samtools + input: - - meta: type: map @@ -22,84 +26,102 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" + ontologies: [] - - meta2: type: map description: | Groovy Map containing reference information - e.g. [ id:'test' ] + e.g. [ id:'genome' ] - fasta: type: file - description: Reference genome fasta file - pattern: "*.{fasta,fa}" - - - interleave: - type: boolean - description: | - If true, the output is a single interleaved paired-end FASTQ - If false, the output split paired-end FASTQ - default: false + description: Reference genome file + pattern: "*.{fa,fasta}" + ontologies: [] + - fai: + type: file + description: Reference genome index file + pattern: "*.fai" + ontologies: [] + - interleave: + type: boolean + description: | + If true, the output is a single interleaved paired-end FASTQ + If false, the output split paired-end FASTQ + default: false output: - - fastq: - - meta: + fastq: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - pattern: "*_{1,2}.fq.gz" - "*_{1,2}.fq.gz": - type: map + type: file description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + R1 and R2 FASTQ files pattern: "*_{1,2}.fq.gz" - - fastq_interleaved: - - meta: + ontologies: [] + fastq_interleaved: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - pattern: "*_interleaved.fq.gz" - "*_interleaved.fq": - type: map + type: file description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Interleaved paired end FASTQ files pattern: "*_interleaved.fq.gz" - - fastq_other: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + fastq_other: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - pattern: "*_other.fq.gz" - "*_other.fq.gz": - type: map + type: file description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + FASTQ files with reads where the READ1 and READ2 FLAG bits set are either both set or both unset. pattern: "*_other.fq.gz" - - fastq_singleton: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + fastq_singleton: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - pattern: "*_singleton.fq.gz" - "*_singleton.fq.gz": - type: map + type: file description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + FASTQ files with singleton reads. pattern: "*_singleton.fq.gz" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + 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: + - - ${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: - "@lescai" - "@maxulysse" - "@matthdsm" -maintainers: - - "@lescai" - - "@maxulysse" - - "@matthdsm" diff --git a/modules/nf-core/samtools/convert/environment.yml b/modules/nf-core/samtools/convert/environment.yml index 62054fc97a..6a19f168c2 100644 --- a/modules/nf-core/samtools/convert/environment.yml +++ b/modules/nf-core/samtools/convert/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.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/convert/main.nf b/modules/nf-core/samtools/convert/main.nf index 9667e72d84..61edbbf923 100644 --- a/modules/nf-core/samtools/convert/main.nf +++ b/modules/nf-core/samtools/convert/main.nf @@ -1,29 +1,28 @@ process SAMTOOLS_CONVERT { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(input), path(index) - tuple val(meta2), path(fasta) - tuple val(meta3), path(fai) + tuple val(meta2), path(fasta), path(fai) output: - tuple val(meta), path("*.bam") , emit: bam , optional: true - tuple val(meta), path("*.cram") , emit: cram, optional: true - tuple val(meta), path("*.bai") , emit: bai , optional: true - tuple val(meta), path("*.crai") , emit: crai, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.bam"), emit: bam, optional: true + tuple val(meta), path("*.cram"), emit: cram, optional: true + tuple val(meta), path("*.bai"), emit: bai, optional: true + tuple val(meta), path("*.crai"), emit: crai, optional: true + 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 script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def output_extension = input.getExtension() == "bam" ? "cram" : "bam" @@ -31,16 +30,11 @@ process SAMTOOLS_CONVERT { samtools view \\ --threads ${task.cpus} \\ --reference ${fasta} \\ - $args \\ - $input \\ + ${args} \\ + ${input} \\ -o ${prefix}.${output_extension} samtools index -@${task.cpus} ${prefix}.${output_extension} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -51,10 +45,5 @@ process SAMTOOLS_CONVERT { """ touch ${prefix}.${output_extension} touch ${prefix}.${output_extension}.${index_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/convert/meta.yml b/modules/nf-core/samtools/convert/meta.yml index d5bfa161ba..286f812f1c 100644 --- a/modules/nf-core/samtools/convert/meta.yml +++ b/modules/nf-core/samtools/convert/meta.yml @@ -26,10 +26,12 @@ input: type: file description: BAM/CRAM file pattern: "*.{bam,cram}" + ontologies: [] - index: type: file description: BAM/CRAM index file pattern: "*.{bai,crai}" + ontologies: [] - - meta2: type: map description: | @@ -39,18 +41,15 @@ input: type: file description: Reference file to create the CRAM file pattern: "*.{fasta,fa}" - - - meta3: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + ontologies: [] - fai: type: file description: Reference index file to create the CRAM file pattern: "*.{fai}" + ontologies: [] output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -59,8 +58,9 @@ output: type: file description: filtered/converted BAM file pattern: "*{.bam}" - - cram: - - meta: + ontologies: [] + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -69,8 +69,9 @@ output: type: file description: filtered/converted CRAM file pattern: "*{cram}" - - bai: - - meta: + ontologies: [] + bai: + - - meta: type: map description: | Groovy Map containing sample information @@ -79,8 +80,9 @@ output: type: file description: filtered/converted BAM index pattern: "*{.bai}" - - crai: - - meta: + ontologies: [] + crai: + - - meta: type: map description: | Groovy Map containing sample information @@ -89,11 +91,28 @@ output: type: file description: filtered/converted CRAM index pattern: "*{.crai}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + 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: + - - ${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: - "@FriederikeHanssen" - "@maxulysse" diff --git a/modules/nf-core/samtools/faidx/environment.yml b/modules/nf-core/samtools/faidx/environment.yml index 62054fc97a..6a19f168c2 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.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index 6de0095d86..3925ffafcb 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -1,23 +1,22 @@ process SAMTOOLS_FAIDX { - tag "$fasta" + tag "${fasta}" label 'process_single' 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' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: - tuple val(meta), path(fasta) - tuple val(meta2), path(fai) + tuple val(meta), path(fasta), path(fai) val get_sizes output: - tuple val(meta), path ("*.{fa,fasta}") , emit: fa, optional: true - 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(meta), path("*.{fa,fasta}"), emit: fa, optional: true + 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 + 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 @@ -28,15 +27,10 @@ process SAMTOOLS_FAIDX { """ samtools \\ faidx \\ - $fasta \\ - $args + ${fasta} \\ + ${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 +45,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 b7a2e0c1a3..529f7a2634 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: @@ -86,13 +82,27 @@ 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: eval + 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: eval + description: The command used to generate the version of the tool authors: - "@drpatelh" - "@ewels" @@ -100,3 +110,4 @@ authors: maintainers: - "@maxulysse" - "@phue" + - "@matthdsm" diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml index 62054fc97a..6a19f168c2 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.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 311756102d..4dd9311a99 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -1,20 +1,18 @@ process SAMTOOLS_INDEX { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(input) output: - 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(meta), path("*.{bai,csi,crai}"), emit: index + 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 @@ -24,26 +22,17 @@ process SAMTOOLS_INDEX { """ samtools \\ index \\ - -@ ${task.cpus-1} \\ - $args \\ - $input - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + -@ ${task.cpus} \\ + ${args} \\ + ${input} """ stub: def args = task.ext.args ?: '' - def extension = file(input).getExtension() == 'cram' ? - "crai" : args.contains("-c") ? "csi" : "bai" + def extension = file(input).getExtension() == 'cram' + ? "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 db8df0d505..d4938bcdfd 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: @@ -25,47 +26,45 @@ input: - input: type: file description: input file + ontologies: [] output: - - bai: - - meta: + index: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.bai": + - "*.{bai,csi,crai}": type: file description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - csi: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.csi": - type: file - description: CSI index file - pattern: "*.{csi}" - - crai: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.crai": - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + pattern: "*.{bai,csi,crai}" + 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: + - - ${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" - "@maxulysse" maintainers: - - "@drpatelh" - "@ewels" - "@maxulysse" + - "@matthdsm" diff --git a/modules/nf-core/samtools/merge/environment.yml b/modules/nf-core/samtools/merge/environment.yml index 62054fc97a..6a19f168c2 100644 --- a/modules/nf-core/samtools/merge/environment.yml +++ b/modules/nf-core/samtools/merge/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.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf index 34da4c7c87..4d1fd305fc 100644 --- a/modules/nf-core/samtools/merge/main.nf +++ b/modules/nf-core/samtools/merge/main.nf @@ -1,61 +1,49 @@ process SAMTOOLS_MERGE { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: - tuple val(meta), path(input_files, stageAs: "?/*") - tuple val(meta2), path(fasta) - tuple val(meta3), path(fai) + tuple val(meta), path(input_files, stageAs: "?/*"), path(index_files, stageAs: "?/*") + tuple val(meta2), path(fasta), path(fai), path(gzi) output: - tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam - tuple val(meta), path("${prefix}.cram"), optional:true, emit: cram - 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(meta), path("${prefix}.bam"), optional: true, emit: bam + tuple val(meta), path("${prefix}.cram"), optional: true, emit: cram + tuple val(meta), path("*.{bai,crai,csi}"), optional: true, emit: index + 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 script: - def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() def reference = fasta ? "--reference ${fasta}" : "" """ + # Note: --threads value represents *additional* CPUs to allocate (total CPUs = 1 + --threads). samtools \\ merge \\ - --threads ${task.cpus-1} \\ - $args \\ + --threads ${task.cpus - 1} \\ + ${args} \\ ${reference} \\ ${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 + ${input_files} """ stub: - def args = task.ext.args ?: '' - prefix = task.ext.suffix ? "${meta.id}${task.ext.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" def file_type = input_files instanceof List ? input_files[0].getExtension() : input_files.getExtension() def index_type = file_type == "bam" ? "csi" : "crai" def index = args.contains("--write-index") ? "touch ${prefix}.${index_type}" : "" """ touch ${prefix}.${file_type} ${index} - - 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/merge/meta.yml b/modules/nf-core/samtools/merge/meta.yml index 235aa21945..66e582e870 100644 --- a/modules/nf-core/samtools/merge/meta.yml +++ b/modules/nf-core/samtools/merge/meta.yml @@ -26,6 +26,12 @@ input: type: file description: BAM/CRAM file pattern: "*.{bam,cram,sam}" + ontologies: [] + - index_files: + type: file + description: BAI/CRAI/CSI index file + pattern: "*.{bai,crai,csi}" + ontologies: [] - - meta2: type: map description: | @@ -35,18 +41,21 @@ input: type: file description: Reference file the CRAM was created with (optional) pattern: "*.{fasta,fa}" - - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] + ontologies: [] - fai: type: file description: Index of the reference file the CRAM was created with (optional) pattern: "*.fai" + ontologies: [] + - gzi: + type: file + description: Index of the compressed reference file the CRAM was created with + (optional) + pattern: "*.gzi" + ontologies: [] output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -55,8 +64,9 @@ output: type: file description: BAM file pattern: "*.{bam}" - - cram: - - meta: + ontologies: [] + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -65,40 +75,48 @@ output: type: file description: CRAM file pattern: "*.{cram}" - - csi: - - meta: + ontologies: [] + index: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - "*.csi": + - "*.{bai,crai,csi}": type: file description: BAM index file (optional) - pattern: "*.csi" - - crai: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.crai": - type: file - description: CRAM index file (optional) - pattern: "*.crai" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + pattern: "*.{bai,crai,csi}" + 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: + - - ${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" - - "@yuukiiwa " + - "@yuukiiwa" - "@maxulysse" - "@FriederikeHanssen" - "@ramprasadn" maintainers: - - "@drpatelh" - - "@yuukiiwa " + - "@yuukiiwa" - "@maxulysse" - "@FriederikeHanssen" - "@ramprasadn" + - "@matthdsm" diff --git a/modules/nf-core/samtools/mpileup/environment.yml b/modules/nf-core/samtools/mpileup/environment.yml index 62054fc97a..b08c7761d8 100644 --- a/modules/nf-core/samtools/mpileup/environment.yml +++ b/modules/nf-core/samtools/mpileup/environment.yml @@ -4,5 +4,8 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 + - conda-forge::xz=5.8.3 diff --git a/modules/nf-core/samtools/mpileup/main.nf b/modules/nf-core/samtools/mpileup/main.nf index 8693aa0477..a6c5840628 100644 --- a/modules/nf-core/samtools/mpileup/main.nf +++ b/modules/nf-core/samtools/mpileup/main.nf @@ -1,51 +1,42 @@ process SAMTOOLS_MPILEUP { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/31/315d2445cd42b0f5512fa37965a9c59bc93ae8614b7d105150caece6c61e2e71/data' + : 'community.wave.seqera.io/library/htslib_samtools_xz:1595ae0727655963'}" input: - tuple val(meta), path(input), path(intervals) - tuple val(meta2), path(fasta) + tuple val(meta), path(input), path(index), path(intervals) + tuple val(meta2), path(fasta), path(fai) output: tuple val(meta), path("*.mpileup.gz"), emit: mpileup - 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 script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def fasta_cmd = fasta ? "--fasta-ref $fasta" : "" - def intervals_cmd = intervals ? "-l ${intervals}" : "" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def fasta_cmd = fasta ? "--fasta-ref ${fasta}" : "" + def intervals_cmd = intervals ? "-l ${intervals}" : "" """ samtools mpileup \\ - $fasta_cmd \\ + ${fasta_cmd} \\ --output ${prefix}.mpileup \\ - $args \\ - $intervals_cmd \\ - $input + ${args} \\ + ${intervals_cmd} \\ + ${input} bgzip ${prefix}.mpileup - - 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}" + def bgzip_command = "echo | bgzip -c > ${prefix}.mpileup.gz" """ - echo | gzip > ${prefix}.mpileup.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${bgzip_command} """ } diff --git a/modules/nf-core/samtools/mpileup/meta.yml b/modules/nf-core/samtools/mpileup/meta.yml index 6195138ef0..a52a0ec09a 100644 --- a/modules/nf-core/samtools/mpileup/meta.yml +++ b/modules/nf-core/samtools/mpileup/meta.yml @@ -1,5 +1,6 @@ name: samtools_mpileup -description: BAM +description: Generate text pileup output for one or multiple BAM files. Each + input file produces a separate group of pileup columns in the output. keywords: - mpileup - bam @@ -26,22 +27,37 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" + ontologies: [] + - index: + type: file + description: CSI/BAI/CRAI file. Optional. Only required when using the + '-r' parameter. + pattern: "*.{bai,crai,csi}" + ontologies: [] - intervals: type: file - description: Interval FILE + description: Interval FILE. Optional. pattern: "*.bed" + ontologies: [] - - meta2: type: map description: | - Groovy Map containing sample information + Groovy Map containing reference information e.g. [ id:'test' ] - fasta: type: file - description: FASTA reference file - pattern: "*.{fasta,fa}" + description: FASTA reference file. Optional. + pattern: "*.{fasta,fa,fna}" + ontologies: [] + - fai: + type: file + description: FAI file. Optional. Only required (recommended) when using the + '-f' parameter. + pattern: "*.{fai}" + ontologies: [] output: - - mpileup: - - meta: + mpileup: + - - meta: type: map description: | Groovy Map containing sample information @@ -50,14 +66,32 @@ output: type: file description: mpileup file pattern: "*.{mpileup}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + 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: + - - ${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" - "@joseespinosa" maintainers: - - "@drpatelh" - "@joseespinosa" + - "@krannich479" + - "@matthdsm" diff --git a/modules/nf-core/samtools/stats/environment.yml b/modules/nf-core/samtools/stats/environment.yml index 62054fc97a..6a19f168c2 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.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index 4443948b72..525ae00f96 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -1,48 +1,40 @@ process SAMTOOLS_STATS { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(input), path(input_index) - tuple val(meta2), path(fasta) + tuple val(meta2), path(fasta), path(fai) 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 script: + 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} \\ > ${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 77b020f76e..5fd7e76d99 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -27,10 +27,12 @@ input: type: file description: BAM/CRAM file from alignment pattern: "*.{bam,cram}" + ontologies: [] - input_index: type: file description: BAI/CRAI file from alignment pattern: "*.{bai,crai}" + ontologies: [] - - meta2: type: map description: | @@ -39,10 +41,16 @@ input: - fasta: type: file description: Reference file the CRAM was created with (optional) - pattern: "*.{fasta,fa}" + pattern: "*.{fasta,fa,fna}" + ontologies: [] + - fai: + type: file + description: FASTA ref index file + pattern: "*.{fasta,fa,fna}.fai" + ontologies: [] output: - - stats: - - meta: + stats: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,11 +59,30 @@ output: type: file description: File containing samtools stats output pattern: "*.{stats}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + 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: + - - ${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" @@ -64,3 +91,4 @@ maintainers: - "@drpatelh" - "@FriederikeHanssen" - "@ramprasadn" + - "@matthdsm" diff --git a/modules/nf-core/samtools/view/environment.yml b/modules/nf-core/samtools/view/environment.yml index 8cae5712d5..6a19f168c2 100644 --- a/modules/nf-core/samtools/view/environment.yml +++ b/modules/nf-core/samtools/view/environment.yml @@ -5,5 +5,6 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/htslib - - bioconda::htslib=1.21 - - bioconda::samtools=1.21 + - bioconda::htslib=1.24 + # renovate: datasource=conda depName=bioconda/samtools + - bioconda::samtools=1.24 diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf index f43a4c6e72..459d4f24ac 100644 --- a/modules/nf-core/samtools/view/main.nf +++ b/modules/nf-core/samtools/view/main.nf @@ -1,28 +1,29 @@ process SAMTOOLS_VIEW { - tag "$meta.id" + 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/samtools:1.21--h50ea8bc_0' : - 'biocontainers/samtools:1.21--h50ea8bc_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e9/e994bf4eb3731150511a14f5706b7bdfd64df1b6d40898fff334286c027e0859/data' + : 'community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd'}" input: tuple val(meta), path(input), path(index) - tuple val(meta2), path(fasta) - path qname + tuple val(meta2), path(fasta), path(fai) + tuple val(meta3), path(qname) + tuple val(meta4), path(bed) val index_format output: - tuple val(meta), path("${prefix}.bam"), emit: bam, optional: true - tuple val(meta), path("${prefix}.cram"), emit: cram, optional: true - tuple val(meta), path("${prefix}.sam"), emit: sam, optional: true - tuple val(meta), path("${prefix}.${file_type}.bai"), emit: bai, optional: true - tuple val(meta), path("${prefix}.${file_type}.csi"), emit: csi, optional: true - tuple val(meta), path("${prefix}.${file_type}.crai"), emit: crai, optional: true - tuple val(meta), path("${prefix}.unselected.${file_type}"), emit: unselected, optional: true - tuple val(meta), path("${prefix}.unselected.${file_type}.{csi,crai}"), emit: unselected_index, optional: true - path "versions.yml", emit: versions + tuple val(meta), path("${prefix}.bam"), emit: bam, optional: true + tuple val(meta), path("${prefix}.cram"), emit: cram, optional: true + tuple val(meta), path("${prefix}.sam"), emit: sam, optional: true + tuple val(meta), path("${prefix}.${file_type}.bai"), emit: bai, optional: true + tuple val(meta), path("${prefix}.${file_type}.csi"), emit: csi, optional: true + tuple val(meta), path("${prefix}.${file_type}.crai"), emit: crai, optional: true + tuple val(meta), path("${prefix}.unselected.${file_type}"), emit: unselected, optional: true + tuple val(meta), path("${prefix}.unselected.${file_type}.{csi,crai}"), emit: unselected_index, optional: true + 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 @@ -32,61 +33,71 @@ process SAMTOOLS_VIEW { def args2 = task.ext.args2 ?: '' prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" - file_type = args.contains("--output-fmt sam") ? "sam" : - args.contains("--output-fmt bam") ? "bam" : - args.contains("--output-fmt cram") ? "cram" : - input.getExtension() + file_type = args.contains("--output-fmt sam") + ? "sam" + : args.contains("--output-fmt bam") + ? "bam" + : args.contains("--output-fmt cram") + ? "cram" + : input.getExtension() output_file = index_format ? "${prefix}.${file_type}##idx##${prefix}.${file_type}.${index_format} --write-index" : "${prefix}.${file_type}" // Can't choose index type of unselected file - readnames = qname ? "--qname-file ${qname} --output-unselected ${prefix}.unselected.${file_type}": "" + readnames = qname ? "--qname-file ${qname} --output-unselected ${prefix}.unselected.${file_type}" : "" + def bedfile = bed ? "-L ${bed}" : "" - if ("$input" == "${prefix}.${file_type}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${input}" == "${prefix}.${file_type}") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } if (index_format) { if (!index_format.matches('bai|csi|crai')) { - error "Index format not one of bai, csi, crai." - } else if (file_type == "sam") { - error "Indexing not compatible with SAM output" + error("Index format not one of bai, csi, crai.") + } + else if (file_type == "sam") { + error("Indexing not compatible with SAM output") } } """ + # Note: --threads value represents *additional* CPUs to allocate (total CPUs = 1 + --threads). samtools \\ view \\ - --threads ${task.cpus-1} \\ + --threads ${task.cpus - 1} \\ ${reference} \\ ${readnames} \\ - $args \\ + ${bedfile} \\ + ${args} \\ -o ${output_file} \\ - $input \\ - $args2 - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS + ${input} \\ + ${args2} """ stub: def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" - file_type = args.contains("--output-fmt sam") ? "sam" : - args.contains("--output-fmt bam") ? "bam" : - args.contains("--output-fmt cram") ? "cram" : - input.getExtension() - default_index_format = - file_type == "bam" ? "csi" : - file_type == "cram" ? "crai" : "" - index = index_format ? "touch ${prefix}.${file_type}.${index_format}" : args.contains("--write-index") ? "touch ${prefix}.${file_type}.${default_index_format}" : "" + file_type = args.contains("--output-fmt sam") + ? "sam" + : args.contains("--output-fmt bam") + ? "bam" + : args.contains("--output-fmt cram") + ? "cram" + : input.getExtension() + default_index_format = file_type == "bam" + ? "csi" + : file_type == "cram" ? "crai" : "" + index = index_format ? "touch ${prefix}.${file_type}.${index_format}" : args.contains("--write-index") ? "touch ${prefix}.${file_type}.${default_index_format}" : "" unselected = qname ? "touch ${prefix}.unselected.${file_type}" : "" // Can't choose index type of unselected file unselected_index = qname && (args.contains("--write-index") || index_format) ? "touch ${prefix}.unselected.${file_type}.${default_index_format}" : "" - if ("$input" == "${prefix}.${file_type}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${input}" == "${prefix}.${file_type}") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } if (index_format) { if (!index_format.matches('bai|csi|crai')) { - error "Index format not one of bai, csi, crai." - } else if (file_type == "sam") { - error "Indexing not compatible with SAM output." + error("Index format not one of bai, csi, crai.") + } + else if (file_type == "sam") { + error("Indexing not compatible with SAM output.") } } """ @@ -94,10 +105,5 @@ process SAMTOOLS_VIEW { ${index} ${unselected} ${unselected_index} - - 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/view/meta.yml b/modules/nf-core/samtools/view/meta.yml index 28c268a657..51e3183436 100644 --- a/modules/nf-core/samtools/view/meta.yml +++ b/modules/nf-core/samtools/view/meta.yml @@ -26,30 +26,57 @@ input: type: file description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" + ontologies: [] - index: type: file description: BAM.BAI/BAM.CSI/CRAM.CRAI file (optional) pattern: "*.{.bai,.csi,.crai}" + ontologies: [] - - meta2: type: map description: | Groovy Map containing reference information - e.g. [ id:'test' ] + e.g. [ id:'genome' ] - fasta: type: file - description: Reference file the CRAM was created with (optional) + description: Fasta reference file pattern: "*.{fasta,fa}" - - - qname: + ontologies: + - edam: http://edamontology.org/format_1929 # FASTA + - fai: + type: file + description: Fasta reference file index + pattern: "*.{fai}" + ontologies: + - edam: http://edamontology.org/format_3326 # Index + - - meta3: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - qname: type: file description: Optional file with read names to output only select alignments pattern: "*.{txt,list}" - - - index_format: - type: string - description: Index format, used together with ext.args = '--write-index' - pattern: "bai|csi|crai" + ontologies: [] + - - meta4: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bed: + type: file + description: Optional BED file for filtering alignments by genomic region (-L) + pattern: "*.{bed}" + ontologies: + - edam: http://edamontology.org/format_3003 # BED + - index_format: + type: string + description: Index format, used together with ext.args = '--write-index' + pattern: "bai|csi|crai" output: - - bam: - - meta: + bam: + - - meta: type: map description: | Groovy Map containing sample information @@ -58,8 +85,9 @@ output: type: file description: optional filtered/converted BAM file pattern: "*.{bam}" - - cram: - - meta: + ontologies: [] + cram: + - - meta: type: map description: | Groovy Map containing sample information @@ -68,8 +96,9 @@ output: type: file description: optional filtered/converted CRAM file pattern: "*.{cram}" - - sam: - - meta: + ontologies: [] + sam: + - - meta: type: map description: | Groovy Map containing sample information @@ -78,8 +107,9 @@ output: type: file description: optional filtered/converted SAM file pattern: "*.{sam}" - - bai: - - meta: + ontologies: [] + bai: + - - meta: type: map description: | Groovy Map containing sample information @@ -88,8 +118,9 @@ output: type: file description: optional BAM file index pattern: "*.{bai}" - - csi: - - meta: + ontologies: [] + csi: + - - meta: type: map description: | Groovy Map containing sample information @@ -98,8 +129,9 @@ output: type: file description: optional tabix BAM file index pattern: "*.{csi}" - - crai: - - meta: + ontologies: [] + crai: + - - meta: type: map description: | Groovy Map containing sample information @@ -108,8 +140,9 @@ output: type: file description: optional CRAM file index pattern: "*.{crai}" - - unselected: - - meta: + ontologies: [] + unselected: + - - meta: type: map description: | Groovy Map containing sample information @@ -118,8 +151,9 @@ output: type: file description: optional file with unselected alignments pattern: "*.unselected.{bam,cram,sam}" - - unselected_index: - - meta: + ontologies: [] + unselected_index: + - - meta: type: map description: | Groovy Map containing sample information @@ -128,11 +162,30 @@ output: type: file description: index for the "unselected" file pattern: "*.unselected.{csi,crai}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + 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: + - - ${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" - "@joseespinosa" @@ -143,3 +196,4 @@ maintainers: - "@joseespinosa" - "@FriederikeHanssen" - "@priyanka-surana" + - "@matthdsm" diff --git a/subworkflows/local/bam_applybqsr/main.nf b/subworkflows/local/bam_applybqsr/main.nf index 0814ed4e2c..a573c0393d 100644 --- a/subworkflows/local/bam_applybqsr/main.nf +++ b/subworkflows/local/bam_applybqsr/main.nf @@ -17,7 +17,6 @@ workflow BAM_APPLYBQSR { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy // Move num_intervals to meta map @@ -54,11 +53,6 @@ workflow BAM_APPLYBQSR { .mix(CRAM_MERGE_INDEX_SAMTOOLS.out.cram_crai) .map { meta, file_, index -> [meta - meta.subMap('num_intervals'), file_, index] } - // Gather versions of all tools used - versions = versions.mix(BAM_MERGE_INDEX_SAMTOOLS.out.versions) - versions = versions.mix(CRAM_MERGE_INDEX_SAMTOOLS.out.versions) - emit: alignment = recal_out // channel: [ meta, file, index ] — BAM or CRAM - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_applybqsr_spark/main.nf b/subworkflows/local/bam_applybqsr_spark/main.nf index 2948e97b04..52eb0177d9 100644 --- a/subworkflows/local/bam_applybqsr_spark/main.nf +++ b/subworkflows/local/bam_applybqsr_spark/main.nf @@ -17,7 +17,6 @@ workflow BAM_APPLYBQSR_SPARK { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy // Move num_intervals to meta map @@ -54,11 +53,6 @@ workflow BAM_APPLYBQSR_SPARK { .mix(CRAM_MERGE_INDEX_SAMTOOLS.out.cram_crai) .map { meta, file_, index -> [meta - meta.subMap('num_intervals'), file_, index] } - // Gather versions of all tools used - versions = versions.mix(BAM_MERGE_INDEX_SAMTOOLS.out.versions) - versions = versions.mix(CRAM_MERGE_INDEX_SAMTOOLS.out.versions) - emit: alignment = recal_out // channel: [ meta, file, index ] — BAM or CRAM - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_convert_samtools/main.nf b/subworkflows/local/bam_convert_samtools/main.nf index 56ee28f72b..8dc9746630 100644 --- a/subworkflows/local/bam_convert_samtools/main.nf +++ b/subworkflows/local/bam_convert_samtools/main.nf @@ -14,26 +14,26 @@ include { CAT_FASTQ } from '../../../mo workflow BAM_CONVERT_SAMTOOLS { take: input // channel: [meta, alignment (BAM or CRAM), index (optional)] - fasta // optional: reference file if CRAM format and reference not in header - fasta_fai + fasta // channel: [meta, fasta] — reference, staged in to decode CRAM input + fasta_fai // channel: [meta, fai] interleaved // value: true/false main: - versions = channel.empty() - // Index File if not PROVIDED -> this also requires updates to samtools view possibly URGH + // Combined [ meta, fasta, fai ] reference tuple for the updated samtools modules + fasta_and_fai = fasta.combine(fasta_fai).map { meta, fasta_, _fai_meta, fai -> [ meta, fasta_, fai ] }.collect() // MAP - MAP - SAMTOOLS_VIEW_MAP_MAP(input, fasta, [], []) + SAMTOOLS_VIEW_MAP_MAP(input, fasta_and_fai, [[], []], [[], []], []) // UNMAP - UNMAP - SAMTOOLS_VIEW_UNMAP_UNMAP(input, fasta, [], []) + SAMTOOLS_VIEW_UNMAP_UNMAP(input, fasta_and_fai, [[], []], [[], []], []) // UNMAP - MAP - SAMTOOLS_VIEW_UNMAP_MAP(input, fasta, [], []) + SAMTOOLS_VIEW_UNMAP_MAP(input, fasta_and_fai, [[], []], [[], []], []) // MAP - UNMAP - SAMTOOLS_VIEW_MAP_UNMAP(input, fasta, [], []) + SAMTOOLS_VIEW_MAP_UNMAP(input, fasta_and_fai, [[], []], [[], []], []) // Merge UNMAP all_unmapped_bam = SAMTOOLS_VIEW_UNMAP_UNMAP.out.bam @@ -41,13 +41,13 @@ workflow BAM_CONVERT_SAMTOOLS { .join(SAMTOOLS_VIEW_MAP_UNMAP.out.bam, failOnDuplicate: true, remainder: true) .map{ meta, unmap_unmap, unmap_map, map_unmap -> [ meta, [ unmap_unmap, unmap_map, map_unmap ] ] } - SAMTOOLS_MERGE_UNMAP(all_unmapped_bam, fasta, fasta_fai) + SAMTOOLS_MERGE_UNMAP(all_unmapped_bam.map { meta, bams -> [ meta, bams, [] ] }, fasta_and_fai.map { meta, fasta_, fai -> [ meta, fasta_, fai, [] ] }) // Collate & convert unmapped - COLLATE_FASTQ_UNMAP(SAMTOOLS_MERGE_UNMAP.out.bam, fasta, interleaved) + COLLATE_FASTQ_UNMAP(SAMTOOLS_MERGE_UNMAP.out.bam, fasta_and_fai, interleaved) // Collate & convert mapped - COLLATE_FASTQ_MAP(SAMTOOLS_VIEW_MAP_MAP.out.bam, fasta, interleaved) + COLLATE_FASTQ_MAP(SAMTOOLS_VIEW_MAP_MAP.out.bam, fasta_and_fai, interleaved) // join Mapped & unmapped fastq @@ -59,17 +59,7 @@ workflow BAM_CONVERT_SAMTOOLS { CAT_FASTQ(reads_to_concat) reads = CAT_FASTQ.out.reads - // Gather versions of all tools used - versions = versions.mix(COLLATE_FASTQ_MAP.out.versions) - versions = versions.mix(COLLATE_FASTQ_UNMAP.out.versions) - versions = versions.mix(SAMTOOLS_MERGE_UNMAP.out.versions) - versions = versions.mix(SAMTOOLS_VIEW_MAP_MAP.out.versions) - versions = versions.mix(SAMTOOLS_VIEW_MAP_UNMAP.out.versions) - versions = versions.mix(SAMTOOLS_VIEW_UNMAP_MAP.out.versions) - versions = versions.mix(SAMTOOLS_VIEW_UNMAP_UNMAP.out.versions) - emit: reads - versions } diff --git a/subworkflows/local/bam_markduplicates/main.nf b/subworkflows/local/bam_markduplicates/main.nf index b1501ee40c..2e770e732c 100644 --- a/subworkflows/local/bam_markduplicates/main.nf +++ b/subworkflows/local/bam_markduplicates/main.nf @@ -30,7 +30,7 @@ workflow BAM_MARKDUPLICATES { .join(GATK4_MARKDUPLICATES.out.crai, failOnDuplicate: true, failOnMismatch: true)) // QC on alignment - CRAM_QC_MOSDEPTH_SAMTOOLS(alignment, fasta, intervals_bed_combined) + CRAM_QC_MOSDEPTH_SAMTOOLS(alignment, fasta, fasta_fai, intervals_bed_combined) // Gather all reports generated reports = reports.mix(GATK4_MARKDUPLICATES.out.metrics) diff --git a/subworkflows/local/bam_markduplicates_spark/main.nf b/subworkflows/local/bam_markduplicates_spark/main.nf index 86a3eaadb8..0c9172b706 100644 --- a/subworkflows/local/bam_markduplicates_spark/main.nf +++ b/subworkflows/local/bam_markduplicates_spark/main.nf @@ -29,10 +29,10 @@ workflow BAM_MARKDUPLICATES_SPARK { // Unified alignment output — join with the appropriate index alignment = GATK4SPARK_MARKDUPLICATES.out.output - .join(INDEX_MARKDUPLICATES.out.bai.mix(INDEX_MARKDUPLICATES.out.crai), failOnDuplicate: true, failOnMismatch: true) + .join(INDEX_MARKDUPLICATES.out.index, failOnDuplicate: true, failOnMismatch: true) // QC on alignment - CRAM_QC_MOSDEPTH_SAMTOOLS(alignment, fasta, intervals_bed_combined) + CRAM_QC_MOSDEPTH_SAMTOOLS(alignment, fasta, fasta_fai, intervals_bed_combined) // When running Marduplicates spark, and saving reports GATK4_ESTIMATELIBRARYCOMPLEXITY(bam, fasta.map{ _meta, fasta_ -> [ fasta_ ] }, fasta_fai.map{ _meta, fasta_fai_ -> [ fasta_fai_ ] }, dict.map{ _meta, dict_ -> [ dict_ ] }) @@ -42,7 +42,6 @@ workflow BAM_MARKDUPLICATES_SPARK { reports = reports.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.reports) // Gather versions of all tools used - versions = versions.mix(INDEX_MARKDUPLICATES.out.versions) versions = versions.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.versions) emit: diff --git a/subworkflows/local/bam_merge_index_samtools/main.nf b/subworkflows/local/bam_merge_index_samtools/main.nf index 61d252d226..41c7797211 100644 --- a/subworkflows/local/bam_merge_index_samtools/main.nf +++ b/subworkflows/local/bam_merge_index_samtools/main.nf @@ -12,7 +12,6 @@ workflow BAM_MERGE_INDEX_SAMTOOLS { bam // channel: [mandatory] meta, bam main: - versions = channel.empty() // Figuring out if there is one or more bam(s) from the same sample bam_to_merge = bam.branch{ meta, bam_ -> @@ -23,7 +22,7 @@ workflow BAM_MERGE_INDEX_SAMTOOLS { } // Only when using intervals - MERGE_BAM(bam_to_merge.multiple, [ [ id:'null' ], []], [ [ id:'null' ], []]) + MERGE_BAM(bam_to_merge.multiple.map { meta, bams -> [ meta, bams, [] ] }, [ [ id:'null' ], [], [], [] ]) // Mix intervals and no_intervals channels together bam_all = MERGE_BAM.out.bam.mix(bam_to_merge.single) @@ -32,14 +31,9 @@ workflow BAM_MERGE_INDEX_SAMTOOLS { INDEX_MERGE_BAM(bam_all) // Join with the bai file - bam_bai = bam_all.join(INDEX_MERGE_BAM.out.bai, failOnDuplicate: true, failOnMismatch: true) - - // Gather versions of all tools used - versions = versions.mix(INDEX_MERGE_BAM.out.versions) - versions = versions.mix(MERGE_BAM.out.versions) + bam_bai = bam_all.join(INDEX_MERGE_BAM.out.index, failOnDuplicate: true, failOnMismatch: true) emit: bam_bai - versions } diff --git a/subworkflows/local/bam_sentieon_dedup/main.nf b/subworkflows/local/bam_sentieon_dedup/main.nf index 33ffffd79d..151febcc39 100644 --- a/subworkflows/local/bam_sentieon_dedup/main.nf +++ b/subworkflows/local/bam_sentieon_dedup/main.nf @@ -30,7 +30,7 @@ workflow BAM_SENTIEON_DEDUP { : SENTIEON_DEDUP.out.cram.join(SENTIEON_DEDUP.out.crai, failOnDuplicate: true, failOnMismatch: true) // QC on alignment - CRAM_QC_MOSDEPTH_SAMTOOLS(alignment, fasta, intervals_bed_combined) + CRAM_QC_MOSDEPTH_SAMTOOLS(alignment, fasta, fasta_fai, intervals_bed_combined) // Gather all reports generated reports = reports.mix(SENTIEON_DEDUP.out.metrics) diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 2fe3ed51c6..1a1c7af1fc 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -91,7 +91,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { ) vcf_mpileup = BAM_VARIANT_CALLING_MPILEUP.out.vcf tbi_mpileup = BAM_VARIANT_CALLING_MPILEUP.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_MPILEUP.out.versions) } // CNVKIT @@ -153,7 +152,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_haplotypecaller = BAM_VARIANT_CALLING_HAPLOTYPECALLER.out.vcf tbi_haplotypecaller = BAM_VARIANT_CALLING_HAPLOTYPECALLER.out.tbi - if (joint_germline) { BAM_JOINT_CALLING_GERMLINE_GATK( BAM_VARIANT_CALLING_HAPLOTYPECALLER.out.gvcf_tbi_intervals, diff --git a/subworkflows/local/bam_variant_calling_mpileup/main.nf b/subworkflows/local/bam_variant_calling_mpileup/main.nf index 125a4a4684..2f94463936 100644 --- a/subworkflows/local/bam_variant_calling_mpileup/main.nf +++ b/subworkflows/local/bam_variant_calling_mpileup/main.nf @@ -18,7 +18,6 @@ workflow BAM_VARIANT_CALLING_MPILEUP { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = channel.empty() // Combine cram and intervals for spread and gather strategy cram_intervals = cram @@ -28,6 +27,9 @@ workflow BAM_VARIANT_CALLING_MPILEUP { // per-chunk bed restricts mpileup only; intervals_call left empty cram_intervals_bcftools = cram_intervals.map { meta, cram_, intervals_ -> [meta, cram_, intervals_, []] } + // samtools/mpileup now expects [ meta, input, index, intervals ]; keep the crai + cram_crai_intervals = cram.combine(intervals).map { meta, cram_, crai, intervals_, num_intervals -> [meta + [num_intervals: num_intervals], cram_, crai, intervals_] } + fasta_fai = fasta.combine(fai).map { meta, fasta_, _meta2, fai_ -> [meta, fasta_, fai_] }.collect() // Run, if --tools mpileup @@ -35,7 +37,7 @@ workflow BAM_VARIANT_CALLING_MPILEUP { BCFTOOLS_MPILEUP(cram_intervals_bcftools, fasta_fai, keep_bcftools_mpileup) //Only run, if --tools ControlFreec - SAMTOOLS_MPILEUP(cram_intervals, fasta) + SAMTOOLS_MPILEUP(cram_crai_intervals, fasta_fai) // Figuring out if there is one or more vcf(s) from the same sample vcf_mpileup = BCFTOOLS_MPILEUP.out.vcf.branch { meta, _vcf -> @@ -74,11 +76,8 @@ workflow BAM_VARIANT_CALLING_MPILEUP { .mix(tbi_mpileup.no_intervals) .map { meta, tbi -> [meta - meta.subMap('num_intervals') + [variantcaller: 'bcftools'], tbi] } - versions = versions.mix(SAMTOOLS_MPILEUP.out.versions) - emit: mpileup vcf tbi - versions } diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index 10a7b40b8f..4ca65663ad 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -122,8 +122,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { wes ? intervals_bed_combined : [], ) - versions = versions.mix(MPILEUP_NORMAL.out.versions) - versions = versions.mix(MPILEUP_TUMOR.out.versions) } // CNVKIT @@ -167,7 +165,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { tbi_manta = BAM_VARIANT_CALLING_SOMATIC_MANTA.out.diploid_sv_vcf_tbi.mix(BAM_VARIANT_CALLING_SOMATIC_MANTA.out.somatic_sv_vcf_tbi) } - // INDEXCOV // WGS only if (params.wes == false && tools.split(',').contains('indexcov')) { @@ -181,7 +178,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { versions = versions.mix(BAM_VARIANT_CALLING_INDEXCOV.out.versions) } - // STRELKA if (tools && tools.split(',').contains('strelka')) { cram_strelka = tools.split(',').contains('manta') diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 12e2e570e5..9b83123f0f 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -76,7 +76,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { ) vcf_mpileup = BAM_VARIANT_CALLING_MPILEUP.out.vcf tbi_mpileup = BAM_VARIANT_CALLING_MPILEUP.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_MPILEUP.out.versions) } // CONTROLFREEC (depends on MPILEUP) diff --git a/subworkflows/local/cram_merge_index_samtools/main.nf b/subworkflows/local/cram_merge_index_samtools/main.nf index def52fc2c5..93972d6b15 100644 --- a/subworkflows/local/cram_merge_index_samtools/main.nf +++ b/subworkflows/local/cram_merge_index_samtools/main.nf @@ -14,7 +14,6 @@ workflow CRAM_MERGE_INDEX_SAMTOOLS { fasta_fai // channel: [mandatory] meta, fai main: - versions = channel.empty() // Figuring out if there is one or more cram(s) from the same sample cram_to_merge = cram.branch { meta, cram_files -> @@ -24,7 +23,7 @@ workflow CRAM_MERGE_INDEX_SAMTOOLS { } // Only when using intervals - MERGE_CRAM(cram_to_merge.multiple, fasta, fasta_fai) + MERGE_CRAM(cram_to_merge.multiple.map { meta, crams -> [ meta, crams, [] ] }, fasta.combine(fasta_fai).map { meta, fasta_, _meta_fai, fai -> [ meta, fasta_, fai, [] ] }.collect()) // Mix intervals and no_intervals channels together cram_all = MERGE_CRAM.out.cram.mix(cram_to_merge.single) @@ -33,13 +32,8 @@ workflow CRAM_MERGE_INDEX_SAMTOOLS { INDEX_CRAM(cram_all) // Join with the crai file - cram_crai = cram_all.join(INDEX_CRAM.out.crai, failOnDuplicate: true, failOnMismatch: true) - - // Gather versions of all tools used - versions = versions.mix(INDEX_CRAM.out.versions) - versions = versions.mix(MERGE_CRAM.out.versions) + cram_crai = cram_all.join(INDEX_CRAM.out.index, failOnDuplicate: true, failOnMismatch: true) emit: cram_crai - versions } diff --git a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf index 15b1e97c4d..d5a1371cb3 100644 --- a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf +++ b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf @@ -10,7 +10,8 @@ include { MOSDEPTH } from '../../../modules/nf-core/mosdepth/main' workflow CRAM_QC_MOSDEPTH_SAMTOOLS { take: cram // channel: [mandatory] [ meta, cram, crai ] - fasta // channel: [mandatory] [ fasta ] + fasta // channel: [mandatory] [ meta, fasta ] + fasta_fai // channel: [mandatory] [ meta, fai ] intervals main: @@ -18,19 +19,15 @@ workflow CRAM_QC_MOSDEPTH_SAMTOOLS { reports = channel.empty() // Reports run on cram - SAMTOOLS_STATS(cram, fasta) + SAMTOOLS_STATS(cram, fasta.combine(fasta_fai).map { meta, fasta_, _fai_meta, fai -> [ meta, fasta_, fai ] }.collect()) - MOSDEPTH(cram.combine(intervals.map { _meta, bed -> [bed ?: []] }), fasta) + MOSDEPTH(cram.combine(intervals.map { _meta, bed -> [bed ?: []] }), fasta, []) // Gather all reports generated reports = reports.mix(SAMTOOLS_STATS.out.stats) reports = reports.mix(MOSDEPTH.out.global_txt) reports = reports.mix(MOSDEPTH.out.regions_txt) - // Gather versions of all tools used - versions = versions.mix(MOSDEPTH.out.versions) - versions = versions.mix(SAMTOOLS_STATS.out.versions) - emit: reports versions // channel: [ versions.yml ] diff --git a/subworkflows/local/cram_sampleqc/main.nf b/subworkflows/local/cram_sampleqc/main.nf index c3be937964..4ac78c2af8 100644 --- a/subworkflows/local/cram_sampleqc/main.nf +++ b/subworkflows/local/cram_sampleqc/main.nf @@ -18,6 +18,7 @@ workflow CRAM_SAMPLEQC { CRAM_QC_RECAL( cram, fasta_fai.map{meta, fasta, _fai -> [meta, fasta]}, + fasta_fai.map{meta, _fasta, fai -> [meta, fai]}, intervals_for_preprocessing, ) diff --git a/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf b/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf index f173a52108..11a5b13d72 100644 --- a/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf +++ b/subworkflows/local/fastq_create_umi_consensus_fgbio/main.nf @@ -22,7 +22,6 @@ workflow FASTQ_CREATE_UMI_CONSENSUS_FGBIO { groupreadsbyumi_strategy // string: [mandatory] grouping strategy - default: "Adjacency" main: - ch_versions = channel.empty() // params.umi_read_structure is passed out as ext.args // FASTQ reads are converted into a tagged unmapped BAM file (uBAM) @@ -57,7 +56,7 @@ workflow FASTQ_CREATE_UMI_CONSENSUS_FGBIO { } // Merge across runs/lanes for the same sample - MERGE_CONSENSUS(bams_to_merge.multiple, [[], []], [[], []]) + MERGE_CONSENSUS(bams_to_merge.multiple.map { meta, bams -> [ meta, bams, [] ] }, [[], [], [], []]) bams_all = MERGE_CONSENSUS.out.bam.mix(bams_to_merge.single) @@ -72,12 +71,8 @@ workflow FASTQ_CREATE_UMI_CONSENSUS_FGBIO { call_min_baseq = 10 CALLUMICONSENSUS(GROUPREADSBYUMI.out.bam, call_min_reads, call_min_baseq) - ch_versions = ch_versions.mix(BAM2FASTQ.out.versions) - ch_versions = ch_versions.mix(MERGE_CONSENSUS.out.versions) - emit: umibam = FASTQTOBAM.out.bam // channel: [ val(meta), [ bam ] ] groupbam = GROUPREADSBYUMI.out.bam // channel: [ val(meta), [ bam ] ] consensusbam = CALLUMICONSENSUS.out.bam // channel: [ val(meta), [ bam ] ] - versions = ch_versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/fastq_preprocess_gatk/main.nf b/subworkflows/local/fastq_preprocess_gatk/main.nf index df793c1de8..6fdb2613ee 100644 --- a/subworkflows/local/fastq_preprocess_gatk/main.nf +++ b/subworkflows/local/fastq_preprocess_gatk/main.nf @@ -90,15 +90,13 @@ workflow FASTQ_PREPROCESS_GATK { interleave_input = false // Currently don't allow interleaved input CONVERT_FASTQ_UMI( bam_converted_from_fastq, - [ [ id:"fasta" ], [] ], // fasta - [ [ id:'null' ], [] ], // fasta_fai + fasta, + fasta_fai, interleave_input) reads_for_fastp = CONVERT_FASTQ_UMI.out.reads // Gather used softwares versions - versions = versions.mix(CONVERT_FASTQ_UMI.out.versions) - versions = versions.mix(FASTQ_CREATE_UMI_CONSENSUS_FGBIO.out.versions) } else { reads_for_fastp = input_fastq } @@ -125,7 +123,6 @@ workflow FASTQ_PREPROCESS_GATK { }.transpose() } else reads_for_bbsplit = FASTP.out.reads - } else { reads_for_bbsplit = reads_for_fastp } @@ -150,7 +147,6 @@ workflow FASTQ_PREPROCESS_GATK { reads_for_alignment = reads_for_bbsplit } - // STEP 1: MAPPING READS TO REFERENCE GENOME // First, we must calculate number of lanes for each sample (meta.n_fastq) // This is needed to group reads from the same sample together using groupKey to avoid stalling the workflow @@ -224,7 +220,6 @@ workflow FASTQ_PREPROCESS_GATK { // Group .groupTuple() - // gatk4 markduplicates can handle multiple bams as input, so no need to merge/index here // Except if and only if save_mapped or (skipping markduplicates and sentieon-dedup) if ( @@ -237,14 +232,12 @@ workflow FASTQ_PREPROCESS_GATK { // bams are merged (when multiple lanes from the same sample), indexed and then converted to cram BAM_MERGE_INDEX_SAMTOOLS(bam_mapped) - BAM_TO_CRAM_MAPPING(BAM_MERGE_INDEX_SAMTOOLS.out.bam_bai, fasta, fasta_fai) + BAM_TO_CRAM_MAPPING(BAM_MERGE_INDEX_SAMTOOLS.out.bam_bai, fasta.combine(fasta_fai).map { meta, fasta_, _meta_fai, fai -> [ meta, fasta_, fai ] }.collect()) // Create CSV to restart from this step if (params.save_output_as_bam) CHANNEL_ALIGN_CREATE_CSV(BAM_MERGE_INDEX_SAMTOOLS.out.bam_bai, params.outdir, params.save_output_as_bam) else CHANNEL_ALIGN_CREATE_CSV(BAM_TO_CRAM_MAPPING.out.cram.join(BAM_TO_CRAM_MAPPING.out.crai, failOnDuplicate: true, failOnMismatch: true), params.outdir, params.save_output_as_bam) // Gather used softwares versions - versions = versions.mix(BAM_MERGE_INDEX_SAMTOOLS.out.versions) - versions = versions.mix(BAM_TO_CRAM_MAPPING.out.versions) } } @@ -285,7 +278,7 @@ workflow FASTQ_PREPROCESS_GATK { cram_skip_markduplicates = channel.empty().mix(input_sample) } - CRAM_QC_NO_MD(cram_skip_markduplicates, fasta, intervals_for_preprocessing) + CRAM_QC_NO_MD(cram_skip_markduplicates, fasta, fasta_fai, intervals_for_preprocessing) // Gather QC reports reports = reports.mix(CRAM_QC_NO_MD.out.reports.collect{ _meta, report -> [ report ] }) @@ -456,7 +449,6 @@ workflow FASTQ_PREPROCESS_GATK { cram_variant_calling_spark = BAM_APPLYBQSR_SPARK.out.alignment // Gather used softwares versions - versions = versions.mix(BAM_APPLYBQSR_SPARK.out.versions) } else { @@ -470,7 +462,6 @@ workflow FASTQ_PREPROCESS_GATK { cram_variant_calling_no_spark = BAM_APPLYBQSR.out.alignment // Gather used softwares versions - versions = versions.mix(BAM_APPLYBQSR.out.versions) } cram_variant_calling = channel.empty().mix( diff --git a/subworkflows/local/fastq_preprocess_parabricks/main.nf b/subworkflows/local/fastq_preprocess_parabricks/main.nf index 8886d0611f..d4a15fb271 100644 --- a/subworkflows/local/fastq_preprocess_parabricks/main.nf +++ b/subworkflows/local/fastq_preprocess_parabricks/main.nf @@ -18,7 +18,6 @@ workflow FASTQ_PREPROCESS_PARABRICKS { val_outdir // output directory for saving mapped files main: - ch_versions = channel.empty() ch_reports = channel.empty() reads_grouping_key = ch_reads.map { meta, reads -> @@ -78,8 +77,6 @@ workflow FASTQ_PREPROCESS_PARABRICKS { // crams are merged (when multiple lanes from the same sample) and indexed CRAM_MERGE_INDEX_SAMTOOLS(cram_mapped, ch_fasta, ch_fasta_fai) - ch_versions = ch_versions.mix(CRAM_MERGE_INDEX_SAMTOOLS.out.versions) - cram_variant_calling = CRAM_MERGE_INDEX_SAMTOOLS.out.cram_crai .map { meta, cram, crai -> [ meta - meta.subMap('id', 'read_group', 'data_type', 'size', 'sample_lane_id', 'lane') + [ data_type: 'cram', id: meta.sample ], cram, crai ] @@ -87,8 +84,7 @@ workflow FASTQ_PREPROCESS_PARABRICKS { if (val_save_output_as_bam) { // Convert CRAM files to BAM - CRAM_TO_BAM(cram_variant_calling, ch_fasta, ch_fasta_fai) - ch_versions = ch_versions.mix(CRAM_TO_BAM.out.versions) + CRAM_TO_BAM(cram_variant_calling, ch_fasta.combine(ch_fasta_fai).map { meta, fasta_, _meta_fai, fai -> [ meta, fasta_, fai ] }.collect()) CHANNEL_ALIGN_CREATE_CSV(CRAM_TO_BAM.out.bam.join(CRAM_TO_BAM.out.bai, failOnDuplicate: true, failOnMismatch: true), val_outdir, val_save_output_as_bam) } else if (val_save_mapped) { CHANNEL_ALIGN_CREATE_CSV(cram_variant_calling, val_outdir, val_save_output_as_bam) @@ -96,6 +92,5 @@ workflow FASTQ_PREPROCESS_PARABRICKS { emit: cram = cram_variant_calling // channel: [ val(meta), cram, crai ] - versions = ch_versions // channel: [ versions.yml ] reports = ch_reports } diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 5193807d1d..c52b73d911 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -99,9 +99,8 @@ workflow PREPARE_GENOME { } if (!fasta_fai_in && step != "annotate") { - SAMTOOLS_FAIDX(fasta, [[id: 'no_fai'], []], false) + SAMTOOLS_FAIDX(fasta.map { meta, fasta_ -> [ meta, fasta_, [] ] }, false) fasta_fai = SAMTOOLS_FAIDX.out.fai.collect() - versions = versions.mix(SAMTOOLS_FAIDX.out.versions) } else if (fasta_fai_in) { fasta_fai = channel.fromPath(fasta_fai_in).map { fai -> [[id: 'fai'], fai] }.collect() diff --git a/tests/aligner-bwa-mem.nf.test.snap b/tests/aligner-bwa-mem.nf.test.snap index 0ca5918bbd..f450b48c78 100644 --- a/tests/aligner-bwa-mem.nf.test.snap +++ b/tests/aligner-bwa-mem.nf.test.snap @@ -4,7 +4,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -20,10 +20,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -204,7 +204,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -220,10 +220,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/aligner-bwa-mem2.nf.test.snap b/tests/aligner-bwa-mem2.nf.test.snap index da63c14f1b..5879c7efa9 100644 --- a/tests/aligner-bwa-mem2.nf.test.snap +++ b/tests/aligner-bwa-mem2.nf.test.snap @@ -67,7 +67,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM2_INDEX": { "bwamem2": "2.2.1" @@ -83,10 +83,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -204,7 +204,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM2_INDEX": { "bwamem2": "2.2.1" @@ -220,10 +220,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/aligner-dragmap.nf.test.snap b/tests/aligner-dragmap.nf.test.snap index b59f4a72f0..5a1f1fb712 100644 --- a/tests/aligner-dragmap.nf.test.snap +++ b/tests/aligner-dragmap.nf.test.snap @@ -72,7 +72,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -89,10 +89,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -209,7 +209,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -226,10 +226,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/aligner-parabricks.nf.test.snap b/tests/aligner-parabricks.nf.test.snap index 5eba11e3e1..9efe301a64 100644 --- a/tests/aligner-parabricks.nf.test.snap +++ b/tests/aligner-parabricks.nf.test.snap @@ -7,7 +7,7 @@ "bwa": "0.7.19-r1273" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -19,19 +19,20 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "PARABRICKS_FQ2BAM": { "parabricks": "4.6.0-1" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -197,7 +198,7 @@ "mosdepth_perchrom.txt:md5,f3a4ba86603c5121a26f54616a39c1ba", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", "multiqc_fastqc.txt:md5,bde0d0bffa62228b33fb68b7e25b6ff8", - "samtools-stats-dp.txt:md5,068d671d8e3fa0a12b9c36072fb36808", + "samtools-stats-dp.txt:md5,9dbdd996ce0e7edb5b7861eb13eba285", "samtools_alignment_plot.txt:md5,d2729501a111a33268c008ef6f18c7cd", "samtools_insert_size.txt:md5,1553c58beee5f377cddbcbe8c527720a", "genome.fasta.amb:md5,1891c1de381b3a96d4e72f590fde20c1", @@ -213,9 +214,9 @@ "test.recal.mosdepth.region.dist.txt:md5,45016e5a0b9afb065c56833ba66f3049", "test.recal.mosdepth.summary.txt:md5,3968d28e14fd99350ec75e919778ad0f", "test.recal.per-base.bed.gz:md5,ab3fb06c65b28f774b22973085699d51", - "test.recal.per-base.bed.gz.csi:md5,bc588fff78a04f4c31e16768ddde204d", + "test.recal.per-base.bed.gz.csi:md5,2171094832c1eab19654be30cf0386d8", "test.recal.regions.bed.gz:md5,912777bfe53139edf4948106611d3aeb", - "test.recal.regions.bed.gz.csi:md5,e24653e1e1cc9703eecaee9ebf3d2b13" + "test.recal.regions.bed.gz.csi:md5,6f7ee623716b66db7f62de827cec1324" ], [ "test.bam:md5,9da56e1adc10f4fa65303441b8a5a328" @@ -226,11 +227,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T11:40:10.237605568", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-01-30T16:47:31.914017014" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --aligner parabricks --wes": { "content": [ @@ -249,19 +250,20 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "PARABRICKS_FQ2BAM": { "parabricks": "4.6.0-1" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -431,7 +433,7 @@ "mosdepth_perchrom.txt:md5,f3a4ba86603c5121a26f54616a39c1ba", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", "multiqc_fastqc.txt:md5,bde0d0bffa62228b33fb68b7e25b6ff8", - "samtools-stats-dp.txt:md5,068d671d8e3fa0a12b9c36072fb36808", + "samtools-stats-dp.txt:md5,9dbdd996ce0e7edb5b7861eb13eba285", "samtools_alignment_plot.txt:md5,d2729501a111a33268c008ef6f18c7cd", "samtools_insert_size.txt:md5,1553c58beee5f377cddbcbe8c527720a", "genome.fasta.amb:md5,1891c1de381b3a96d4e72f590fde20c1", @@ -447,9 +449,9 @@ "test.recal.mosdepth.region.dist.txt:md5,45016e5a0b9afb065c56833ba66f3049", "test.recal.mosdepth.summary.txt:md5,3968d28e14fd99350ec75e919778ad0f", "test.recal.per-base.bed.gz:md5,ab3fb06c65b28f774b22973085699d51", - "test.recal.per-base.bed.gz.csi:md5,bc588fff78a04f4c31e16768ddde204d", + "test.recal.per-base.bed.gz.csi:md5,2171094832c1eab19654be30cf0386d8", "test.recal.regions.bed.gz:md5,912777bfe53139edf4948106611d3aeb", - "test.recal.regions.bed.gz.csi:md5,e24653e1e1cc9703eecaee9ebf3d2b13" + "test.recal.regions.bed.gz.csi:md5,6f7ee623716b66db7f62de827cec1324" ], "No BAM files", [ @@ -462,11 +464,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T11:40:10.53055388", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-01-30T16:54:59.62879975" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --aligner parabricks --tools mutect2 --wes --input fastq_pair.csv": { "content": [ @@ -500,13 +502,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "LEARNREADORIENTATIONMODEL": { "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2_PAIRED": { "gatk4": "4.6.2.0" @@ -515,7 +518,7 @@ "parabricks": "4.6.0-1" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -741,7 +744,7 @@ "mosdepth_perchrom.txt:md5,8973b4a63f05d9443da33ccd1fd48cb1", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", "multiqc_fastqc.txt:md5,2fd25e8c81f962594b801d5a9df3cd87", - "samtools-stats-dp.txt:md5,a2f978ab572ed3c72e3af6e605708d59", + "samtools-stats-dp.txt:md5,af97f6426bc8c6b9d812cc97e880743f", "samtools_alignment_plot.txt:md5,94d6398ce03eefb42aa6f106c8d36e89", "samtools_insert_size.txt:md5,3cf6a33d6676f31b5433f2cc4bf887e0", "genome.fasta.amb:md5,1891c1de381b3a96d4e72f590fde20c1", @@ -758,16 +761,16 @@ "test.recal.mosdepth.region.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.recal.mosdepth.summary.txt:md5,2ea3534987f28b3ed0b64a8e7986b442", "test.recal.per-base.bed.gz:md5,e04122db11a66ad6ef7c851511b1b505", - "test.recal.per-base.bed.gz.csi:md5,a0c543664c7e5902d1cb56c25f4123b3", + "test.recal.per-base.bed.gz.csi:md5,a815256bdb29a623bb11677e4fbc69e3", "test.recal.regions.bed.gz:md5,339335cc6d0a8048a3e328eaa93c5160", - "test.recal.regions.bed.gz.csi:md5,a43bfb8c598e3091406b25ba174c0270", + "test.recal.regions.bed.gz.csi:md5,cbc8b8b2bad75646406113dbc8cd13b8", "test2.recal.mosdepth.global.dist.txt:md5,f25166c3a0051bb4d8c11a210278de6c", "test2.recal.mosdepth.region.dist.txt:md5,f25166c3a0051bb4d8c11a210278de6c", "test2.recal.mosdepth.summary.txt:md5,325213ef7bbb89b9ae27ef59252eca49", "test2.recal.per-base.bed.gz:md5,027f5d98da0e283df866f2d9ac8255db", - "test2.recal.per-base.bed.gz.csi:md5,c471e17d82fddaeca77167331dead581", + "test2.recal.per-base.bed.gz.csi:md5,8f1b503a7653f4637dd83bca4f7dccca", "test2.recal.regions.bed.gz:md5,7f23663b3565fb9546dfaa829dd68c61", - "test2.recal.regions.bed.gz.csi:md5,e24653e1e1cc9703eecaee9ebf3d2b13", + "test2.recal.regions.bed.gz.csi:md5,6f7ee623716b66db7f62de827cec1324", "test2_vs_test.mutect2.filtered.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "test2_vs_test.mutect2.filtered.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f", "test.mutect2.pileups.table:md5,4a89cfa663f1552aeb80d5c31aa36e3d", @@ -792,11 +795,11 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T11:45:10.811937172", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-30T13:32:40.97607962" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --aligner parabricks --wes --intervals": { "content": [ @@ -812,19 +815,20 @@ "fastqc": "0.12.1" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "PARABRICKS_FQ2BAM": { "parabricks": "4.6.0-1" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -993,7 +997,7 @@ "mosdepth_perchrom.txt:md5,63cfbfc1ea970a26a7f0470efd9ad692", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", "multiqc_fastqc.txt:md5,bde0d0bffa62228b33fb68b7e25b6ff8", - "samtools-stats-dp.txt:md5,068d671d8e3fa0a12b9c36072fb36808", + "samtools-stats-dp.txt:md5,9dbdd996ce0e7edb5b7861eb13eba285", "samtools_alignment_plot.txt:md5,d2729501a111a33268c008ef6f18c7cd", "samtools_insert_size.txt:md5,1553c58beee5f377cddbcbe8c527720a", "genome.fasta.amb:md5,1891c1de381b3a96d4e72f590fde20c1", @@ -1008,9 +1012,9 @@ "test.recal.mosdepth.region.dist.txt:md5,a9e42dc9d21073821858d40ffce5bcde", "test.recal.mosdepth.summary.txt:md5,ac93e4aa5a5229d001404513816cc219", "test.recal.per-base.bed.gz:md5,ab3fb06c65b28f774b22973085699d51", - "test.recal.per-base.bed.gz.csi:md5,bc588fff78a04f4c31e16768ddde204d", + "test.recal.per-base.bed.gz.csi:md5,2171094832c1eab19654be30cf0386d8", "test.recal.regions.bed.gz:md5,326c62bcdb340f213cc4514213516415", - "test.recal.regions.bed.gz.csi:md5,5c00a1d457c387d6e71848a6d897e309" + "test.recal.regions.bed.gz.csi:md5,ae98c5e0c344c0961bc9273e26fcb803" ], "No BAM files", [ @@ -1023,10 +1027,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T11:44:05.461520368", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-01-30T16:51:33.339994069" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/alignment_from_everything.nf.test.snap b/tests/alignment_from_everything.nf.test.snap index 14e2c4a9d6..0e37ebd638 100644 --- a/tests/alignment_from_everything.nf.test.snap +++ b/tests/alignment_from_everything.nf.test.snap @@ -14,10 +14,10 @@ "cat": "9.5" }, "COLLATE_FASTQ_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "COLLATE_FASTQ_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -39,28 +39,29 @@ "samtools": "1.21" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_MERGE_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SPRING_DECOMPRESS_TO_FQ_PAIR": { "spring": "1.1.1" @@ -372,49 +373,49 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,63dfeeafbef0aa87f48ab923402dcaed", + "samtools-stats-dp.txt:md5,6ff529835252acfb12982e1e749a12ab", "samtools_alignment_plot.txt:md5,7c53a04c42499c92735d947bc8417dd6", "samtools_insert_size.txt:md5,5a1a7d2501dbb68ff13f4b7e79b63e8c", "test.md.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test.md.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.md.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test.md.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test.md.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test.md.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test.recal.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test.recal.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.recal.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test.recal.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test.recal.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test.recal.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test2.md.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test2.md.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test2.md.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test2.md.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test2.md.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test2.md.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test2.recal.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test2.recal.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test2.recal.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test2.recal.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test2.recal.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test2.recal.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test3.md.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test3.md.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test3.md.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test3.md.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test3.md.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test3.md.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test3.recal.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test3.recal.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test3.recal.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test3.recal.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test3.recal.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test3.recal.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test_bam.md.mosdepth.global.dist.txt:md5,9cb9b181119256ed17a77dcf44d58285", "test_bam.md.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test_bam.md.mosdepth.summary.txt:md5,dbe376360e437c89190139ef0ae6769a", "test_bam.md.regions.bed.gz:md5,0e5ed846b9b11717e42e93eec60f4ffc", - "test_bam.md.regions.bed.gz.csi:md5,d0713716f63ac573f4a3385733e9a537", + "test_bam.md.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0", "test_bam.recal.mosdepth.global.dist.txt:md5,9cb9b181119256ed17a77dcf44d58285", "test_bam.recal.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test_bam.recal.mosdepth.summary.txt:md5,dbe376360e437c89190139ef0ae6769a", "test_bam.recal.regions.bed.gz:md5,0e5ed846b9b11717e42e93eec60f4ffc", - "test_bam.recal.regions.bed.gz.csi:md5,d0713716f63ac573f4a3385733e9a537" + "test_bam.recal.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0" ], [ "test.sorted.bam:md5,59ecc5c82c7af1283eea7507c590c831", @@ -434,7 +435,7 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-04-09T13:11:35.435247726", + "timestamp": "2026-07-27T10:23:15.832931857", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/alignment_to_fastq.nf.test.snap b/tests/alignment_to_fastq.nf.test.snap index 7511faf85a..a2a82b769a 100644 --- a/tests/alignment_to_fastq.nf.test.snap +++ b/tests/alignment_to_fastq.nf.test.snap @@ -14,10 +14,10 @@ "cat": "9.5" }, "COLLATE_FASTQ_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "COLLATE_FASTQ_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -39,28 +39,29 @@ "samtools": "1.21" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_MERGE_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -262,19 +263,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,ea167e1f03920b6214de041740ca3cd5", + "samtools-stats-dp.txt:md5,55f72382d2fb37e9b0d8b5cc5de5f147", "samtools_alignment_plot.txt:md5,7a727168e9bbb3f4c39894933438df98", "samtools_insert_size.txt:md5,c00ec0f338c40f2f1bc129f46ffb9084", "test.md.mosdepth.global.dist.txt:md5,9cb9b181119256ed17a77dcf44d58285", "test.md.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.md.mosdepth.summary.txt:md5,dbe376360e437c89190139ef0ae6769a", "test.md.regions.bed.gz:md5,0e5ed846b9b11717e42e93eec60f4ffc", - "test.md.regions.bed.gz.csi:md5,d0713716f63ac573f4a3385733e9a537", + "test.md.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0", "test.recal.mosdepth.global.dist.txt:md5,9cb9b181119256ed17a77dcf44d58285", "test.recal.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.recal.mosdepth.summary.txt:md5,dbe376360e437c89190139ef0ae6769a", "test.recal.regions.bed.gz:md5,0e5ed846b9b11717e42e93eec60f4ffc", - "test.recal.regions.bed.gz.csi:md5,d0713716f63ac573f4a3385733e9a537" + "test.recal.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0" ], [ "test.sorted.bam:md5,6934a96fff1eaa2f70b31ab7e11d3598", @@ -285,10 +286,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:21:40.510324699", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T20:13:07.668460853" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/bbsplit.nf.test.snap b/tests/bbsplit.nf.test.snap index 7a68e41943..f214e1b69d 100644 --- a/tests/bbsplit.nf.test.snap +++ b/tests/bbsplit.nf.test.snap @@ -39,13 +39,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -363,10 +364,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-05-19T17:32:09.176203172", + "timestamp": "2026-07-27T10:22:41.864255495", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools bbsplit,strelka --bbsplit_fasta_list -stub": { @@ -409,13 +410,13 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -636,13 +637,14 @@ "samtools": "1.21" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_FAIDX": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -836,10 +838,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-02-06T14:28:35.628964819", + "timestamp": "2026-07-27T10:25:04.052795149", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index c2f891429b..ab53f6469e 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -33,13 +33,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -296,7 +297,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", + "samtools-stats-dp.txt:md5,92dc10e61df31bf4286b16582bed488f", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", @@ -304,12 +305,12 @@ "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.md.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.md.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.md.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.recal.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.recal.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.recal.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.recal.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.recal.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.recal.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.strelka.variants.FILTER.summary:md5,dd87f507da7de20d5318841af312493b", "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -326,10 +327,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-05-19T18:36:49.982943659", + "timestamp": "2026-07-27T10:25:08.849820282", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test -stub": { @@ -366,13 +367,13 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" diff --git a/tests/fastp.nf.test.snap b/tests/fastp.nf.test.snap index 111b6110ba..9d642ce582 100644 --- a/tests/fastp.nf.test.snap +++ b/tests/fastp.nf.test.snap @@ -33,13 +33,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -326,7 +327,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,58ea8c88565a359af678aa588e44895c", + "samtools-stats-dp.txt:md5,3f430eb99682ee0d3960a42c5a43650e", "samtools_alignment_plot.txt:md5,aac925e42c9da438ab9f0fb7ae77e2fa", "samtools_insert_size.txt:md5,9eccc96ce006c0161497782ed3afc147", "test-test_L1_R1.fastp.fastq.gz:md5,f1a5c524cae7be9b5ca9a4138f847cfa", @@ -339,12 +340,12 @@ "test.md.mosdepth.region.dist.txt:md5,02d51752367e753a6984c12f059499ba", "test.md.mosdepth.summary.txt:md5,f18e776c3ee8e6947c3a69c136f54860", "test.md.regions.bed.gz:md5,a3e8ccd3f04d3aee009a109d52b69920", - "test.md.regions.bed.gz.csi:md5,74d39fd1e463ce7b77610c96f5f57daf", + "test.md.regions.bed.gz.csi:md5,4b8894bcd39f647bff72e55fe6b5fe4d", "test.recal.mosdepth.global.dist.txt:md5,b1c26e3381f220e65d683048ab6b6e2a", "test.recal.mosdepth.region.dist.txt:md5,02d51752367e753a6984c12f059499ba", "test.recal.mosdepth.summary.txt:md5,f18e776c3ee8e6947c3a69c136f54860", "test.recal.regions.bed.gz:md5,a3e8ccd3f04d3aee009a109d52b69920", - "test.recal.regions.bed.gz.csi:md5,74d39fd1e463ce7b77610c96f5f57daf" + "test.recal.regions.bed.gz.csi:md5,4b8894bcd39f647bff72e55fe6b5fe4d" ], "No BAM files", [ @@ -356,11 +357,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:23:58.917345607", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-17T14:34:45.9737357" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --split_fastq 150000": { "content": [ @@ -396,13 +397,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -701,7 +703,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,93ec69f6db74d9de7e4a549491ae2c73", + "samtools-stats-dp.txt:md5,75006287063bdff5824a9ccc46567138", "samtools_alignment_plot.txt:md5,962b7dd27f48ec4bbb668c8c32cbea1b", "samtools_insert_size.txt:md5,555c4ca8aac120c3b23e6cd2457922cd", "0001.test-test_L1_R1.fastp.fastq.gz:md5,f379a60cc2a41f39fa0c0d23edf6eb61", @@ -726,12 +728,12 @@ "test.md.mosdepth.region.dist.txt:md5,5062f8b7bb536c9b77a68f4ccd2315c2", "test.md.mosdepth.summary.txt:md5,455358d5943fd1e5f09853acff3e50b6", "test.md.regions.bed.gz:md5,729091bfb7c08486c8d247f4629996e6", - "test.md.regions.bed.gz.csi:md5,295eb71f59c0e37b5c3cf289a467f97e", + "test.md.regions.bed.gz.csi:md5,fc3378906815c0591f36b0e2d9d6fad8", "test.recal.mosdepth.global.dist.txt:md5,e5d0c6bf323c32f5414bd48b90bb32fa", "test.recal.mosdepth.region.dist.txt:md5,5062f8b7bb536c9b77a68f4ccd2315c2", "test.recal.mosdepth.summary.txt:md5,455358d5943fd1e5f09853acff3e50b6", "test.recal.regions.bed.gz:md5,729091bfb7c08486c8d247f4629996e6", - "test.recal.regions.bed.gz.csi:md5,295eb71f59c0e37b5c3cf289a467f97e" + "test.recal.regions.bed.gz.csi:md5,fc3378906815c0591f36b0e2d9d6fad8" ], "No BAM files", [ @@ -743,11 +745,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:21:50.402269939", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-03-06T15:10:32.391037" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --trim_fastq (no save)": { "content": [ @@ -783,13 +785,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1070,7 +1073,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", + "samtools-stats-dp.txt:md5,92dc10e61df31bf4286b16582bed488f", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", "test-test_L1.fastp.json:md5,a7746b05c3ffb374c8f5d204f971879e", @@ -1079,12 +1082,12 @@ "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.md.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.md.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.md.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.recal.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.recal.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.recal.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.recal.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.recal.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2" + "test.recal.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623" ], "No BAM files", [ @@ -1096,10 +1099,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:21:18.402385401", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-03-06T15:02:50.499879" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } \ No newline at end of file diff --git a/tests/intervals.nf.test.snap b/tests/intervals.nf.test.snap index d4af6db508..132408824a 100644 --- a/tests/intervals.nf.test.snap +++ b/tests/intervals.nf.test.snap @@ -4,7 +4,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BUILD_INTERVALS": { "gawk": "5.3.1" @@ -20,10 +20,10 @@ "gawk": "5.3.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -88,7 +88,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -101,10 +101,10 @@ "gawk": "5.3.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -150,7 +150,7 @@ 7, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -160,10 +160,10 @@ "samtools": "1.22.1" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -208,7 +208,7 @@ 7, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -218,10 +218,10 @@ "samtools": "1.22.1" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -261,7 +261,7 @@ 9, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -274,10 +274,10 @@ "gawk": "5.3.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -318,7 +318,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BUILD_INTERVALS": { "gawk": "5.3.1" @@ -334,10 +334,10 @@ "gawk": "5.3.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/joint_calling_haplotypecaller.nf.test.snap b/tests/joint_calling_haplotypecaller.nf.test.snap index dd4c356dfe..d6cf847b4b 100644 --- a/tests/joint_calling_haplotypecaller.nf.test.snap +++ b/tests/joint_calling_haplotypecaller.nf.test.snap @@ -28,10 +28,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -196,7 +197,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,46e5004d6eb0d4f451706dcbb7acc2ed", "mosdepth_perchrom.txt:md5,a9d61b7a7c54a27857b03a1c51ba6ff5", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", + "samtools-stats-dp.txt:md5,1f1da592b5ef6dc0339d4d0b7b9aa03c", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", "joint_germline.bcftools_stats.txt:md5,8d7de0e9bbf007cf6c80caaa5e6e9ea2", @@ -204,16 +205,16 @@ "testN.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "testN.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", "testN.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", - "testN.recal.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4", + "testN.recal.per-base.bed.gz.csi:md5,524a822fc4863b450fda9e0f99ccdf04", "testN.recal.regions.bed.gz:md5,0c8215fbea7b0bf7aba9d1781575f905", - "testN.recal.regions.bed.gz.csi:md5,5c00a1d457c387d6e71848a6d897e309", + "testN.recal.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "testT.recal.mosdepth.global.dist.txt:md5,ba97ed85645f77da6f3adad138b3cdb4", "testT.recal.mosdepth.region.dist.txt:md5,a7eb835371dd0aaf347ccca7ebe1eb3b", "testT.recal.mosdepth.summary.txt:md5,a937108cbf24c1430b79c861234ce22b", "testT.recal.per-base.bed.gz:md5,fde70b7a0caef4460692540b97b3fd52", - "testT.recal.per-base.bed.gz.csi:md5,7f62d96cdff1ce2acc0c7d2d0549cb1b", + "testT.recal.per-base.bed.gz.csi:md5,ff9ad8863871d40f0f0ef283a74fdae2", "testT.recal.regions.bed.gz:md5,8f0d545a0950c6a53225abec38553f6f", - "testT.recal.regions.bed.gz.csi:md5,5c00a1d457c387d6e71848a6d897e309", + "testT.recal.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "joint_germline.FILTER.summary:md5,2a4eb7abfb2e64e45d53fdda17530b7f", "joint_germline.TsTv.count:md5,949fa16c755189c23a37f0ea8ecd1b26" ], @@ -228,11 +229,11 @@ "WARN: If GATK's Haplotypecaller, Sentieon's Dnascope and/or Sentieon's Haplotyper is specified, but without `--dbsnp`, `--known_snps`, `--known_indels` or the associated resource labels (ie `known_snps_vqsr`), no variant recalibration will be done. For recalibration you must provide all of these resources." ] ], + "timestamp": "2026-07-27T10:17:46.812394654", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T19:58:09.342469278" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "Fails with --no_intervals and --joint_germline for haplotypecaller": { "content": [ @@ -280,10 +281,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -448,7 +450,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,46e5004d6eb0d4f451706dcbb7acc2ed", "mosdepth_perchrom.txt:md5,a9d61b7a7c54a27857b03a1c51ba6ff5", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", + "samtools-stats-dp.txt:md5,1f1da592b5ef6dc0339d4d0b7b9aa03c", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", "joint_germline.bcftools_stats.txt:md5,8d7de0e9bbf007cf6c80caaa5e6e9ea2", @@ -456,16 +458,16 @@ "testN.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "testN.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", "testN.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", - "testN.recal.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4", + "testN.recal.per-base.bed.gz.csi:md5,524a822fc4863b450fda9e0f99ccdf04", "testN.recal.regions.bed.gz:md5,0c8215fbea7b0bf7aba9d1781575f905", - "testN.recal.regions.bed.gz.csi:md5,5c00a1d457c387d6e71848a6d897e309", + "testN.recal.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "testT.recal.mosdepth.global.dist.txt:md5,ba97ed85645f77da6f3adad138b3cdb4", "testT.recal.mosdepth.region.dist.txt:md5,a7eb835371dd0aaf347ccca7ebe1eb3b", "testT.recal.mosdepth.summary.txt:md5,a937108cbf24c1430b79c861234ce22b", "testT.recal.per-base.bed.gz:md5,fde70b7a0caef4460692540b97b3fd52", - "testT.recal.per-base.bed.gz.csi:md5,7f62d96cdff1ce2acc0c7d2d0549cb1b", + "testT.recal.per-base.bed.gz.csi:md5,ff9ad8863871d40f0f0ef283a74fdae2", "testT.recal.regions.bed.gz:md5,8f0d545a0950c6a53225abec38553f6f", - "testT.recal.regions.bed.gz.csi:md5,5c00a1d457c387d6e71848a6d897e309", + "testT.recal.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "joint_germline.FILTER.summary:md5,2a4eb7abfb2e64e45d53fdda17530b7f", "joint_germline.TsTv.count:md5,949fa16c755189c23a37f0ea8ecd1b26" ], @@ -480,10 +482,10 @@ "WARN: If GATK's Haplotypecaller, Sentieon's Dnascope and/or Sentieon's Haplotyper is specified, but without `--dbsnp`, `--known_snps`, `--known_indels` or the associated resource labels (ie `known_snps_vqsr`), no variant recalibration will be done. For recalibration you must provide all of these resources." ] ], + "timestamp": "2026-07-27T10:19:45.167839338", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T19:59:28.831246669" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/joint_calling_mutect2.nf.test.snap b/tests/joint_calling_mutect2.nf.test.snap index 2ecca9bc76..88da7e4892 100644 --- a/tests/joint_calling_mutect2.nf.test.snap +++ b/tests/joint_calling_mutect2.nf.test.snap @@ -16,13 +16,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2_PAIRED": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -191,7 +192,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,f08ab9b4898020d43b2e0ff77212f5b2", "mosdepth_perchrom.txt:md5,05b840db853703d42c6c0be360cb573e", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,fe7c4ec200c94df7ff97a0e8cbec2f70", + "samtools-stats-dp.txt:md5,801a1756a694e97039aae8500a5477f6", "samtools_alignment_plot.txt:md5,82d6fb277fbbbd221a92ebda4567d9d9", "samtools_insert_size.txt:md5,00660bb059693565c1189ce98356e414", "test.mutect2.bcftools_stats.txt:md5,2de4f9f8da53b202e9d784b4e95c3245", @@ -199,23 +200,23 @@ "sample1.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample1.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample1.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample1.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample1.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample1.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample1.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample1.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample2.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample2.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample3.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample3.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample3.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample3.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample3.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample3.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample3.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample3.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "test.mutect2.FILTER.summary:md5,19fd44ff1fbdfe422473bf1f5dc9cdb3", "test.mutect2.TsTv.count:md5,aa51bde6080c015c6aa6c8254977dd11", "test.mutect2.vcf.gz.stats:md5,6340205d9cc91fc3c2d243fc151c210b" @@ -230,11 +231,11 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:33:51.065452986", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T20:17:32.428293264" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/recalibrated_tumoronly_joint.csv --tools mutect2 --joint_mutect2": { "content": [ @@ -256,13 +257,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -421,7 +423,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0bd6d5120cacef0c90192267731031a5", "mosdepth_perchrom.txt:md5,a14350b5c82288d538ea43992a65be99", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e6019a625137ced6d426a503cd652559", + "samtools-stats-dp.txt:md5,32150435d1e8f1c6f47ba618a71f1e86", "samtools_alignment_plot.txt:md5,cb01fb538637d281195e46e557031c7a", "samtools_insert_size.txt:md5,97989575c42dadc81f347d661faa09cb", "test.mutect2.bcftools_stats.txt:md5,3079129e89fdaf04a3403d888a99fd81", @@ -429,16 +431,16 @@ "sample2.recal.mosdepth.region.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,b0b47739dcafeeb1a9e6218b8abca1e0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.recal.regions.bed.gz:md5,fb0efeba20ea272b7b709cf65246689e", - "sample2.recal.regions.bed.gz.csi:md5,e8452848671e9e5c147ff4cceee944af", + "sample2.recal.regions.bed.gz.csi:md5,e95efa0e55e9f9699b48e6a661d5e1e4", "sample3.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample3.recal.mosdepth.region.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample3.recal.mosdepth.summary.txt:md5,b0b47739dcafeeb1a9e6218b8abca1e0", "sample3.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample3.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample3.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample3.recal.regions.bed.gz:md5,fb0efeba20ea272b7b709cf65246689e", - "sample3.recal.regions.bed.gz.csi:md5,e8452848671e9e5c147ff4cceee944af", + "sample3.recal.regions.bed.gz.csi:md5,e95efa0e55e9f9699b48e6a661d5e1e4", "test.mutect2.FILTER.summary:md5,b55562501b24e3cec53c22ffe0ce346f", "test.mutect2.TsTv.count:md5,d06a480e205f2f894db2bb51846b4c39", "test.mutect2.vcf.gz.stats:md5,bd9ff0f343dd60fdd2860fdeff617a51" @@ -453,10 +455,10 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:32:24.759023585", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T20:42:22.769087844" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/lane_integer.nf.test.snap b/tests/lane_integer.nf.test.snap index e6d0a7f91a..b2462b19ff 100644 --- a/tests/lane_integer.nf.test.snap +++ b/tests/lane_integer.nf.test.snap @@ -4,7 +4,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -20,10 +20,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/multi_lane.nf.test.snap b/tests/multi_lane.nf.test.snap index 334e9fbdbe..4a53664d79 100644 --- a/tests/multi_lane.nf.test.snap +++ b/tests/multi_lane.nf.test.snap @@ -4,7 +4,7 @@ 21, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -30,13 +30,13 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -119,10 +119,11 @@ 25, { "BAM2FASTQ": { - "samtools": 1.21 + "bgzip": "1.24", + "samtools": "1.24" }, "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -138,10 +139,10 @@ "cat": "9.5" }, "COLLATE_FASTQ_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "COLLATE_FASTQ_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -156,25 +157,25 @@ "fgbio": "3.1.2" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_CONSENSUS": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_MERGE_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -222,10 +223,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_umi_cleanname_1.fastq.gz): Cannot extract flowcell ID from @922332" ] ], + "timestamp": "2026-07-27T10:26:26.437520414", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-03-11T11:53:37.119233" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } \ No newline at end of file diff --git a/tests/postprocess_concatenation.nf.test.snap b/tests/postprocess_concatenation.nf.test.snap index 9eb4b11103..6874962f23 100644 --- a/tests/postprocess_concatenation.nf.test.snap +++ b/tests/postprocess_concatenation.nf.test.snap @@ -28,10 +28,11 @@ "bcftools": "1.23.1" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -247,7 +248,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,f0177ed551b6ec930854d0d221904ec0", "mosdepth_perchrom.txt:md5,9cfd38310d4da59c7242b2a7ae6bd651", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", + "samtools-stats-dp.txt:md5,1f1da592b5ef6dc0339d4d0b7b9aa03c", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", @@ -258,12 +259,12 @@ "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "testN.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "testN.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "testN.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testT.recal.mosdepth.global.dist.txt:md5,3106c114529adc4231badeb3bb38b6d1", "testT.recal.mosdepth.region.dist.txt:md5,ccf646922b05cb4759c4f89072be2b69", "testT.recal.mosdepth.summary.txt:md5,024649a659caff330dfbef4ac3560542", "testT.recal.regions.bed.gz:md5,14b36a2cf428840aab471f95cfbe399f", - "testT.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "testT.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testN.freebayes.filtered.FILTER.summary:md5,e2f8e86fb18631c0bf6ccd7d9d4039c8", "testN.freebayes.filtered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc", "testT.freebayes.filtered.FILTER.summary:md5,4b25443c427fd27761017e4f3a556b29", @@ -295,10 +296,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:26:19.867067032", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-03T11:06:26.54547" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/postprocess_concatenation_normalization.nf.test.snap b/tests/postprocess_concatenation_normalization.nf.test.snap index 3c4a7ecd72..fe3dcb3881 100644 --- a/tests/postprocess_concatenation_normalization.nf.test.snap +++ b/tests/postprocess_concatenation_normalization.nf.test.snap @@ -31,10 +31,11 @@ "bcftools": "1.23.1" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -278,7 +279,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,f0177ed551b6ec930854d0d221904ec0", "mosdepth_perchrom.txt:md5,9cfd38310d4da59c7242b2a7ae6bd651", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", + "samtools-stats-dp.txt:md5,1f1da592b5ef6dc0339d4d0b7b9aa03c", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", @@ -289,12 +290,12 @@ "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "testN.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "testN.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "testN.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testT.recal.mosdepth.global.dist.txt:md5,3106c114529adc4231badeb3bb38b6d1", "testT.recal.mosdepth.region.dist.txt:md5,ccf646922b05cb4759c4f89072be2b69", "testT.recal.mosdepth.summary.txt:md5,024649a659caff330dfbef4ac3560542", "testT.recal.regions.bed.gz:md5,14b36a2cf428840aab471f95cfbe399f", - "testT.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "testT.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testN.freebayes.filtered.FILTER.summary:md5,e2f8e86fb18631c0bf6ccd7d9d4039c8", "testN.freebayes.filtered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc", "testT.freebayes.filtered.FILTER.summary:md5,4b25443c427fd27761017e4f3a556b29", @@ -330,11 +331,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:22:40.767625875", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-03T10:48:21.505593" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --normalize_vcfs --concatenate_vcfs --tools freebayes,strelka": { "content": [ @@ -365,10 +366,11 @@ "bcftools": "1.23.1" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -601,7 +603,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,f0177ed551b6ec930854d0d221904ec0", "mosdepth_perchrom.txt:md5,9cfd38310d4da59c7242b2a7ae6bd651", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", + "samtools-stats-dp.txt:md5,1f1da592b5ef6dc0339d4d0b7b9aa03c", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", @@ -612,12 +614,12 @@ "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "testN.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "testN.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "testN.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testT.recal.mosdepth.global.dist.txt:md5,3106c114529adc4231badeb3bb38b6d1", "testT.recal.mosdepth.region.dist.txt:md5,ccf646922b05cb4759c4f89072be2b69", "testT.recal.mosdepth.summary.txt:md5,024649a659caff330dfbef4ac3560542", "testT.recal.regions.bed.gz:md5,14b36a2cf428840aab471f95cfbe399f", - "testT.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "testT.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testN.freebayes.filtered.FILTER.summary:md5,e2f8e86fb18631c0bf6ccd7d9d4039c8", "testN.freebayes.filtered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc", "testT.freebayes.filtered.FILTER.summary:md5,4b25443c427fd27761017e4f3a556b29", @@ -653,10 +655,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:25:23.340652566", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-03T10:44:17.917186" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/postprocess_consensus.nf.test.snap b/tests/postprocess_consensus.nf.test.snap index 4273d70f6d..dc5a270f5d 100644 --- a/tests/postprocess_consensus.nf.test.snap +++ b/tests/postprocess_consensus.nf.test.snap @@ -35,13 +35,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2_PAIRED": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -307,7 +308,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cb7468f51b8be1230fb3ac5b130be31f", "mosdepth_perchrom.txt:md5,4ee05f71086179b42a01cd2fb450346f", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.bcftools.bcftools_stats.txt:md5,bb4018e2ec62ab957867c4f55ce626b8", @@ -319,16 +320,16 @@ "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample3.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample4.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample4.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample3.bcftools.FILTER.summary:md5,9b62595b026decf12e9198d531e4307a", "sample3.bcftools.TsTv.count:md5,6c937125d7bac4c491bea50f18cba43a", "sample4_vs_sample3.mutect2.FILTER.summary:md5,cac64448be577632a614af62a23af34a", @@ -371,11 +372,11 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:23:15.482817797", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.3" - }, - "timestamp": "2026-02-06T14:58:25.361891009" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --snv_consensus_calling --normalize_vcfs --tools lofreq,mpileup,mutect2 (tumor-only)": { "content": [ @@ -410,13 +411,14 @@ "lofreq": "2.1.5" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -622,7 +624,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,1036ea76acae803f591fd99838a8eded", "mosdepth_perchrom.txt:md5,1f24f2f40467234c410a8bda544a8aae", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.bcftools.bcftools_stats.txt:md5,47ce340432efdbb38a86d8b7c3d0c2d4", @@ -632,9 +634,9 @@ "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample2.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample2.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample2.bcftools.FILTER.summary:md5,8766995f3e4119ef30dfdaa9fb3752ce", "sample2.bcftools.TsTv.count:md5,01df95fcb4df593f7e1b214d90ebdb59", "sample2.lofreq.FILTER.summary:md5,8dd8a0c91d5c4a260b462e04f615e502", @@ -688,11 +690,11 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:22:11.362506122", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.3" - }, - "timestamp": "2026-02-06T15:02:50.699837449" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --snv_consensus_calling --normalize_vcfs --tools mpileup,mutect2,strelka (germline + somatic)": { "content": [ @@ -739,13 +741,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2_PAIRED": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -1007,7 +1010,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cb7468f51b8be1230fb3ac5b130be31f", "mosdepth_perchrom.txt:md5,4ee05f71086179b42a01cd2fb450346f", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.bcftools.bcftools_stats.txt:md5,bb4018e2ec62ab957867c4f55ce626b8", @@ -1019,16 +1022,16 @@ "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample3.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample4.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample4.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample3.bcftools.FILTER.summary:md5,9b62595b026decf12e9198d531e4307a", "sample3.bcftools.TsTv.count:md5,6c937125d7bac4c491bea50f18cba43a", "sample4_vs_sample3.mutect2.filtered.FILTER.summary:md5,b25d4d2a64f9590d0ffb119fd3adb06e", @@ -1119,10 +1122,10 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:27:08.769937074", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.3" - }, - "timestamp": "2026-02-06T14:53:33.998324217" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/postprocess_filtering.nf.test.snap b/tests/postprocess_filtering.nf.test.snap index b985b4bbda..31b423c532 100644 --- a/tests/postprocess_filtering.nf.test.snap +++ b/tests/postprocess_filtering.nf.test.snap @@ -22,10 +22,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -241,7 +242,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,f0177ed551b6ec930854d0d221904ec0", "mosdepth_perchrom.txt:md5,9cfd38310d4da59c7242b2a7ae6bd651", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", + "samtools-stats-dp.txt:md5,1f1da592b5ef6dc0339d4d0b7b9aa03c", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", @@ -252,12 +253,12 @@ "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "testN.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "testN.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "testN.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testT.recal.mosdepth.global.dist.txt:md5,3106c114529adc4231badeb3bb38b6d1", "testT.recal.mosdepth.region.dist.txt:md5,ccf646922b05cb4759c4f89072be2b69", "testT.recal.mosdepth.summary.txt:md5,024649a659caff330dfbef4ac3560542", "testT.recal.regions.bed.gz:md5,14b36a2cf428840aab471f95cfbe399f", - "testT.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "testT.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testN.freebayes.filtered.FILTER.summary:md5,e2f8e86fb18631c0bf6ccd7d9d4039c8", "testN.freebayes.filtered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc", "testT.freebayes.filtered.FILTER.summary:md5,4b25443c427fd27761017e4f3a556b29", @@ -291,10 +292,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:19:51.840489661", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-03T11:32:58.31191" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/postprocess_normalization.nf.test.snap b/tests/postprocess_normalization.nf.test.snap index 6465eb8a6e..42f044a65a 100644 --- a/tests/postprocess_normalization.nf.test.snap +++ b/tests/postprocess_normalization.nf.test.snap @@ -22,10 +22,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -251,7 +252,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,f0177ed551b6ec930854d0d221904ec0", "mosdepth_perchrom.txt:md5,9cfd38310d4da59c7242b2a7ae6bd651", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,a0c101497a0566f60b9e8388207944ab", + "samtools-stats-dp.txt:md5,1f1da592b5ef6dc0339d4d0b7b9aa03c", "samtools_alignment_plot.txt:md5,563784066de81f3bc8ccf5fbbe82b3d5", "samtools_insert_size.txt:md5,f3dd80e14876d827eb924c6cc888c782", "testN.freebayes.filtered.bcftools_stats.txt:md5,2429f8a81b14bcc4ac07fccd75c2f837", @@ -262,12 +263,12 @@ "testN.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "testN.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "testN.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "testN.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "testN.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testT.recal.mosdepth.global.dist.txt:md5,3106c114529adc4231badeb3bb38b6d1", "testT.recal.mosdepth.region.dist.txt:md5,ccf646922b05cb4759c4f89072be2b69", "testT.recal.mosdepth.summary.txt:md5,024649a659caff330dfbef4ac3560542", "testT.recal.regions.bed.gz:md5,14b36a2cf428840aab471f95cfbe399f", - "testT.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "testT.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "testN.freebayes.filtered.FILTER.summary:md5,e2f8e86fb18631c0bf6ccd7d9d4039c8", "testN.freebayes.filtered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc", "testT.freebayes.filtered.FILTER.summary:md5,4b25443c427fd27761017e4f3a556b29", @@ -303,10 +304,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:18:59.909328969", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-03T11:48:18.652411" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/postprocess_varlociraptor.nf.test.snap b/tests/postprocess_varlociraptor.nf.test.snap index 30076c3c58..1d9259b618 100644 --- a/tests/postprocess_varlociraptor.nf.test.snap +++ b/tests/postprocess_varlociraptor.nf.test.snap @@ -43,7 +43,8 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "PREPROCESS_NORMAL": { "varlociraptor": "8.9.5" @@ -55,7 +56,7 @@ "rbt": "0.42.2" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SORT_CALLED_CHUNKS": { "bcftools": "1.23.1" @@ -277,7 +278,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cb7468f51b8be1230fb3ac5b130be31f", "mosdepth_perchrom.txt:md5,4ee05f71086179b42a01cd2fb450346f", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.strelka.variants.bcftools_stats.txt:md5,2c40e667f6ee75761fe6c3b33dda0679", @@ -287,16 +288,16 @@ "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample3.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample4.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample4.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample3.strelka.variants.FILTER.summary:md5,2048a5de0201a6052c988a0189979a5f", "sample3.strelka.variants.TsTv.count:md5,c5b7a8eda2526d899098439ae4c06a49", "sample4_vs_sample3.strelka.somatic_indels.FILTER.summary:md5,3441628cd6550ed459ca1c3db989ceea", @@ -322,11 +323,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:34:10.078345824", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T14:56:17.705455093" + } }, "-profile test --tools mutect2,varlociraptor --input recalibrated_tumoronly.csv": { "content": [ @@ -369,7 +370,8 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2": { "gatk4": "4.6.2.0" @@ -378,7 +380,7 @@ "rbt": "0.42.2" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SORT_CALLED_CHUNKS": { "bcftools": "1.23.1" @@ -557,7 +559,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,1036ea76acae803f591fd99838a8eded", "mosdepth_perchrom.txt:md5,1f24f2f40467234c410a8bda544a8aae", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.mutect2.filtered.bcftools_stats.txt:md5,30c32a41d08f8ae7227521beae37dc62", @@ -565,9 +567,9 @@ "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample2.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample2.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample2.mutect2.filtered.FILTER.summary:md5,276c858391322083833a42e04fe3554d", "sample2.mutect2.filtered.TsTv.count:md5,fe3ff1f0c2ead72f037552727438e00a", "sample2.mutect2.contamination.table:md5,46c708c943b453da89a3da08acfdb2a7", @@ -588,11 +590,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:38:20.44515837", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T15:01:23.802458652" + } }, "-profile test --tools strelka,varlociraptor --input recalibrated_germline.csv": { "content": [ @@ -620,13 +622,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "RBT_VCFSPLIT": { "rbt": "0.42.2" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SORT_CALLED_CHUNKS": { "bcftools": "1.23.1" @@ -804,7 +807,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,b7016944a8325bef2c0ed542246acfa9", "mosdepth_perchrom.txt:md5,04d9eccc248633a38fb253bc70fb8d62", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.strelka.variants.bcftools_stats.txt:md5,bcb50cfcfefdce0d203aff1d054d9f24", @@ -812,9 +815,9 @@ "sample1.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample1.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample1.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample1.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample1.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample1.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample1.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample1.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample1.strelka.variants.FILTER.summary:md5,2048a5de0201a6052c988a0189979a5f", "sample1.strelka.variants.TsTv.count:md5,c5b7a8eda2526d899098439ae4c06a49", "sample1.scenario.varlociraptor.yaml:md5,bdc995369d2dede79535e551530c0cf6" @@ -830,10 +833,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:23:35.977627481", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T14:45:50.699233572" + } } } \ No newline at end of file diff --git a/tests/qc_ngscheckmate.nf.test.snap b/tests/qc_ngscheckmate.nf.test.snap index bba16b79b9..44d732ff4b 100644 --- a/tests/qc_ngscheckmate.nf.test.snap +++ b/tests/qc_ngscheckmate.nf.test.snap @@ -16,7 +16,7 @@ "ngscheckmate": "1.0.1" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -133,13 +133,14 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "NGSCHECKMATE_NCM": { "ngscheckmate": "1.0.1" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -252,29 +253,29 @@ "mosdepth-cumcoverage-dist-id.txt:md5,ad0637d55d7025330f2f6cb7f9680e64", "mosdepth_perchrom.txt:md5,73ef9a077df1887f9021a581fbf207bc", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,b446a47b182d93a9e7e74f5f7c8d41c2", + "samtools-stats-dp.txt:md5,a6501ad36c9d1e9b97878e69f072d63c", "samtools_alignment_plot.txt:md5,7138a2d29f515993e1df8d745e27b757", "samtools_insert_size.txt:md5,e0c5f4ebb18a0e6bd437f0b919725b39", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "ngscheckmate_all.txt:md5,f858e3eb892b8245cbf74cc979e4f33a", "ngscheckmate_matched.txt:md5,ab2c5b46e9a4dfb3bb54292db931b58b", "ngscheckmate_output_corr_matrix.txt:md5,a86afff85677c875503d495cbbb4f495" @@ -289,10 +290,10 @@ ], "No warnings" ], - "timestamp": "2025-09-30T21:27:36.837652254", + "timestamp": "2026-07-27T10:33:27.14434232", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/save_mapped.nf.test.snap b/tests/save_mapped.nf.test.snap index 36e862f55e..8467fabb4a 100644 --- a/tests/save_mapped.nf.test.snap +++ b/tests/save_mapped.nf.test.snap @@ -4,7 +4,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -20,10 +20,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/save_output_as_bam.nf.test.snap b/tests/save_output_as_bam.nf.test.snap index 52c8d0fe9d..491d13b64b 100644 --- a/tests/save_output_as_bam.nf.test.snap +++ b/tests/save_output_as_bam.nf.test.snap @@ -51,13 +51,14 @@ "samtools": "1.21" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -330,7 +331,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", + "samtools-stats-dp.txt:md5,92dc10e61df31bf4286b16582bed488f", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", @@ -338,12 +339,12 @@ "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.md.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.md.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.md.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.recal.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.recal.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.recal.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.recal.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.recal.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.recal.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.strelka.variants.FILTER.summary:md5,dd87f507da7de20d5318841af312493b", "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "genome.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", @@ -372,11 +373,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:27:46.994496963", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-03-13T09:13:12.307067" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --save_output_as_bam skip QC/recal/md": { "content": [ @@ -396,10 +397,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/sentieon.nf.test.snap b/tests/sentieon.nf.test.snap index 5387d5cdb8..a14708ec3f 100644 --- a/tests/sentieon.nf.test.snap +++ b/tests/sentieon.nf.test.snap @@ -26,13 +26,13 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { "mosdepth": "0.3.10" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_BWAMEM": { "bwa": "0.7.17-r1188", diff --git a/tests/sentieon_aligner_bwamem.nf.test.snap b/tests/sentieon_aligner_bwamem.nf.test.snap index 48c7ef8233..516178e64a 100644 --- a/tests/sentieon_aligner_bwamem.nf.test.snap +++ b/tests/sentieon_aligner_bwamem.nf.test.snap @@ -4,7 +4,7 @@ 10, { "BAM_TO_CRAM_MAPPING": { - "samtools": 1.21 + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -16,10 +16,10 @@ "gatk4": "4.6.2.0" }, "INDEX_MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_BWAMEM": { "bwa": "0.7.17-r1188", diff --git a/tests/sentieon_dedup.nf.test.snap b/tests/sentieon_dedup.nf.test.snap index b2424d75a7..4c73072939 100644 --- a/tests/sentieon_dedup.nf.test.snap +++ b/tests/sentieon_dedup.nf.test.snap @@ -16,13 +16,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DEDUP": { "sentieon": "202503.02" @@ -163,19 +164,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,b20f475e03ef81a68b3dec99b7e6aae4", + "samtools-stats-dp.txt:md5,e1ea864eb9632fcb7bc548122bff5aac", "samtools_alignment_plot.txt:md5,b693942009526869bd21cbc42d54f53c", "samtools_insert_size.txt:md5,7e95fe3ffb2346827b9e63da4de60842", "test.dedup.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.dedup.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.dedup.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.dedup.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.dedup.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "test.dedup.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.recal.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.recal.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.recal.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.recal.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917" + "test.recal.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c" ], "No BAM files", [ @@ -185,11 +186,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T11:35:39.37304294", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T10:54:13.719485962" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_dedup --step markduplicates --input tests/csv/3.0/mapped_single_cram.csv --sentieon_consensus": { "content": [ @@ -208,13 +209,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DEDUP": { "sentieon": "202503.02" @@ -355,19 +357,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,b7a972304062dab47bf1ef592defa909", + "samtools-stats-dp.txt:md5,6d7ae257a6d8786b2d3ae875d57c2c66", "samtools_alignment_plot.txt:md5,5c19e1b5d6980e773e9a182557ae20f8", "samtools_insert_size.txt:md5,223fb9c7f62b54ffe8a820b09c21b89d", "test.dedup.mosdepth.global.dist.txt:md5,cc38f46822141ac16b5025ac5d62d044", "test.dedup.mosdepth.region.dist.txt:md5,86b78626070a52dbe36d952b85814921", "test.dedup.mosdepth.summary.txt:md5,3cf3700ecd4ec08825ab33e8bcbc3206", "test.dedup.regions.bed.gz:md5,ba570a03993dbc155da2e5bf8e42f62e", - "test.dedup.regions.bed.gz.csi:md5,10b7f8e9ac2ac27205f8bc827a186195", + "test.dedup.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.recal.mosdepth.global.dist.txt:md5,cc38f46822141ac16b5025ac5d62d044", "test.recal.mosdepth.region.dist.txt:md5,86b78626070a52dbe36d952b85814921", "test.recal.mosdepth.summary.txt:md5,3cf3700ecd4ec08825ab33e8bcbc3206", "test.recal.regions.bed.gz:md5,ba570a03993dbc155da2e5bf8e42f62e", - "test.recal.regions.bed.gz.csi:md5,10b7f8e9ac2ac27205f8bc827a186195" + "test.recal.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c" ], "No BAM files", [ @@ -377,11 +379,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T11:37:42.701914376", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-08-15T09:38:15.648926052" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_dedup --step markduplicates --input tests/csv/3.0/mapped_single_cram.csv": { "content": [ @@ -400,13 +402,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DEDUP": { "sentieon": "202503.02" @@ -547,19 +550,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,b20f475e03ef81a68b3dec99b7e6aae4", + "samtools-stats-dp.txt:md5,e1ea864eb9632fcb7bc548122bff5aac", "samtools_alignment_plot.txt:md5,b693942009526869bd21cbc42d54f53c", "samtools_insert_size.txt:md5,7e95fe3ffb2346827b9e63da4de60842", "test.dedup.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.dedup.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.dedup.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.dedup.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.dedup.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "test.dedup.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.recal.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.recal.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.recal.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.recal.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917" + "test.recal.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c" ], "No BAM files", [ @@ -569,11 +572,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T11:34:59.34095366", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T11:05:41.448189865" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_dedup --step markduplicates --input tests/csv/3.0/bam_umi_header.csv --sentieon_consensus --umi_in_read_header": { "content": [ @@ -595,13 +598,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DEDUP": { "sentieon": "202503.02" @@ -742,19 +746,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,36c50f0e76e2cdb1476248b8bffa60f3", + "samtools-stats-dp.txt:md5,a0fd3c6744845e917395774d709b1e1d", "samtools_alignment_plot.txt:md5,511a3eba2589bb6790a4cfcd2a9c0d6c", "samtools_insert_size.txt:md5,28a3cafdf305cd8c610017d1da8af854", "test.dedup.mosdepth.global.dist.txt:md5,822c1f9c009f5436fefcfc9f5f7e6ee7", "test.dedup.mosdepth.region.dist.txt:md5,1395b75e88a291268b96ec38f63c033e", "test.dedup.mosdepth.summary.txt:md5,17f1b050f76ba0bfc96cbd045b627cd4", "test.dedup.regions.bed.gz:md5,175dba70847fa0f2e5a44a014fa91027", - "test.dedup.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.dedup.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0", "test.recal.mosdepth.global.dist.txt:md5,822c1f9c009f5436fefcfc9f5f7e6ee7", "test.recal.mosdepth.region.dist.txt:md5,1395b75e88a291268b96ec38f63c033e", "test.recal.mosdepth.summary.txt:md5,17f1b050f76ba0bfc96cbd045b627cd4", "test.recal.regions.bed.gz:md5,175dba70847fa0f2e5a44a014fa91027", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259" + "test.recal.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0" ], "No BAM files", [ @@ -764,11 +768,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T11:36:17.840418937", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-08-15T10:02:22.395300103" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_dedup --step markduplicates --input tests/csv/3.0/bam_umi_header.csv --umi_in_read_header": { "content": [ @@ -790,13 +794,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DEDUP": { "sentieon": "202503.02" @@ -937,19 +942,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,a416a2f4042ce91471192ee33bab23ad", + "samtools-stats-dp.txt:md5,005cfcc30b93dc9be53956fcdf502bc2", "samtools_alignment_plot.txt:md5,cf28e9513f09390047f12f904114a50c", "samtools_insert_size.txt:md5,4212a4d5afe29c9a16599ab14b6c7cd9", "test.dedup.mosdepth.global.dist.txt:md5,71d52337c3c971849645655e3203f9e0", "test.dedup.mosdepth.region.dist.txt:md5,d985616d0cb8d74ff6448601d9a03318", "test.dedup.mosdepth.summary.txt:md5,c01b82249d58f2f2c0d7473c588ffaf4", "test.dedup.regions.bed.gz:md5,b49899dadd40a3b54b0c43033d740aa8", - "test.dedup.regions.bed.gz.csi:md5,5c556fe6462be13681267bb28257b654", + "test.dedup.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.recal.mosdepth.global.dist.txt:md5,71d52337c3c971849645655e3203f9e0", "test.recal.mosdepth.region.dist.txt:md5,d985616d0cb8d74ff6448601d9a03318", "test.recal.mosdepth.summary.txt:md5,c01b82249d58f2f2c0d7473c588ffaf4", "test.recal.regions.bed.gz:md5,b49899dadd40a3b54b0c43033d740aa8", - "test.recal.regions.bed.gz.csi:md5,5c556fe6462be13681267bb28257b654" + "test.recal.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c" ], "No BAM files", [ @@ -959,10 +964,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T11:35:19.642136626", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-08-15T09:50:20.120218465" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/spark.nf.test.snap b/tests/spark.nf.test.snap index 294289be2b..3c1cb4afba 100644 --- a/tests/spark.nf.test.snap +++ b/tests/spark.nf.test.snap @@ -32,16 +32,17 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "INDEX_MARKDUPLICATES": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -218,19 +219,19 @@ "mosdepth_perchrom.txt:md5,3a7533e81978d33159d27b18cd337565", "multiqc_citations.txt:md5,7d0b4b866fa577272c48a1f3ad72e75d", "multiqc_fastqc.txt:md5,d54614f8b2de16511949dbbde8f38a5d", - "samtools-stats-dp.txt:md5,440993b962f6c557cccfa2974648e1ec", + "samtools-stats-dp.txt:md5,6e3695fb7582152c9de1b527e3578d25", "samtools_alignment_plot.txt:md5,46e8824724863d243a01cc239a5eff15", "samtools_insert_size.txt:md5,17c44517c58803f9c078f6d9b55aed00", "test2.md.mosdepth.global.dist.txt:md5,85d38a74ce189b9110c57cd94bc26757", "test2.md.mosdepth.region.dist.txt:md5,286d57b7d9b3a95ef18ab2eb7f913d81", "test2.md.mosdepth.summary.txt:md5,04b69ef7f00199dcea7822a79d2c7bd7", "test2.md.regions.bed.gz:md5,292e177aa997597f83dc4e84bcc36b4c", - "test2.md.regions.bed.gz.csi:md5,5bf5fc178e4faf2462427502c3666004", + "test2.md.regions.bed.gz.csi:md5,2377c1d5f323117f03d96b4e83cd25cd", "test2.recal.mosdepth.global.dist.txt:md5,85d38a74ce189b9110c57cd94bc26757", "test2.recal.mosdepth.region.dist.txt:md5,286d57b7d9b3a95ef18ab2eb7f913d81", "test2.recal.mosdepth.summary.txt:md5,04b69ef7f00199dcea7822a79d2c7bd7", "test2.recal.regions.bed.gz:md5,292e177aa997597f83dc4e84bcc36b4c", - "test2.recal.regions.bed.gz.csi:md5,5bf5fc178e4faf2462427502c3666004" + "test2.recal.regions.bed.gz.csi:md5,2377c1d5f323117f03d96b4e83cd25cd" ], "No BAM files", [ @@ -242,11 +243,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998513#1/1" ] ], + "timestamp": "2026-07-27T10:24:08.645314579", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T21:32:22.98324443" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test,spark --input tests/csv/3.0/fastq_tumor_only.csv --use_gatk_spark baserecalibrator,markduplicates --skip_tools fastqc,markduplicates_report,mosdepth,multiqc,samtools": { "content": [ @@ -275,10 +276,10 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "INDEX_MARKDUPLICATES": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/start_from_markduplicates.nf.test.snap b/tests/start_from_markduplicates.nf.test.snap index dc2ee68e11..6147c20e10 100644 --- a/tests/start_from_markduplicates.nf.test.snap +++ b/tests/start_from_markduplicates.nf.test.snap @@ -20,13 +20,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -158,19 +159,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,d75ab155c53a8469919bee1c9808eb4b", + "samtools-stats-dp.txt:md5,8e1141a013873b3e9dfc7718fb8c7b23", "samtools_alignment_plot.txt:md5,7a727168e9bbb3f4c39894933438df98", "samtools_insert_size.txt:md5,c00ec0f338c40f2f1bc129f46ffb9084", "test.md.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.md.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.md.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.md.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.md.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "test.md.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.recal.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.recal.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.recal.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.recal.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917" + "test.recal.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c" ], "No BAM files", [ @@ -180,11 +181,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:26:01.849929162", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:45:52.52962218" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_cram.csv --step markduplicates --tools null": { "content": [ @@ -207,13 +208,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -345,19 +347,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,d75ab155c53a8469919bee1c9808eb4b", + "samtools-stats-dp.txt:md5,8e1141a013873b3e9dfc7718fb8c7b23", "samtools_alignment_plot.txt:md5,7a727168e9bbb3f4c39894933438df98", "samtools_insert_size.txt:md5,c00ec0f338c40f2f1bc129f46ffb9084", "test.md.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.md.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.md.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.md.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.md.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "test.md.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.recal.mosdepth.global.dist.txt:md5,8e875e20e3fb9cf288d68c1d223f6fd5", "test.recal.mosdepth.region.dist.txt:md5,75e1ce7e55af51f4985fa91654a5ea2d", "test.recal.mosdepth.summary.txt:md5,b23cf96942b2ada3f41172a9349a1175", "test.recal.regions.bed.gz:md5,74cd0c779c7b3228adcf3b177333886a", - "test.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917" + "test.recal.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c" ], "No BAM files", [ @@ -367,11 +369,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:40:21.440602423", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:48:22.238914133" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_cram.csv --step markduplicates --skip_tools markduplicates --tools null": { "content": [ @@ -390,13 +392,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -503,19 +506,19 @@ "mosdepth-cumcoverage-dist-id.txt:md5,fcecb7f7ed584a1395065568e0ec1259", "mosdepth_perchrom.txt:md5,4153678ed78ce01defe11f5b9fb8deb4", "multiqc_citations.txt:md5,7d0b4b866fa577272c48a1f3ad72e75d", - "samtools-stats-dp.txt:md5,dae2fa55a81049479a787e0fe5a64289", + "samtools-stats-dp.txt:md5,9dc8fae2db9d6106f819024bc3d8bad5", "samtools_alignment_plot.txt:md5,b693942009526869bd21cbc42d54f53c", "samtools_insert_size.txt:md5,7e95fe3ffb2346827b9e63da4de60842", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.sorted.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.sorted.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.sorted.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.sorted.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.sorted.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259" + "test.sorted.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d" ], "No BAM files", [ @@ -524,11 +527,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:35:07.795402388", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:47:02.418026538" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_bam.csv --step markduplicates --skip_tools markduplicates --tools null": { "content": [ @@ -547,13 +550,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -660,19 +664,19 @@ "mosdepth-cumcoverage-dist-id.txt:md5,fcecb7f7ed584a1395065568e0ec1259", "mosdepth_perchrom.txt:md5,4153678ed78ce01defe11f5b9fb8deb4", "multiqc_citations.txt:md5,7d0b4b866fa577272c48a1f3ad72e75d", - "samtools-stats-dp.txt:md5,dae2fa55a81049479a787e0fe5a64289", + "samtools-stats-dp.txt:md5,9dc8fae2db9d6106f819024bc3d8bad5", "samtools_alignment_plot.txt:md5,b693942009526869bd21cbc42d54f53c", "samtools_insert_size.txt:md5,7e95fe3ffb2346827b9e63da4de60842", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.sorted.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.sorted.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.sorted.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.sorted.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.sorted.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259" + "test.sorted.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d" ], "No BAM files", [ @@ -681,10 +685,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:19:53.572042834", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:44:33.781719225" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/start_from_preparerecalibration.nf.test.snap b/tests/start_from_preparerecalibration.nf.test.snap index cb9de0448b..e6c65e20ee 100644 --- a/tests/start_from_preparerecalibration.nf.test.snap +++ b/tests/start_from_preparerecalibration.nf.test.snap @@ -16,13 +16,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -124,14 +125,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,7d0b4b866fa577272c48a1f3ad72e75d", - "samtools-stats-dp.txt:md5,c8deaa643c44fd800cbf14ac35fb7719", + "samtools-stats-dp.txt:md5,a30d6f7def3b7145015804ec4a4c3ee4", "samtools_alignment_plot.txt:md5,8908b56b3040f2c53b15591adf93a266", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259" + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d" ], "No BAM files", [ @@ -140,11 +141,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:34:22.669878207", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:49:34.278947907" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_cram.csv --step prepare_recalibration --skip_tools baserecalibrator --tools strelka": { "content": [ @@ -431,13 +432,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -539,14 +541,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,7d0b4b866fa577272c48a1f3ad72e75d", - "samtools-stats-dp.txt:md5,c8deaa643c44fd800cbf14ac35fb7719", + "samtools-stats-dp.txt:md5,a30d6f7def3b7145015804ec4a4c3ee4", "samtools_alignment_plot.txt:md5,8908b56b3040f2c53b15591adf93a266", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259" + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d" ], "No BAM files", [ @@ -555,10 +557,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:27:50.357982281", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:52:41.43434759" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/start_from_recalibration.nf.test.snap b/tests/start_from_recalibration.nf.test.snap index b5143c63bc..3c4d4773b6 100644 --- a/tests/start_from_recalibration.nf.test.snap +++ b/tests/start_from_recalibration.nf.test.snap @@ -13,13 +13,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -104,14 +105,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,c8deaa643c44fd800cbf14ac35fb7719", + "samtools-stats-dp.txt:md5,a30d6f7def3b7145015804ec4a4c3ee4", "samtools_alignment_plot.txt:md5,8908b56b3040f2c53b15591adf93a266", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259" + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d" ], "No BAM files", [ @@ -120,11 +121,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:28:54.131141033", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:56:40.285535719" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_cram.csv --step recalibrate --skip_tools baserecalibrator --tools strelka": { "content": [ @@ -408,13 +409,14 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -499,14 +501,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,c8deaa643c44fd800cbf14ac35fb7719", + "samtools-stats-dp.txt:md5,a30d6f7def3b7145015804ec4a4c3ee4", "samtools_alignment_plot.txt:md5,8908b56b3040f2c53b15591adf93a266", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.recal.mosdepth.global.dist.txt:md5,bdb8f185c35dd1eec7ce2f69bce57972", "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259" + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d" ], "No BAM files", [ @@ -515,10 +517,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:27:44.513392658", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:53:40.326206561" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/tumor-normal-pair.nf.test.snap b/tests/tumor-normal-pair.nf.test.snap index 2e35492574..6c664c0a80 100644 --- a/tests/tumor-normal-pair.nf.test.snap +++ b/tests/tumor-normal-pair.nf.test.snap @@ -33,13 +33,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -338,7 +339,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,13dab249f7bef935dfef234299550db8", + "samtools-stats-dp.txt:md5,8b8f48d0b1d134cfe3636e8577265751", "samtools_alignment_plot.txt:md5,44149e0c5cc4bfa58242824b300219a2", "samtools_insert_size.txt:md5,c4b5c78eeb30a8c926d1bd9506882516", "test.strelka.variants.bcftools_stats.txt:md5,6efa6598982c21c544d1833dca632b62", @@ -348,22 +349,22 @@ "test.md.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.md.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test.md.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test.md.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test.md.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test.recal.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test.recal.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.recal.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test.recal.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test.recal.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test.recal.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test2.md.mosdepth.global.dist.txt:md5,2020cf6dfc7ddca020c921dd9f0549b7", "test2.md.mosdepth.region.dist.txt:md5,38ff8b38c33b9231f047fea8ea830aae", "test2.md.mosdepth.summary.txt:md5,8b991358768cade225470a07cd34f573", "test2.md.regions.bed.gz:md5,08e767f91a0a8d82733f0040e804a85f", - "test2.md.regions.bed.gz.csi:md5,d5f1c9389ecf52ba839e834780a94549", + "test2.md.regions.bed.gz.csi:md5,7357b11c67d045f7383a19845688e072", "test2.recal.mosdepth.global.dist.txt:md5,2020cf6dfc7ddca020c921dd9f0549b7", "test2.recal.mosdepth.region.dist.txt:md5,38ff8b38c33b9231f047fea8ea830aae", "test2.recal.mosdepth.summary.txt:md5,8b991358768cade225470a07cd34f573", "test2.recal.regions.bed.gz:md5,08e767f91a0a8d82733f0040e804a85f", - "test2.recal.regions.bed.gz.csi:md5,d5f1c9389ecf52ba839e834780a94549", + "test2.recal.regions.bed.gz.csi:md5,7357b11c67d045f7383a19845688e072", "test.strelka.variants.FILTER.summary:md5,dd87f507da7de20d5318841af312493b", "test.strelka.variants.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "test2_vs_test.strelka.somatic_indels.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", @@ -389,10 +390,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-05-19T18:39:56.416042618", + "timestamp": "2026-07-27T10:29:54.04260346", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/umi_fastp.nf.test.snap b/tests/umi_fastp.nf.test.snap index ce8a858825..e15a93581a 100644 --- a/tests/umi_fastp.nf.test.snap +++ b/tests/umi_fastp.nf.test.snap @@ -36,13 +36,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -324,7 +325,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,a6f11f838a72299e4913a54dd327f2e6", + "samtools-stats-dp.txt:md5,ab87568a8666df372d377d2dce411da3", "samtools_alignment_plot.txt:md5,111d8b457e8c34dc919a527f12f27d4a", "samtools_insert_size.txt:md5,5dbef29f8a260b9aa05de422676ab81a", "test-test_L1.fastp.json:md5,5146ada16c3aae0e55e3e993b9d587af", @@ -332,12 +333,12 @@ "test.md.mosdepth.region.dist.txt:md5,94b080042f51f484fa178339cc9324bc", "test.md.mosdepth.summary.txt:md5,7958c5422bb4b5181afe9782e38a735a", "test.md.regions.bed.gz:md5,fe11b3aedde07e4e17114b5b37cdb3b8", - "test.md.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917", + "test.md.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0", "test.recal.mosdepth.global.dist.txt:md5,40bf266b2080717f92b405cb42fab4a7", "test.recal.mosdepth.region.dist.txt:md5,94b080042f51f484fa178339cc9324bc", "test.recal.mosdepth.summary.txt:md5,7958c5422bb4b5181afe9782e38a735a", "test.recal.regions.bed.gz:md5,fe11b3aedde07e4e17114b5b37cdb3b8", - "test.recal.regions.bed.gz.csi:md5,0dc011f3344841dc14aa488da905e917" + "test.recal.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0" ], "No BAM files", [ @@ -349,10 +350,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_umi_cleanname_1.fastq.gz): Cannot extract flowcell ID from @922332" ] ], + "timestamp": "2026-07-27T10:26:43.611284662", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T21:51:24.395033366" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/umi_fgbio.nf.test.snap b/tests/umi_fgbio.nf.test.snap index da94f581b4..62a63cbb95 100644 --- a/tests/umi_fgbio.nf.test.snap +++ b/tests/umi_fgbio.nf.test.snap @@ -24,7 +24,8 @@ 29, { "BAM2FASTQ": { - "samtools": 1.21 + "bgzip": "1.24", + "samtools": "1.24" }, "BWAMEM1_INDEX": { "bwa": "0.7.19-r1273" @@ -40,10 +41,10 @@ "cat": "9.5" }, "COLLATE_FASTQ_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "COLLATE_FASTQ_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -71,28 +72,29 @@ "fgbio": "3.1.2" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_MERGE_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -300,19 +302,19 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,49a0910af4cea91b46a1df076c08c5b5", + "samtools-stats-dp.txt:md5,7575ba501ebbd93ba39f171443c0791b", "samtools_alignment_plot.txt:md5,60b8f1d48124a8f28b06dc0d15ca4d59", "samtools_insert_size.txt:md5,ef2a81138667814cda3e5c8c2628c549", "test.md.mosdepth.global.dist.txt:md5,bb51e76c9cf2f3929cb5ce560f559dd6", "test.md.mosdepth.region.dist.txt:md5,11dc4683f9038de1938b4874e02974d6", "test.md.mosdepth.summary.txt:md5,d6cda5af0f2bf21973e256cf198aa47a", "test.md.regions.bed.gz:md5,b420210d41279bbc93f211491f7d4f02", - "test.md.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.md.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.recal.mosdepth.global.dist.txt:md5,bb51e76c9cf2f3929cb5ce560f559dd6", "test.recal.mosdepth.region.dist.txt:md5,11dc4683f9038de1938b4874e02974d6", "test.recal.mosdepth.summary.txt:md5,d6cda5af0f2bf21973e256cf198aa47a", "test.recal.regions.bed.gz:md5,b420210d41279bbc93f211491f7d4f02", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test_umi-grouped_histogram.txt:md5,85292e9acb83edf17110dce17be27f44", "test_umi-grouped_read-metrics.txt:md5,cb2aecfe82357aa06e091d69b4606b9e" ], @@ -328,11 +330,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_umi_cleanname_1.fastq.gz): Cannot extract flowcell ID from @922332" ] ], + "timestamp": "2026-07-27T10:25:14.330200197", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T21:53:07.910593016" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/fastq_umi.csv --umi_read_structure '+T 7M1S+T' --tools null --aligner sentieon-bwamem": { "content": [ diff --git a/tests/umi_in_read_names.nf.test.snap b/tests/umi_in_read_names.nf.test.snap index 29202ec5b1..3b94ff9558 100644 --- a/tests/umi_in_read_names.nf.test.snap +++ b/tests/umi_in_read_names.nf.test.snap @@ -26,13 +26,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -233,7 +234,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,175b0442368f03294ef9ce9e73172c7b", + "samtools-stats-dp.txt:md5,e65c4559a631a2f575dfa4549b47c324", "samtools_alignment_plot.txt:md5,6555bbf8c1ef12058e9a050545a9fa41", "samtools_insert_size.txt:md5,164be68813f2cb96462c152743b95cae", "test.strelka.variants.bcftools_stats.txt:md5,f4f3355bc1f101411c2fed6cf77d478e", @@ -241,12 +242,12 @@ "test.md.mosdepth.region.dist.txt:md5,54273a37adf55f8cee822aaf92a4c321", "test.md.mosdepth.summary.txt:md5,bb12489d3d44c4e44eb5dcc8fdef636c", "test.md.regions.bed.gz:md5,24cd07f8ce342a277f2954d6e731015e", - "test.md.regions.bed.gz.csi:md5,db6f77bcdbb7ada7e0c93e5b987b8265", + "test.md.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0", "test.recal.mosdepth.global.dist.txt:md5,0c795eadf5e5a8ea8469ba8c0ece9bdd", "test.recal.mosdepth.region.dist.txt:md5,54273a37adf55f8cee822aaf92a4c321", "test.recal.mosdepth.summary.txt:md5,bb12489d3d44c4e44eb5dcc8fdef636c", "test.recal.regions.bed.gz:md5,24cd07f8ce342a277f2954d6e731015e", - "test.recal.regions.bed.gz.csi:md5,db6f77bcdbb7ada7e0c93e5b987b8265", + "test.recal.regions.bed.gz.csi:md5,b21a943497a42870c5035d81a87524b0", "test.strelka.variants.FILTER.summary:md5,f58effcb4006be9b10081e4417197aa6", "test.strelka.variants.TsTv.count:md5,fccdacf16ebe20d74f36bd7b38f11ca4" ], @@ -261,11 +262,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:36:55.243190299", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.3" - }, - "timestamp": "2026-02-09T09:52:02.012960987" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/bam_umi_header.csv --umi_in_read_header --tools markduplicates --step mapping": { "content": [ @@ -285,10 +286,10 @@ "cat": "9.5" }, "COLLATE_FASTQ_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "COLLATE_FASTQ_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -313,28 +314,29 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_MERGE_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_MAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_MAP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_VIEW_UNMAP_UNMAP": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -605,7 +607,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,afe461017b5f2189651f29c79f6fee44", + "samtools-stats-dp.txt:md5,99bedef59d485c544a016e3e372591d5", "samtools_alignment_plot.txt:md5,9d6e0d529e64404f2c24e74285e242ee", "samtools_insert_size.txt:md5,91c40430c1296fd8ce04788f2f528754", "test.strelka.variants.bcftools_stats.txt:md5,a1500be145d3bd8a1e643c8772c4406d", @@ -613,12 +615,12 @@ "test.md.mosdepth.region.dist.txt:md5,1dd626f6fef0d1ac29fd7ffb8b1bbd95", "test.md.mosdepth.summary.txt:md5,25af78b074abf710ddd9c90cba1928bc", "test.md.regions.bed.gz:md5,813d852c5a237022fd4b7446d12f7772", - "test.md.regions.bed.gz.csi:md5,10b7f8e9ac2ac27205f8bc827a186195", + "test.md.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.recal.mosdepth.global.dist.txt:md5,7b8a7773d5d854ae1b681b971d11bb34", "test.recal.mosdepth.region.dist.txt:md5,1dd626f6fef0d1ac29fd7ffb8b1bbd95", "test.recal.mosdepth.summary.txt:md5,25af78b074abf710ddd9c90cba1928bc", "test.recal.regions.bed.gz:md5,813d852c5a237022fd4b7446d12f7772", - "test.recal.regions.bed.gz.csi:md5,10b7f8e9ac2ac27205f8bc827a186195", + "test.recal.regions.bed.gz.csi:md5,551e8ad190dfafe3a1491661075a277c", "test.strelka.variants.FILTER.summary:md5,869e416e19c9d8c7c6924758e66ea426", "test.strelka.variants.TsTv.count:md5,2a049bc323b4bc559da89d136a567e28" ], @@ -633,10 +635,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:42:25.348630085", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T22:06:00.327735562" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index c24a31fb1f..6402ccd10b 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -38,7 +38,7 @@ "cnvkit": "0.9.11" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -66,10 +66,11 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MSISENSORPRO_MSISOMATIC": { "msisensor-pro": "1.3.0" @@ -78,7 +79,7 @@ "msisensor-pro": "1.3.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -526,7 +527,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,13dab249f7bef935dfef234299550db8", + "samtools-stats-dp.txt:md5,8b8f48d0b1d134cfe3636e8577265751", "samtools_alignment_plot.txt:md5,44149e0c5cc4bfa58242824b300219a2", "samtools_insert_size.txt:md5,c4b5c78eeb30a8c926d1bd9506882516", "test.bcftools.bcftools_stats.txt:md5,9213504c6b04c6c3cdf308ad3e8b4c3a", @@ -542,22 +543,22 @@ "test.md.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.md.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test.md.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test.md.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test.md.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test.recal.mosdepth.global.dist.txt:md5,76fa71922a3f748e507c2364c531dfcb", "test.recal.mosdepth.region.dist.txt:md5,abc5df85e302b79985627888870882da", "test.recal.mosdepth.summary.txt:md5,d536456436eb275159b8c6af83213d80", "test.recal.regions.bed.gz:md5,b25a2798061021c0b2f4e1d18219bbbd", - "test.recal.regions.bed.gz.csi:md5,b1c2a861f64e20a94108a6de3b76c582", + "test.recal.regions.bed.gz.csi:md5,f58637ea3ed05bef11f054941c96e252", "test2.md.mosdepth.global.dist.txt:md5,2020cf6dfc7ddca020c921dd9f0549b7", "test2.md.mosdepth.region.dist.txt:md5,38ff8b38c33b9231f047fea8ea830aae", "test2.md.mosdepth.summary.txt:md5,8b991358768cade225470a07cd34f573", "test2.md.regions.bed.gz:md5,08e767f91a0a8d82733f0040e804a85f", - "test2.md.regions.bed.gz.csi:md5,d5f1c9389ecf52ba839e834780a94549", + "test2.md.regions.bed.gz.csi:md5,7357b11c67d045f7383a19845688e072", "test2.recal.mosdepth.global.dist.txt:md5,2020cf6dfc7ddca020c921dd9f0549b7", "test2.recal.mosdepth.region.dist.txt:md5,38ff8b38c33b9231f047fea8ea830aae", "test2.recal.mosdepth.summary.txt:md5,8b991358768cade225470a07cd34f573", "test2.recal.regions.bed.gz:md5,08e767f91a0a8d82733f0040e804a85f", - "test2.recal.regions.bed.gz.csi:md5,d5f1c9389ecf52ba839e834780a94549", + "test2.recal.regions.bed.gz.csi:md5,7357b11c67d045f7383a19845688e072", "test.bcftools.FILTER.summary:md5,2c7c195b18f335698bae9619280492e8", "test.bcftools.TsTv.count:md5,9748f609e7b83855e75804191c935ab3", "test.deepvariant.FILTER.summary:md5,45b02f546c5f8a1365343130497190fa", @@ -640,11 +641,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:30:48.429722692", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T16:20:15.694178204" + } }, "-profile test --input tests/csv/3.0/fastq_single.csv --tools cnvkit,deepvariant,freebayes,mpileup,strelka,tiddit": { "content": [ @@ -685,7 +686,7 @@ "cnvkit": "0.9.11" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -713,13 +714,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -1075,7 +1077,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,ae7954084b2cd708c5e7369606bf4208", + "samtools-stats-dp.txt:md5,92dc10e61df31bf4286b16582bed488f", "samtools_alignment_plot.txt:md5,438e719bf574a46726dbd2e0f1442e42", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", "test.bcftools.bcftools_stats.txt:md5,9213504c6b04c6c3cdf308ad3e8b4c3a", @@ -1087,12 +1089,12 @@ "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.md.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.md.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.md.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.recal.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.recal.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.recal.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.recal.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.recal.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.recal.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.bcftools.FILTER.summary:md5,2c7c195b18f335698bae9619280492e8", "test.bcftools.TsTv.count:md5,9748f609e7b83855e75804191c935ab3", "test.deepvariant.FILTER.summary:md5,45b02f546c5f8a1365343130497190fa", @@ -1140,11 +1142,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:32:11.483735223", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T16:23:41.706393706" + } }, "-profile test --input tests/csv/3.0/fastq_tumor_only.csv --tools cnvkit,freebayes,mpileup,mutect2,tiddit": { "content": [ @@ -1179,7 +1181,7 @@ "cnvkit": "0.9.11" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -1210,19 +1212,20 @@ "gatk4": "4.6.2.0" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "LEARNREADORIENTATIONMODEL": { "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1552,7 +1555,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,157a95de8aa4dd8947bb965f0c9ae3c7", + "samtools-stats-dp.txt:md5,c8a75397adcc418d4483c57a021550d4", "samtools_alignment_plot.txt:md5,46e8824724863d243a01cc239a5eff15", "samtools_insert_size.txt:md5,17c44517c58803f9c078f6d9b55aed00", "test2.bcftools.bcftools_stats.txt:md5,fa4bd52259a3400e5d21c43b570e40a5", @@ -1563,12 +1566,12 @@ "test2.md.mosdepth.region.dist.txt:md5,38ff8b38c33b9231f047fea8ea830aae", "test2.md.mosdepth.summary.txt:md5,8b991358768cade225470a07cd34f573", "test2.md.regions.bed.gz:md5,08e767f91a0a8d82733f0040e804a85f", - "test2.md.regions.bed.gz.csi:md5,d5f1c9389ecf52ba839e834780a94549", + "test2.md.regions.bed.gz.csi:md5,7357b11c67d045f7383a19845688e072", "test2.recal.mosdepth.global.dist.txt:md5,2020cf6dfc7ddca020c921dd9f0549b7", "test2.recal.mosdepth.region.dist.txt:md5,38ff8b38c33b9231f047fea8ea830aae", "test2.recal.mosdepth.summary.txt:md5,8b991358768cade225470a07cd34f573", "test2.recal.regions.bed.gz:md5,08e767f91a0a8d82733f0040e804a85f", - "test2.recal.regions.bed.gz.csi:md5,d5f1c9389ecf52ba839e834780a94549", + "test2.recal.regions.bed.gz.csi:md5,7357b11c67d045f7383a19845688e072", "test2.bcftools.FILTER.summary:md5,2a717afe607d6b59558f860518738542", "test2.bcftools.TsTv.count:md5,0c9a9764d605cba41d6c088340688939", "test2.freebayes.filtered.FILTER.summary:md5,24e14f2e2651745a8d74dfe2844afa24", @@ -1604,10 +1607,10 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:27:19.8576204", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T16:16:13.675589663" + } } } \ No newline at end of file diff --git a/tests/variant_calling_ascat.nf.test.snap b/tests/variant_calling_ascat.nf.test.snap index 9e2892d7cf..d2078a5658 100644 --- a/tests/variant_calling_ascat.nf.test.snap +++ b/tests/variant_calling_ascat.nf.test.snap @@ -11,7 +11,7 @@ "mosdepth": "0.3.10" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -106,7 +106,7 @@ "mosdepth": "0.3.10" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -198,10 +198,11 @@ "ascat": "3.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -306,19 +307,19 @@ "mosdepth-cumcoverage-dist-id.txt:md5,c5095d8ac96d906979d5ead383b14d73", "mosdepth_perchrom.txt:md5,a79d8d9cb20cf117f7510eb1e3674997", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,272184ca54d87094df9ab12335618e9a", + "samtools-stats-dp.txt:md5,a8448cbfa77d72de4e86a90bee0e5d17", "samtools_alignment_plot.txt:md5,cd6531ba39758cf6ad96ba9d83df2230", "samtools_insert_size.txt:md5,80b42e59a90818b77a39d87cd6b590e9", "NA12878.recal.mosdepth.global.dist.txt:md5,a5ccac0290f8331d0aa7d68f0c9b0934", "NA12878.recal.mosdepth.region.dist.txt:md5,81a999e01ee353b6a3dd5db321053ffc", "NA12878.recal.mosdepth.summary.txt:md5,f78fade2ac186184fc44eb1d7ec443d0", "NA12878.recal.regions.bed.gz:md5,2870532cc9d041c21999cb0a14d453b5", - "NA12878.recal.regions.bed.gz.csi:md5,58b5cd4cb9ab131a0f0a601eb72bcd04", + "NA12878.recal.regions.bed.gz.csi:md5,2cc4e07c8ef77b90542d238763002be9", "NA12878_1X.recal.mosdepth.global.dist.txt:md5,8c70c08460d008b30c231a2d00fc3fb9", "NA12878_1X.recal.mosdepth.region.dist.txt:md5,ddfe117ae7b0474c1e27857a282da9fb", "NA12878_1X.recal.mosdepth.summary.txt:md5,8056360df7642e84fcc4355454cf617a", "NA12878_1X.recal.regions.bed.gz:md5,0e6ff7afa2678e2dc667ec650bb18f75", - "NA12878_1X.recal.regions.bed.gz.csi:md5,5d07e60555f3087f5805dd20ed3bea8b", + "NA12878_1X.recal.regions.bed.gz.csi:md5,edac5d938e218575a6fd764accb7fbf2", "NA12878_1X_vs_NA12878.cnvs.txt:md5,68b329da9893e34099c7d8ad5cb9c940", "NA12878_1X_vs_NA12878.purityploidy.txt:md5,f1484c2b120834d3db8774ad02a038b9", "NA12878_1X_vs_NA12878.segments.txt:md5,68b329da9893e34099c7d8ad5cb9c940", @@ -334,10 +335,10 @@ "No VCF files", "No warnings" ], - "timestamp": "2025-09-30T22:09:59.120270404", + "timestamp": "2026-07-27T10:27:42.266137545", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --tools ascat --input ascat_somatic.csv": { @@ -349,10 +350,11 @@ "ascat": "3.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -455,19 +457,19 @@ "mosdepth-cumcoverage-dist-id.txt:md5,c5095d8ac96d906979d5ead383b14d73", "mosdepth_perchrom.txt:md5,a79d8d9cb20cf117f7510eb1e3674997", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,272184ca54d87094df9ab12335618e9a", + "samtools-stats-dp.txt:md5,a8448cbfa77d72de4e86a90bee0e5d17", "samtools_alignment_plot.txt:md5,cd6531ba39758cf6ad96ba9d83df2230", "samtools_insert_size.txt:md5,80b42e59a90818b77a39d87cd6b590e9", "NA12878.recal.mosdepth.global.dist.txt:md5,a5ccac0290f8331d0aa7d68f0c9b0934", "NA12878.recal.mosdepth.region.dist.txt:md5,81a999e01ee353b6a3dd5db321053ffc", "NA12878.recal.mosdepth.summary.txt:md5,f78fade2ac186184fc44eb1d7ec443d0", "NA12878.recal.regions.bed.gz:md5,2870532cc9d041c21999cb0a14d453b5", - "NA12878.recal.regions.bed.gz.csi:md5,58b5cd4cb9ab131a0f0a601eb72bcd04", + "NA12878.recal.regions.bed.gz.csi:md5,2cc4e07c8ef77b90542d238763002be9", "NA12878_1X.recal.mosdepth.global.dist.txt:md5,8c70c08460d008b30c231a2d00fc3fb9", "NA12878_1X.recal.mosdepth.region.dist.txt:md5,ddfe117ae7b0474c1e27857a282da9fb", "NA12878_1X.recal.mosdepth.summary.txt:md5,8056360df7642e84fcc4355454cf617a", "NA12878_1X.recal.regions.bed.gz:md5,0e6ff7afa2678e2dc667ec650bb18f75", - "NA12878_1X.recal.regions.bed.gz.csi:md5,5d07e60555f3087f5805dd20ed3bea8b", + "NA12878_1X.recal.regions.bed.gz.csi:md5,edac5d938e218575a6fd764accb7fbf2", "NA12878_1X_vs_NA12878.cnvs.txt:md5,68b329da9893e34099c7d8ad5cb9c940", "NA12878_1X_vs_NA12878.purityploidy.txt:md5,f1484c2b120834d3db8774ad02a038b9", "NA12878_1X_vs_NA12878.segments.txt:md5,68b329da9893e34099c7d8ad5cb9c940", @@ -485,10 +487,10 @@ "WARN: No LogRCorrection performed in ASCAT. For LogRCorrection to run, please provide either loci gc files or both loci gc files and loci rt files." ] ], - "timestamp": "2025-12-15T22:00:03.974713999", + "timestamp": "2026-07-27T10:28:48.645382058", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/variant_calling_cnvkit.nf.test.snap b/tests/variant_calling_cnvkit.nf.test.snap index e37886a5b3..c52d3d2793 100644 --- a/tests/variant_calling_cnvkit.nf.test.snap +++ b/tests/variant_calling_cnvkit.nf.test.snap @@ -22,16 +22,17 @@ "cnvkit": "0.9.11" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -152,19 +153,19 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "multi_intervals.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "multi_intervals.target.bed:md5,f7474a0afbf5565c5675916606f2d9bd", "reference.cnn:md5,891454915f82d0eeda0be13d71e0d5d7", @@ -198,11 +199,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:30:55.546225902", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-07-20T10:09:45.402105" + } }, "-profile test --tools cnvkit --input recalibrated.csv --only_paired_variant_calling": { "content": [ @@ -227,16 +228,17 @@ "cnvkit": "0.9.11" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -387,29 +389,29 @@ "mosdepth-cumcoverage-dist-id.txt:md5,ad0637d55d7025330f2f6cb7f9680e64", "mosdepth_perchrom.txt:md5,73ef9a077df1887f9021a581fbf207bc", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,b446a47b182d93a9e7e74f5f7c8d41c2", + "samtools-stats-dp.txt:md5,a6501ad36c9d1e9b97878e69f072d63c", "samtools_alignment_plot.txt:md5,7138a2d29f515993e1df8d745e27b757", "samtools_insert_size.txt:md5,e0c5f4ebb18a0e6bd437f0b919725b39", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "multi_intervals.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "multi_intervals.target.bed:md5,f7474a0afbf5565c5675916606f2d9bd", "reference.cnn:md5,891454915f82d0eeda0be13d71e0d5d7", @@ -454,11 +456,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:28:58.93483756", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-07-20T10:18:52.335661" + } }, "-profile test --tools cnvkit --input recalibrated_germline.csv": { "content": [ @@ -483,16 +485,17 @@ "cnvkit": "0.9.11" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -588,14 +591,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "multi_intervals.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "multi_intervals.target.bed:md5,f7474a0afbf5565c5675916606f2d9bd", "reference.cnn:md5,891454915f82d0eeda0be13d71e0d5d7", @@ -615,11 +618,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:26:30.003168858", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-07-20T10:05:28.442046" + } }, "-profile test --tools cnvkit --input recalibrated_tumoronly.csv": { "content": [ @@ -644,16 +647,17 @@ "cnvkit": "0.9.11" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -748,14 +752,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,8398d1127a10d0c002831ddedfb9713b", "mosdepth_perchrom.txt:md5,ff38f1e35ce12244c751921db673b23c", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "cnvkit.reference.antitarget-tmp.bed:md5,3d4d20f9f23b39970865d29ef239d20b", "cnvkit.reference.target-tmp.bed:md5,657b25dbda8516624efa8cb2cf3716ca", "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,067115082c4af4b64d58c0dc3a3642e4", @@ -774,24 +778,25 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:31:08.508007983", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-07-20T10:13:42.841328" + } }, "-profile test --tools cnvkit --input recalibrated_tumoronly.csv --no_intervals": { "content": [ 5, { "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -869,25 +874,25 @@ "mosdepth-cumcoverage-dist-id.txt:md5,8398d1127a10d0c002831ddedfb9713b", "mosdepth_perchrom.txt:md5,ff38f1e35ce12244c751921db673b23c", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd" + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497" ], "No BAM files", "No CRAM files", "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:21:02.862389764", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-07-20T10:24:27.668069" + } }, "-profile test --tools cnvkit --input recalibrated_somatic.csv --no_intervals": { "content": [ @@ -906,13 +911,14 @@ "cnvkit": "0.9.10" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1034,19 +1040,19 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "genome.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "genome.bed:md5,9c6cc178da8c2c27364be9f25c9df96d", "genome.target.bed:md5,d6bb0e93de375af227a800a032f08f03", @@ -1082,10 +1088,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:27:01.74112415", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-07-20T10:22:29.609745" + } } } diff --git a/tests/variant_calling_controlfreec.nf.test.snap b/tests/variant_calling_controlfreec.nf.test.snap index 2e78020160..e765355a00 100644 --- a/tests/variant_calling_controlfreec.nf.test.snap +++ b/tests/variant_calling_controlfreec.nf.test.snap @@ -19,13 +19,14 @@ "controlfreec": "11.6b" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_MPILEUP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -121,13 +122,13 @@ "mosdepth-cumcoverage-dist-id.txt:md5,88b94dd2dcc423983da65125ece7651e", "mosdepth_perchrom.txt:md5,a0266cd06dd6f7f5463f09e3cb8af71d", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.bed:md5,5249f46e614b60867bdd6b9b83327979", "sample2.circos.txt:md5,2efab24d023931cec8b158c56d1f1765", "sample2.p.value.txt:md5,38c8c9ad33a4fca3804a34d5c436cd1e", @@ -143,10 +144,10 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-05-28T15:29:16.864765246", + "timestamp": "2026-07-27T10:37:16.056899008", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.2" + "nextflow": "25.10.4" } }, "-profile test --tools controlfreec somatic": { @@ -172,13 +173,14 @@ "controlfreec": "11.6b" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_MPILEUP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -289,23 +291,23 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cb7468f51b8be1230fb3ac5b130be31f", "mosdepth_perchrom.txt:md5,4ee05f71086179b42a01cd2fb450346f", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample3.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample4.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample4.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4_vs_sample3.bed:md5,47f60179409e9389e59b2e2525e42210", "sample4_vs_sample3.circos.txt:md5,68addb1d8bda08355842bef0ab15cd6e", "sample4_vs_sample3.normal.mpileup.gz_control.cpn:md5,d50bf2c9a4d35f022364901c284e80ed", @@ -322,10 +324,10 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-05-28T15:27:36.537227044", + "timestamp": "2026-07-27T10:29:23.11767132", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.2" + "nextflow": "25.10.4" } }, "-profile test --tools controlfreec --no_intervals somatic -stub": { @@ -351,10 +353,10 @@ "mosdepth": "0.3.10" }, "SAMTOOLS_MPILEUP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -466,10 +468,10 @@ "mosdepth": "0.3.10" }, "SAMTOOLS_MPILEUP": { - "samtools": 1.21 + "samtools": "1.24" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", diff --git a/tests/variant_calling_deepvariant.nf.test.snap b/tests/variant_calling_deepvariant.nf.test.snap index d713e12cbd..c04371b448 100644 --- a/tests/variant_calling_deepvariant.nf.test.snap +++ b/tests/variant_calling_deepvariant.nf.test.snap @@ -16,10 +16,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -164,7 +165,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.deepvariant.bcftools_stats.txt:md5,c784614aec9ed43f1d4a6149c8ae8bf3", @@ -172,7 +173,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.deepvariant.FILTER.summary:md5,533b6a6a8eb84238b2d7ac6c229c1a7f", "test.deepvariant.TsTv.count:md5,2851ce55f9813280515c2fdcacb86844" ], @@ -184,10 +185,10 @@ ], "No warnings" ], - "timestamp": "2025-10-02T10:43:58.630637808", + "timestamp": "2026-07-27T10:44:10.97242938", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --tools deepvariant --input tests/csv/3.0/mapped_single_cram.csv -stub": { @@ -210,7 +211,7 @@ "mosdepth": "0.3.10" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -361,7 +362,7 @@ "mosdepth": "0.3.10" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -508,10 +509,11 @@ "deepvariant": "1.10.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -655,7 +657,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.deepvariant.bcftools_stats.txt:md5,c784614aec9ed43f1d4a6149c8ae8bf3", @@ -663,7 +665,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.deepvariant.FILTER.summary:md5,533b6a6a8eb84238b2d7ac6c229c1a7f", "test.deepvariant.TsTv.count:md5,2851ce55f9813280515c2fdcacb86844" ], @@ -675,10 +677,10 @@ ], "No warnings" ], - "timestamp": "2025-10-02T10:45:45.83448312", + "timestamp": "2026-07-27T10:38:30.287152607", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/variant_calling_freebayes.nf.test.snap b/tests/variant_calling_freebayes.nf.test.snap index c8c585f4d9..1fdbe9b711 100644 --- a/tests/variant_calling_freebayes.nf.test.snap +++ b/tests/variant_calling_freebayes.nf.test.snap @@ -22,10 +22,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -183,7 +184,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,1036ea76acae803f591fd99838a8eded", "mosdepth_perchrom.txt:md5,1f24f2f40467234c410a8bda544a8aae", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.freebayes.filtered.bcftools_stats.txt:md5,8d125501aef859ecb64b7363d93429fe", @@ -191,9 +192,9 @@ "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample2.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample2.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample2.freebayes.filtered.FILTER.summary:md5,0a8ab31642123f2fc365df90166f22d5", "sample2.freebayes.filtered.TsTv.count:md5,1756160098a27e7537c0fa8ea5cffc5f" ], @@ -210,11 +211,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:28:53.984660271", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-04T12:14:50.842752" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools freebayes --no_intervals --wes --input fastq_pair.csv": { "content": [ @@ -250,13 +251,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -563,7 +565,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,7a0481b59cdd57cc0b8bc9b5641614c6", + "samtools-stats-dp.txt:md5,b4eaecbb6a9f2c463337ce06f8e2f47c", "samtools_alignment_plot.txt:md5,8e6178a26fe2a4fc4f45fac3175ba6c6", "samtools_insert_size.txt:md5,c4b5c78eeb30a8c926d1bd9506882516", "test.freebayes.filtered.bcftools_stats.txt:md5,5b0bc956256ff340d4f7409769fa9924", @@ -571,19 +573,19 @@ "test.md.mosdepth.global.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.md.mosdepth.summary.txt:md5,0010c2396a3173c7cf4983abe2eb6a4c", "test.md.per-base.bed.gz:md5,34dfe443c0a0767562dd65272e3310ef", - "test.md.per-base.bed.gz.csi:md5,b0ab630c3241fbd7581b7a38d944ff8b", + "test.md.per-base.bed.gz.csi:md5,635faec9b8aea3be719bc5cb9b81b1aa", "test.recal.mosdepth.global.dist.txt:md5,5a0679057c530e5945c9c5a3a17312dc", "test.recal.mosdepth.summary.txt:md5,0010c2396a3173c7cf4983abe2eb6a4c", "test.recal.per-base.bed.gz:md5,34dfe443c0a0767562dd65272e3310ef", - "test.recal.per-base.bed.gz.csi:md5,b0ab630c3241fbd7581b7a38d944ff8b", + "test.recal.per-base.bed.gz.csi:md5,635faec9b8aea3be719bc5cb9b81b1aa", "test2.md.mosdepth.global.dist.txt:md5,f25166c3a0051bb4d8c11a210278de6c", "test2.md.mosdepth.summary.txt:md5,d5e4084de2ea2a0a7b60b2d71c804d4b", "test2.md.per-base.bed.gz:md5,e1c6d60621d8f64aaf28fa1c1ddda921", - "test2.md.per-base.bed.gz.csi:md5,4205a09ede17cdbdaad45e3553f73105", + "test2.md.per-base.bed.gz.csi:md5,651986721bf7e1695fc044e06126df51", "test2.recal.mosdepth.global.dist.txt:md5,f25166c3a0051bb4d8c11a210278de6c", "test2.recal.mosdepth.summary.txt:md5,d5e4084de2ea2a0a7b60b2d71c804d4b", "test2.recal.per-base.bed.gz:md5,e1c6d60621d8f64aaf28fa1c1ddda921", - "test2.recal.per-base.bed.gz.csi:md5,4205a09ede17cdbdaad45e3553f73105", + "test2.recal.per-base.bed.gz.csi:md5,651986721bf7e1695fc044e06126df51", "test.freebayes.filtered.FILTER.summary:md5,87e753ba2ad969475fb55661852f75e0", "test.freebayes.filtered.TsTv.count:md5,845f64e5bb4224af98f3a47294cd5483", "test2_vs_test.freebayes.filtered.FILTER.summary:md5,1f06f857e3576c6a98c32d1e7f51f456", @@ -621,11 +623,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:31:12.762942445", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T11:36:14.240620697" + } }, "-profile test --tools freebayes --wes --nucleotides_per_second 20": { "content": [ @@ -667,19 +669,20 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_FREEBAYES": { "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -957,7 +960,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,300b95526a211b05f18aaffd037dacd3", + "samtools-stats-dp.txt:md5,2f8b6ccd23ecf736af3d32dbb33699b2", "samtools_alignment_plot.txt:md5,5053f650b8612fe5e8527b0bca8ab905", "samtools_insert_size.txt:md5,2b1da7c476290081135a2816f4231333", "test.freebayes.filtered.bcftools_stats.txt:md5,b0d8c9234a3b038c05fd14d656e43956", @@ -965,16 +968,16 @@ "test.md.mosdepth.region.dist.txt:md5,d25723bdd3fec6b17d2462abfa097b9e", "test.md.mosdepth.summary.txt:md5,87be70cd1237d7af9aa40d8cd8b3a817", "test.md.per-base.bed.gz:md5,c53d26b767b6e75b3e502438a77f89b2", - "test.md.per-base.bed.gz.csi:md5,c3066b00781e14a9db5fc0bf0d47d777", + "test.md.per-base.bed.gz.csi:md5,df3802b73cb56d0301af323b18341e99", "test.md.regions.bed.gz:md5,f96fa1cdae548eb7e54ce6a481d928b9", - "test.md.regions.bed.gz.csi:md5,c6d1ac97ef4dfe43731c8368d8391cab", + "test.md.regions.bed.gz.csi:md5,2cdd53425271b3ada1ee10958372331b", "test.recal.mosdepth.global.dist.txt:md5,a3e6c8f6d4b5e909d0527be83a93fbae", "test.recal.mosdepth.region.dist.txt:md5,d25723bdd3fec6b17d2462abfa097b9e", "test.recal.mosdepth.summary.txt:md5,ca5424a709268a61200a2dc2865f1a14", "test.recal.per-base.bed.gz:md5,8aaf9cb3dd5c9643e77aba91293fc39d", - "test.recal.per-base.bed.gz.csi:md5,d8038c7d544abd5d6335f2541de4e769", + "test.recal.per-base.bed.gz.csi:md5,4bbe5c3dc2ea4bdcb40a47aff885c7bb", "test.recal.regions.bed.gz:md5,f96fa1cdae548eb7e54ce6a481d928b9", - "test.recal.regions.bed.gz.csi:md5,c6d1ac97ef4dfe43731c8368d8391cab", + "test.recal.regions.bed.gz.csi:md5,2cdd53425271b3ada1ee10958372331b", "test.freebayes.filtered.FILTER.summary:md5,259470a9823d503d5639946162b2ed19", "test.freebayes.filtered.TsTv.count:md5,162253eb6c406300678985b3ac7dc868" ], @@ -996,11 +999,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:29:15.12436469", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T11:27:28.609439333" + } }, "-profile test --tools freebayes --no_intervals": { "content": [ @@ -1036,13 +1039,14 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1318,7 +1322,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,9e836f09043529495de9e1c268ee8e82", + "samtools-stats-dp.txt:md5,35b5d272beeaf4a4b926fd3ace473928", "samtools_alignment_plot.txt:md5,bcc2f176a4bc51b33a36bd4381f048a5", "samtools_insert_size.txt:md5,73b933a27800b86a4012c2d525870796", "test.freebayes.filtered.bcftools_stats.txt:md5,60f55a391db494db3e95bd69b6b36fa3", @@ -1326,12 +1330,12 @@ "test.md.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.md.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.md.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.md.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.md.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.recal.mosdepth.global.dist.txt:md5,ef7c375ae07aec5540f9892b9b556b73", "test.recal.mosdepth.region.dist.txt:md5,212efff2213f6fc1c3204daf68bbb8c8", "test.recal.mosdepth.summary.txt:md5,72114393647ff64503522760218b30f0", "test.recal.regions.bed.gz:md5,985db429051ddcd5eae177da6fb55ad6", - "test.recal.regions.bed.gz.csi:md5,3fa0f8272fefafe3cd840376d34a94a2", + "test.recal.regions.bed.gz.csi:md5,1f17d398be6b9c100cb0218fa226a623", "test.freebayes.filtered.FILTER.summary:md5,9ae0931339e231f90a4b5c330f7f6d55", "test.freebayes.filtered.TsTv.count:md5,845f64e5bb4224af98f3a47294cd5483" ], @@ -1353,11 +1357,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:32:49.236918224", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T11:30:11.341607202" + } }, "-profile test --tools freebayes --no_intervals --input recalibrated_tumoronly.csv": { "content": [ @@ -1376,10 +1380,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1536,14 +1541,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,88b94dd2dcc423983da65125ece7651e", "mosdepth_perchrom.txt:md5,a0266cd06dd6f7f5463f09e3cb8af71d", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.freebayes.filtered.bcftools_stats.txt:md5,6bc59a78f70ac18e8d69a779a7892673", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.freebayes.filtered.FILTER.summary:md5,fac42829b9b347413acbfc9c0a17fef0", "sample2.freebayes.filtered.TsTv.count:md5,f864a8b1d6bab1d5f877b60dde36863f" ], @@ -1560,11 +1565,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:27:39.737452077", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" - }, - "timestamp": "2025-11-04T12:22:29.186457" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools freebayes --wes --nucleotides_per_second 20 --input fastq_pair.csv": { "content": [ @@ -1606,19 +1611,20 @@ "samtools": "1.21" }, "INDEX_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_CRAM": { - "samtools": 1.21 + "samtools": "1.24" }, "MERGE_FREEBAYES": { "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1935,7 +1941,7 @@ "picard_MeanQualityByCycle_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_MeanQualityByCycle_histogram_1.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "picard_QualityScoreDistribution_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "samtools-stats-dp.txt:md5,ff7906db0da2f9c9ba5ce85c34694124", + "samtools-stats-dp.txt:md5,51e64be3231a16d20f89f2e8bac9b93a", "samtools_alignment_plot.txt:md5,89d0a6e7076223e9feadbecd794948d5", "samtools_insert_size.txt:md5,ca54b785b1d63edd61cef58cd5558aa2", "test.freebayes.filtered.bcftools_stats.txt:md5,49399853673a44189a06f171efb1c670", @@ -1944,30 +1950,30 @@ "test.md.mosdepth.region.dist.txt:md5,835fdc6fa52cc33e6fb76c0c20a8a6c3", "test.md.mosdepth.summary.txt:md5,dcc9ab2bf3248903e02d8da87e678977", "test.md.per-base.bed.gz:md5,34dfe443c0a0767562dd65272e3310ef", - "test.md.per-base.bed.gz.csi:md5,b0ab630c3241fbd7581b7a38d944ff8b", + "test.md.per-base.bed.gz.csi:md5,635faec9b8aea3be719bc5cb9b81b1aa", "test.md.regions.bed.gz:md5,99cc80b920ba574e7d9ef8f59f54f7c6", - "test.md.regions.bed.gz.csi:md5,c6d1ac97ef4dfe43731c8368d8391cab", + "test.md.regions.bed.gz.csi:md5,2cdd53425271b3ada1ee10958372331b", "test.recal.mosdepth.global.dist.txt:md5,0b3162def977123809598639f7698121", "test.recal.mosdepth.region.dist.txt:md5,835fdc6fa52cc33e6fb76c0c20a8a6c3", "test.recal.mosdepth.summary.txt:md5,a8455eb2947de529abfa62b303986e0f", "test.recal.per-base.bed.gz:md5,c075ccd2b847c7c04061a39717faeb30", - "test.recal.per-base.bed.gz.csi:md5,4816eeb9af254ca40177b08cf11b98d2", + "test.recal.per-base.bed.gz.csi:md5,93782f791ac4333f6cfc02d6f38d67bc", "test.recal.regions.bed.gz:md5,99cc80b920ba574e7d9ef8f59f54f7c6", - "test.recal.regions.bed.gz.csi:md5,c6d1ac97ef4dfe43731c8368d8391cab", + "test.recal.regions.bed.gz.csi:md5,2cdd53425271b3ada1ee10958372331b", "test2.md.mosdepth.global.dist.txt:md5,f25166c3a0051bb4d8c11a210278de6c", "test2.md.mosdepth.region.dist.txt:md5,3211135329e4077bd9bf0ba488e14371", "test2.md.mosdepth.summary.txt:md5,ce0eb6d33c6d0dc720fbc6d1811abef8", "test2.md.per-base.bed.gz:md5,e1c6d60621d8f64aaf28fa1c1ddda921", - "test2.md.per-base.bed.gz.csi:md5,4205a09ede17cdbdaad45e3553f73105", + "test2.md.per-base.bed.gz.csi:md5,651986721bf7e1695fc044e06126df51", "test2.md.regions.bed.gz:md5,0bb2549180165a99680ba3e453ea312f", - "test2.md.regions.bed.gz.csi:md5,c6d1ac97ef4dfe43731c8368d8391cab", + "test2.md.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "test2.recal.mosdepth.global.dist.txt:md5,a1ef7e662ce993da4668e804952014ce", "test2.recal.mosdepth.region.dist.txt:md5,3211135329e4077bd9bf0ba488e14371", "test2.recal.mosdepth.summary.txt:md5,70ad653c0c98baeeaf5085f1209a7bdb", "test2.recal.per-base.bed.gz:md5,e992ef845ec91a3612297952a23ba579", - "test2.recal.per-base.bed.gz.csi:md5,8072f447199c60f24b01eede8b557333", + "test2.recal.per-base.bed.gz.csi:md5,0f5fca336438af0a76a853c44af95b26", "test2.recal.regions.bed.gz:md5,0bb2549180165a99680ba3e453ea312f", - "test2.recal.regions.bed.gz.csi:md5,c6d1ac97ef4dfe43731c8368d8391cab", + "test2.recal.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "test.freebayes.filtered.FILTER.summary:md5,449597c35ada505b4cb2530d5260e9d5", "test.freebayes.filtered.TsTv.count:md5,162253eb6c406300678985b3ac7dc868", "test2_vs_test.freebayes.filtered.FILTER.summary:md5,b3cdcab0fb3a666b40ef76c4193ff7f8", @@ -1999,10 +2005,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-27T10:34:34.523815105", "meta": { - "nf-test": "0.9.3", + "nf-test": "0.9.5", "nextflow": "25.10.4" - }, - "timestamp": "2026-06-12T11:33:20.327931788" + } } } \ No newline at end of file diff --git a/tests/variant_calling_haplotypecaller.nf.test.snap b/tests/variant_calling_haplotypecaller.nf.test.snap index 7016f600b7..55281a9cb3 100644 --- a/tests/variant_calling_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_haplotypecaller.nf.test.snap @@ -10,10 +10,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -158,14 +159,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,24098c80b7a75e41cd68ef1f2154b7b0", "mosdepth_perchrom.txt:md5,93a8fd4ad5c5a4fcdf9e67a07183c7cb", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.haplotypecaller.bcftools_stats.txt:md5,b9b8c3cb422534bdb7a45d884c121af8", "test.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "test.recal.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59", "test.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", - "test.recal.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4", + "test.recal.per-base.bed.gz.csi:md5,524a822fc4863b450fda9e0f99ccdf04", "test.haplotypecaller.FILTER.summary:md5,87a84b5f8ac3d3cbeeef7d60afcdbfe7", "test.haplotypecaller.TsTv.count:md5,b77c120ee5cc0423267200c67d60c663" ], @@ -176,11 +177,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:27:52.965412156", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T22:57:09.952875456" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input mapped_single_bam.csv --tools haplotypecaller --step variant_calling --wes --nucleotides_per_second 20 --skip_tools haplotypecaller_filter": { "content": [ @@ -199,10 +200,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -351,7 +353,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cff5ad3df703fd30cd655ef53caf75fb", "mosdepth_perchrom.txt:md5,6e1f4a26793f1912cd83cee7259635c6", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.haplotypecaller.bcftools_stats.txt:md5,b9b8c3cb422534bdb7a45d884c121af8", @@ -359,9 +361,9 @@ "test.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "test.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", "test.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", - "test.recal.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4", + "test.recal.per-base.bed.gz.csi:md5,524a822fc4863b450fda9e0f99ccdf04", "test.recal.regions.bed.gz:md5,0c8215fbea7b0bf7aba9d1781575f905", - "test.recal.regions.bed.gz.csi:md5,5c00a1d457c387d6e71848a6d897e309", + "test.recal.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "test.haplotypecaller.FILTER.summary:md5,87a84b5f8ac3d3cbeeef7d60afcdbfe7", "test.haplotypecaller.TsTv.count:md5,b77c120ee5cc0423267200c67d60c663" ], @@ -372,11 +374,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:29:55.289787759", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T22:56:07.158030738" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input mapped_single_bam.csv --tools haplotypecaller --step variant_calling --wes --nucleotides_per_second 20 --no_intervals": { "content": [ @@ -395,10 +397,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -545,14 +548,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,24098c80b7a75e41cd68ef1f2154b7b0", "mosdepth_perchrom.txt:md5,93a8fd4ad5c5a4fcdf9e67a07183c7cb", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.haplotypecaller.filtered.bcftools_stats.txt:md5,5debbaa917411dda07c7972272a95f38", "test.recal.mosdepth.global.dist.txt:md5,e82e90c7d508a135b5a8a7cd6933452e", "test.recal.mosdepth.summary.txt:md5,4f0d231060cbde4efdd673863bd2fb59", "test.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", - "test.recal.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4", + "test.recal.per-base.bed.gz.csi:md5,524a822fc4863b450fda9e0f99ccdf04", "test.haplotypecaller.filtered.FILTER.summary:md5,4e2ceea7f3ff998004691fd71192d9ee", "test.haplotypecaller.filtered.TsTv.count:md5,b77c120ee5cc0423267200c67d60c663" ], @@ -564,11 +567,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:32:53.636129324", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T22:54:55.763188536" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input mapped_single_bam.csv --tools haplotypecaller --step variant_calling --wes --nucleotides_per_second 20": { "content": [ @@ -593,10 +596,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -747,7 +751,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cff5ad3df703fd30cd655ef53caf75fb", "mosdepth_perchrom.txt:md5,6e1f4a26793f1912cd83cee7259635c6", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.haplotypecaller.filtered.bcftools_stats.txt:md5,5debbaa917411dda07c7972272a95f38", @@ -755,9 +759,9 @@ "test.recal.mosdepth.region.dist.txt:md5,3a2030e5e8af7bc12720c3a5592bf921", "test.recal.mosdepth.summary.txt:md5,615c5c5019d88045a9ff5bbe6e63d270", "test.recal.per-base.bed.gz:md5,da6db0fb375a3053a89db8c935eebbaa", - "test.recal.per-base.bed.gz.csi:md5,9e649ac749ff6c6073bef5ab63e8aaa4", + "test.recal.per-base.bed.gz.csi:md5,524a822fc4863b450fda9e0f99ccdf04", "test.recal.regions.bed.gz:md5,0c8215fbea7b0bf7aba9d1781575f905", - "test.recal.regions.bed.gz.csi:md5,5c00a1d457c387d6e71848a6d897e309", + "test.recal.regions.bed.gz.csi:md5,8f139abca5ac58eaf522bd96a46cff1b", "test.haplotypecaller.filtered.FILTER.summary:md5,4e2ceea7f3ff998004691fd71192d9ee", "test.haplotypecaller.filtered.TsTv.count:md5,b77c120ee5cc0423267200c67d60c663" ], @@ -769,10 +773,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:32:48.438182421", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T22:53:34.886097542" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_lofreq.nf.test.snap b/tests/variant_calling_lofreq.nf.test.snap index dae6d760ce..74a9f15e41 100644 --- a/tests/variant_calling_lofreq.nf.test.snap +++ b/tests/variant_calling_lofreq.nf.test.snap @@ -16,10 +16,11 @@ "lofreq": "2.1.5" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -161,7 +162,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,1036ea76acae803f591fd99838a8eded", "mosdepth_perchrom.txt:md5,1f24f2f40467234c410a8bda544a8aae", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.lofreq.bcftools_stats.txt:md5,064a0729f34ff2b74a1ea619cc47ecb6", @@ -169,9 +170,9 @@ "sample2.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample2.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample2.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample2.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample2.lofreq.FILTER.summary:md5,8dd8a0c91d5c4a260b462e04f615e502" ], "No BAM files", @@ -184,10 +185,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:31:16.337399595", + "timestamp": "2026-07-27T10:22:20.09841282", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools lofreq --no_intervals tumoronly": { @@ -204,10 +205,11 @@ "lofreq": "2.1.5" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -345,14 +347,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,88b94dd2dcc423983da65125ece7651e", "mosdepth_perchrom.txt:md5,a0266cd06dd6f7f5463f09e3cb8af71d", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.lofreq.bcftools_stats.txt:md5,1aa21f81ba86f60f145934ab517fc44e", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.lofreq.FILTER.summary:md5,72beda1b57da053eb352204828605a40" ], "No BAM files", @@ -365,10 +367,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:32:37.387358619", + "timestamp": "2026-07-27T10:30:44.706814777", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/variant_calling_manta.nf.test.snap b/tests/variant_calling_manta.nf.test.snap index b24430a374..c9a50c3d9a 100644 --- a/tests/variant_calling_manta.nf.test.snap +++ b/tests/variant_calling_manta.nf.test.snap @@ -13,10 +13,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -133,7 +134,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.manta.diploid_sv.bcftools_stats.txt:md5,8721040d8aa617f37498e9d89f48d503", @@ -141,7 +142,7 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample1.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample1.manta.diploid_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -152,10 +153,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:43:23.100191682", + "timestamp": "2026-07-27T10:45:08.642654705", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools manta --no_intervals tumoronly": { @@ -169,10 +170,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -288,7 +290,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,8398d1127a10d0c002831ddedfb9713b", "mosdepth_perchrom.txt:md5,ff38f1e35ce12244c751921db673b23c", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.manta.tumor_sv.bcftools_stats.txt:md5,6a4c5f596d407e12449c36fe3419488f", @@ -296,7 +298,7 @@ "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample2.manta.tumor_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample2.manta.tumor_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -307,10 +309,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:48:58.932904711", + "timestamp": "2026-07-27T10:32:07.479458904", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools manta --no_intervals somatic": { @@ -327,10 +329,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -469,7 +472,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", @@ -479,12 +482,12 @@ "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample3.manta.diploid_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "sample4_vs_sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", @@ -501,10 +504,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:46:50.07261297", + "timestamp": "2026-07-27T10:33:53.269385428", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools manta tumoronly": { @@ -521,10 +524,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -641,7 +645,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,8398d1127a10d0c002831ddedfb9713b", "mosdepth_perchrom.txt:md5,ff38f1e35ce12244c751921db673b23c", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.manta.tumor_sv.bcftools_stats.txt:md5,6a4c5f596d407e12449c36fe3419488f", @@ -649,7 +653,7 @@ "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample2.manta.tumor_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample2.manta.tumor_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -660,10 +664,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:47:53.602614087", + "timestamp": "2026-07-27T10:35:30.836798406", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools manta --only_paired_variant_calling": { @@ -686,10 +690,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -854,7 +859,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,ad0637d55d7025330f2f6cb7f9680e64", "mosdepth_perchrom.txt:md5,73ef9a077df1887f9021a581fbf207bc", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,b446a47b182d93a9e7e74f5f7c8d41c2", + "samtools-stats-dp.txt:md5,a6501ad36c9d1e9b97878e69f072d63c", "samtools_alignment_plot.txt:md5,7138a2d29f515993e1df8d745e27b757", "samtools_insert_size.txt:md5,e0c5f4ebb18a0e6bd437f0b919725b39", "sample1.manta.diploid_sv.bcftools_stats.txt:md5,8721040d8aa617f37498e9d89f48d503", @@ -865,22 +870,22 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample1.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample1.manta.diploid_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "sample2.manta.tumor_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", @@ -900,10 +905,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:42:13.91617972", + "timestamp": "2026-07-27T10:38:31.008536362", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools manta somatic": { @@ -923,10 +928,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1066,7 +1072,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", @@ -1076,12 +1082,12 @@ "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample3.manta.diploid_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "sample4_vs_sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", @@ -1098,10 +1104,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:45:35.30977089", + "timestamp": "2026-07-27T10:30:18.506893012", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools manta --no_intervals germline": { @@ -1115,10 +1121,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -1234,7 +1241,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.manta.diploid_sv.bcftools_stats.txt:md5,8721040d8aa617f37498e9d89f48d503", @@ -1242,7 +1249,7 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample1.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample1.manta.diploid_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -1253,10 +1260,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:44:26.578484488", + "timestamp": "2026-07-27T10:39:22.908367447", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/variant_calling_mpileup.nf.test.snap b/tests/variant_calling_mpileup.nf.test.snap index d4536963aa..cd66e0b5f8 100644 --- a/tests/variant_calling_mpileup.nf.test.snap +++ b/tests/variant_calling_mpileup.nf.test.snap @@ -13,10 +13,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -163,7 +164,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,8398d1127a10d0c002831ddedfb9713b", "mosdepth_perchrom.txt:md5,ff38f1e35ce12244c751921db673b23c", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.bcftools.bcftools_stats.txt:md5,47ce340432efdbb38a86d8b7c3d0c2d4", @@ -171,7 +172,7 @@ "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample2.bcftools.FILTER.summary:md5,8766995f3e4119ef30dfdaa9fb3752ce", "sample2.bcftools.TsTv.count:md5,01df95fcb4df593f7e1b214d90ebdb59" ], @@ -182,11 +183,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:33:46.74937531", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:12:38.089637491" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools mpileup --input recalibrated_germline.csv --no_intervals": { "content": [ @@ -199,10 +200,11 @@ "bcftools": "1.23.1" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -348,7 +350,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.bcftools.bcftools_stats.txt:md5,81ab4ccc0da202a814b7f99ba5c49bb4", @@ -356,7 +358,7 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample1.bcftools.FILTER.summary:md5,83a10512eb9d035f409a84db7e620c28", "sample1.bcftools.TsTv.count:md5,bfa998e75cbcb3da66f823cf39ef1e48" ], @@ -367,11 +369,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:28:38.96226408", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:11:16.876484642" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools mpileup --input recalibrated_tumoronly.csv --no_intervals": { "content": [ @@ -384,10 +386,11 @@ "bcftools": "1.23.1" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -533,7 +536,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,8398d1127a10d0c002831ddedfb9713b", "mosdepth_perchrom.txt:md5,ff38f1e35ce12244c751921db673b23c", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.bcftools.bcftools_stats.txt:md5,4897ad81224f076a9d7054ba865de378", @@ -541,7 +544,7 @@ "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample2.bcftools.FILTER.summary:md5,f295c70f174e7705fc2bac607aedbfda", "sample2.bcftools.TsTv.count:md5,e5d20f81fc97f7ee97fb6cb6bd851047" ], @@ -552,11 +555,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:33:54.21084607", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:14:01.579156158" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools mpileup --input recalibrated_germline.csv": { "content": [ @@ -572,10 +575,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -722,7 +726,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.bcftools.bcftools_stats.txt:md5,51bc17eed97a82f7a4a59d5f8181a1cc", @@ -730,7 +734,7 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample1.bcftools.FILTER.summary:md5,9b62595b026decf12e9198d531e4307a", "sample1.bcftools.TsTv.count:md5,6c937125d7bac4c491bea50f18cba43a" ], @@ -741,10 +745,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:29:53.620097595", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:09:53.430122786" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_msisensor2.nf.test.snap b/tests/variant_calling_msisensor2.nf.test.snap index 23997e71d4..db76dbf777 100644 --- a/tests/variant_calling_msisensor2.nf.test.snap +++ b/tests/variant_calling_msisensor2.nf.test.snap @@ -167,13 +167,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MSISENSOR2_MSI": { "msisensor2": 0.1 }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -266,10 +267,10 @@ "test.recal.mosdepth.global.dist.txt:md5,96d22fe7b6f5824cde06c98c96dec304", "test.recal.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "test.recal.mosdepth.summary.txt:md5,81c058bd237404d95b3f838bae176303", - "test.recal.per-base.bed.gz:md5,bafb7489cc40a55cfe85f99ea6d36cc7", - "test.recal.per-base.bed.gz.csi:md5,e72e7c7886d42728d785bb97dffd2a07", + "test.recal.per-base.bed.gz:md5,557eec61090bc149d9a9fecbfd5774cb", + "test.recal.per-base.bed.gz.csi:md5,4a3a6c9d1af60bd3c2ddef8ce088ffa3", "test.recal.regions.bed.gz:md5,d7e8ac59cdfd4cfb70712e699c6848f5", - "test.recal.regions.bed.gz.csi:md5,d9cfb4c9a4ffcf4b0122c378a547162a", + "test.recal.regions.bed.gz.csi:md5,e30cfcd01d332c367656668d87ecce62", "test:md5,a3290f7539dbbf83777e8590156c0e28", "test_dis:md5,85205504ea8652ebdee46ac07ee1a8f6" ], @@ -278,10 +279,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:30:44.993560881", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.3" - }, - "timestamp": "2026-02-09T09:57:39.631656166" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_msisensorpro.nf.test.snap b/tests/variant_calling_msisensorpro.nf.test.snap index 82da407438..e5d36cb0d3 100644 --- a/tests/variant_calling_msisensorpro.nf.test.snap +++ b/tests/variant_calling_msisensorpro.nf.test.snap @@ -56,7 +56,8 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MSISENSORPRO_MSISOMATIC": { "msisensor-pro": "1.3.0" @@ -65,7 +66,7 @@ "msisensor-pro": "1.3.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -163,23 +164,23 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cb7468f51b8be1230fb3ac5b130be31f", "mosdepth_perchrom.txt:md5,4ee05f71086179b42a01cd2fb450346f", "multiqc_citations.txt:md5,6239b0f0a9736ccaf3baff3014dd585b", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample3.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample4.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample4.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4_vs_sample3:md5,efc7a09642d444d7475d976c7c8110f4", "sample4_vs_sample3_dis:md5,780b282473e51808c5ae32b50b4a6406" ], @@ -188,11 +189,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-27T10:23:15.906308902", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:18:49.269683325" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools msisensorpro somatic --build_only_index --input false": { "content": [ diff --git a/tests/variant_calling_muse.nf.test.snap b/tests/variant_calling_muse.nf.test.snap index cb8540dbbb..68982cfc30 100644 --- a/tests/variant_calling_muse.nf.test.snap +++ b/tests/variant_calling_muse.nf.test.snap @@ -7,7 +7,7 @@ "bcftools": "1.23.1" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -26,7 +26,7 @@ "muse": "2.1.2" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -187,7 +187,7 @@ "bcftools": "1.23.1" }, "CRAM_TO_BAM": { - "samtools": 1.21 + "samtools": "1.24" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -196,7 +196,8 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUSE_CALL": { "muse": "2.1.2" @@ -206,7 +207,7 @@ "muse": "2.1.2" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -337,7 +338,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cb7468f51b8be1230fb3ac5b130be31f", "mosdepth_perchrom.txt:md5,4ee05f71086179b42a01cd2fb450346f", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample4_vs_sample3.muse.bcftools_stats.txt:md5,78caff99ab648b7191fd74954713aef9", @@ -345,16 +346,16 @@ "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample3.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample4.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample4.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4_vs_sample3.muse.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample4_vs_sample3.muse.TsTv.count:md5,8dcfdbcaac118df1d5ad407dd2af699f" ], @@ -368,10 +369,10 @@ ], "No warnings" ], - "timestamp": "2026-05-19T18:51:58.229719817", + "timestamp": "2026-07-27T10:39:31.857457867", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/variant_calling_mutect2.nf.test.snap b/tests/variant_calling_mutect2.nf.test.snap index c905361d6e..0a33bc5519 100644 --- a/tests/variant_calling_mutect2.nf.test.snap +++ b/tests/variant_calling_mutect2.nf.test.snap @@ -13,13 +13,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -164,14 +165,14 @@ "mosdepth-cumcoverage-dist-id.txt:md5,88b94dd2dcc423983da65125ece7651e", "mosdepth_perchrom.txt:md5,a0266cd06dd6f7f5463f09e3cb8af71d", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.mutect2.bcftools_stats.txt:md5,634af596519997cd802fbc8fe290342f", "sample2.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.mutect2.FILTER.summary:md5,08f06620a8dcc70115bdde9137a91008", "sample2.mutect2.TsTv.count:md5,0d59dcbdb127be60909111958ff7b5f5", "sample2.mutect2.vcf.gz.stats:md5,76f749c53212d72e98801f6030fbf8a6" @@ -186,11 +187,11 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:36:37.905823869", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T23:34:19.18363343" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools mutect2 somatic": { "content": [ @@ -209,13 +210,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2_PAIRED": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -374,7 +376,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,cb7468f51b8be1230fb3ac5b130be31f", "mosdepth_perchrom.txt:md5,4ee05f71086179b42a01cd2fb450346f", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,c802eeeaa4ab6531bdb5d8c0b583f8b6", @@ -382,16 +384,16 @@ "sample3.recal.mosdepth.region.dist.txt:md5,6ec49cd7d510c2eb3d9d90fdb79b783a", "sample3.recal.mosdepth.summary.txt:md5,103098d0bf76ed82d2b87d5f242b099a", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample3.recal.regions.bed.gz:md5,314ce8d7273eff353072108aa77c327c", - "sample3.recal.regions.bed.gz.csi:md5,9cb0ad7039a3b703d16ca7d5b835c0ee", + "sample3.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.region.dist.txt:md5,39005ffaac22871ffaaf19656fe69c5b", "sample4.recal.mosdepth.summary.txt:md5,68d4b98f17361fddf73052ead34fa370", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4.recal.regions.bed.gz:md5,b7561bc56a955f7db0f11e67e2ec0386", - "sample4.recal.regions.bed.gz.csi:md5,393c2749068304d8545b501b9d4658e4", + "sample4.recal.regions.bed.gz.csi:md5,2c9ca91a9535113038c59b6e408e0818", "sample4_vs_sample3.mutect2.FILTER.summary:md5,cac64448be577632a614af62a23af34a", "sample4_vs_sample3.mutect2.TsTv.count:md5,3739f24da2d2019cc4bc2821e30658eb", "sample4_vs_sample3.mutect2.vcf.gz.stats:md5,bd657dd9abf6e2354224bb0d20ba181e" @@ -406,11 +408,11 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:49:05.16697888", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T23:23:51.624986383" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools mutect2 somatic --no_intervals": { "content": [ @@ -426,13 +428,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2_PAIRED": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -584,18 +587,18 @@ "mosdepth-cumcoverage-dist-id.txt:md5,35fe7c32ea54f1a69c647202873bb7d7", "mosdepth_perchrom.txt:md5,14473da27940bc99c7b9ed36d82f7429", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample4_vs_sample3.mutect2.bcftools_stats.txt:md5,c802eeeaa4ab6531bdb5d8c0b583f8b6", "sample3.recal.mosdepth.global.dist.txt:md5,69e29702ef01fd8f6c7a5468fc35a16a", "sample3.recal.mosdepth.summary.txt:md5,d2775eb102acc5950f7f53883dcb503d", "sample3.recal.per-base.bed.gz:md5,297f96648928d0ca5184223fb9941e7c", - "sample3.recal.per-base.bed.gz.csi:md5,c67dcd711b096eb42f43784d5eadbc0d", + "sample3.recal.per-base.bed.gz.csi:md5,68451158beb41ef7fcd07821fe3a52b4", "sample4.recal.mosdepth.global.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample4.recal.mosdepth.summary.txt:md5,0a7300e56eda6fba7c7564f00aa000f0", "sample4.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample4.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample4.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample4_vs_sample3.mutect2.FILTER.summary:md5,cac64448be577632a614af62a23af34a", "sample4_vs_sample3.mutect2.TsTv.count:md5,3739f24da2d2019cc4bc2821e30658eb", "sample4_vs_sample3.mutect2.vcf.gz.stats:md5,4300e84631ee258660f95e846511d021" @@ -610,11 +613,11 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:42:39.618205653", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T23:27:38.999681674" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools mutect2 tumoronly": { "content": [ @@ -636,13 +639,14 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "MUTECT2": { "gatk4": "4.6.2.0" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -791,7 +795,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,88b94dd2dcc423983da65125ece7651e", "mosdepth_perchrom.txt:md5,a0266cd06dd6f7f5463f09e3cb8af71d", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.mutect2.bcftools_stats.txt:md5,634af596519997cd802fbc8fe290342f", @@ -799,9 +803,9 @@ "sample2.recal.mosdepth.region.dist.txt:md5,f2dcd00a64947c49e8e4b93c2f4fbf27", "sample2.recal.mosdepth.summary.txt:md5,b0b47739dcafeeb1a9e6218b8abca1e0", "sample2.recal.per-base.bed.gz:md5,39a1bc436aa8546c26faedbe94cb676c", - "sample2.recal.per-base.bed.gz.csi:md5,cfb07b0ba46e8468b4342edb243536f3", + "sample2.recal.per-base.bed.gz.csi:md5,8964f1acc52b73fe72deffcd39e98d78", "sample2.recal.regions.bed.gz:md5,fb0efeba20ea272b7b709cf65246689e", - "sample2.recal.regions.bed.gz.csi:md5,e8452848671e9e5c147ff4cceee944af", + "sample2.recal.regions.bed.gz.csi:md5,e95efa0e55e9f9699b48e6a661d5e1e4", "sample2.mutect2.FILTER.summary:md5,08f06620a8dcc70115bdde9137a91008", "sample2.mutect2.TsTv.count:md5,0d59dcbdb127be60909111958ff7b5f5", "sample2.mutect2.vcf.gz.stats:md5,76f749c53212d72e98801f6030fbf8a6" @@ -816,10 +820,10 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], + "timestamp": "2026-07-27T10:33:25.493676415", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T23:30:58.725141411" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_sentieon_dnascope.nf.test.snap b/tests/variant_calling_sentieon_dnascope.nf.test.snap index 1440d01f1a..6aae5c5a95 100644 --- a/tests/variant_calling_sentieon_dnascope.nf.test.snap +++ b/tests/variant_calling_sentieon_dnascope.nf.test.snap @@ -13,10 +13,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DNASCOPE": { "sentieon": "202503.02" @@ -166,7 +167,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.dnascope.unfiltered.bcftools_stats.txt:md5,e7e014ba2764fca171a3291c26cca34c", @@ -174,7 +175,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.dnascope.unfiltered.FILTER.summary:md5,87a84b5f8ac3d3cbeeef7d60afcdbfe7", "test.dnascope.unfiltered.TsTv.count:md5,b77c120ee5cc0423267200c67d60c663" ], @@ -185,11 +186,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T11:38:52.499416464", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T12:35:10.846318732" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_dnascope": { "content": [ @@ -205,10 +206,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DNAMODELAPPLY": { "sentieon": "202503.02" @@ -363,7 +365,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.dnascope.filtered.bcftools_stats.txt:md5,af2789c5de131bbd90b133b9382f506f", @@ -371,7 +373,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.dnascope.filtered.FILTER.summary:md5,e67b24d296810a075378e5864bcea0fa", "test.dnascope.filtered.TsTv.count:md5,b77c120ee5cc0423267200c67d60c663" ], @@ -383,11 +385,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T11:34:52.637438538", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T11:44:42.944302645" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_dnascope --joint_germline --sentieon_dnascope_emit_mode gvcf": { "content": [ @@ -409,10 +411,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_DNASCOPE": { "sentieon": "202503.02" @@ -568,7 +571,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "joint_germline.bcftools_stats.txt:md5,936ca7dc4a8d81cb73a9446057ec4b24", @@ -576,7 +579,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "joint_germline.FILTER.summary:md5,b489034e69de07875cbf0f5548b4f55e", "joint_germline.TsTv.count:md5,803d74e40f7716202bae2a3a81c1ddfc" ], @@ -590,10 +593,10 @@ "WARN: If GATK's Haplotypecaller, Sentieon's Dnascope and/or Sentieon's Haplotyper is specified, but without `--dbsnp`, `--known_snps`, `--known_indels` or the associated resource labels (ie `known_snps_vqsr`), no variant recalibration will be done. For recalibration you must provide all of these resources." ] ], + "timestamp": "2026-07-27T11:36:02.196958675", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T16:52:44.930404505" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap index c50574d646..f861d9b5b2 100644 --- a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap @@ -19,10 +19,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_APPLYVARCAL_INDEL": { "sentieon": "202503.02" @@ -192,7 +193,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "joint_germline_recalibrated_indel.bcftools_stats.txt:md5,f87581b827c876e433e51e39342379ca", @@ -200,7 +201,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "joint_germline_recalibrated_indel.FILTER.summary:md5,7e04c3bed9ecbb73aa3c02c2b6b46089", "joint_germline_recalibrated_indel.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc" ], @@ -215,11 +216,11 @@ "WARN: If GATK's Haplotypecaller, Sentieon's Dnascope and/or Sentieon's Haplotyper is specified, but without `--dbsnp`, `--known_snps`, `--known_indels` or the associated resource labels (ie `known_snps_vqsr`), no variant recalibration will be done. For recalibration you must provide all of these resources." ] ], + "timestamp": "2026-07-27T11:36:08.094597613", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-23T20:44:13.797239672" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_haplotyper --no_intervals": { "content": [ @@ -235,10 +236,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_HAPLOTYPER": { "sentieon": "202503.02" @@ -389,7 +391,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.haplotyper.filtered.bcftools_stats.txt:md5,f4863054921218b7821858f5836029e4", @@ -397,7 +399,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.haplotyper.filtered.FILTER.summary:md5,d501a93356f3c91c743f51104e24514a", "test.haplotyper.filtered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc" ], @@ -409,11 +411,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T11:36:40.990413214", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T14:35:09.570055964" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_haplotyper --skip_tools haplotyper_filter": { "content": [ @@ -429,10 +431,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_HAPLOTYPER": { "sentieon": "202503.02" @@ -582,7 +585,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.haplotyper.unfiltered.bcftools_stats.txt:md5,69874476b2830366fff35b242dbfdfa5", @@ -590,7 +593,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.haplotyper.unfiltered.FILTER.summary:md5,01b3d10464a3ac86f90ee82cdda23f68", "test.haplotyper.unfiltered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc" ], @@ -601,11 +604,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T11:36:30.915587402", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T14:41:55.821821171" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools sentieon_haplotyper": { "content": [ @@ -627,10 +630,11 @@ "gatk4": "4.6.2.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SENTIEON_HAPLOTYPER": { "sentieon": "202503.02" @@ -782,7 +786,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,df2fc825dfc41e30f72f5d125a6447ee", "mosdepth_perchrom.txt:md5,115b9a93bcf511419e6622919172f321", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,06abce459a3e3192252b6196ae3b189e", + "samtools-stats-dp.txt:md5,53338147cfd6cffd24eef5c07518fe4c", "samtools_alignment_plot.txt:md5,3622ecb71829cc1c581157e403048fd1", "samtools_insert_size.txt:md5,108caa8155bf293b835c81ae10cc25f4", "test.haplotyper.filtered.bcftools_stats.txt:md5,f4863054921218b7821858f5836029e4", @@ -790,7 +794,7 @@ "test.recal.mosdepth.region.dist.txt:md5,f1f1ad86fc280bced1888a5d7d25a3f2", "test.recal.mosdepth.summary.txt:md5,32ea70ef1b99def3dc900b4afd513a40", "test.recal.regions.bed.gz:md5,07bbc084a889f1cece4307fd00214a6e", - "test.recal.regions.bed.gz.csi:md5,b3716e5cd1744610e69c29bd4ffad259", + "test.recal.regions.bed.gz.csi:md5,c984bfd7ccac964973c6c1566992b21d", "test.haplotyper.filtered.FILTER.summary:md5,d501a93356f3c91c743f51104e24514a", "test.haplotyper.filtered.TsTv.count:md5,89562fef808b5c3db629682d36fd86fc" ], @@ -802,10 +806,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T11:36:24.959312656", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T14:24:33.689599405" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_strelka.nf.test.snap b/tests/variant_calling_strelka.nf.test.snap index 11ec9a4495..5a8093d26e 100644 --- a/tests/variant_calling_strelka.nf.test.snap +++ b/tests/variant_calling_strelka.nf.test.snap @@ -10,10 +10,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -191,7 +192,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.strelka.variants.bcftools_stats.txt:md5,2c40e667f6ee75761fe6c3b33dda0679", @@ -201,12 +202,12 @@ "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.strelka.variants.FILTER.summary:md5,fef8aeadd3b0f3b8c040c0da03bf1cbd", "sample3.strelka.variants.TsTv.count:md5,c5b7a8eda2526d899098439ae4c06a49", "sample4_vs_sample3.strelka.somatic_indels.FILTER.summary:md5,30a45e2bc87f40c89388032cbf75ec65", @@ -224,11 +225,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:30:09.214764374", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:48:23.853303187" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools strelka germline": { "content": [ @@ -241,10 +242,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -392,7 +394,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.strelka.variants.bcftools_stats.txt:md5,bcb50cfcfefdce0d203aff1d054d9f24", @@ -400,7 +402,7 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample1.strelka.variants.FILTER.summary:md5,fef8aeadd3b0f3b8c040c0da03bf1cbd", "sample1.strelka.variants.TsTv.count:md5,c5b7a8eda2526d899098439ae4c06a49" ], @@ -412,11 +414,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:33:17.232108325", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:45:18.036242508" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools strelka --only_paired_variant_calling": { "content": [ @@ -429,10 +431,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -626,7 +629,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,ad0637d55d7025330f2f6cb7f9680e64", "mosdepth_perchrom.txt:md5,73ef9a077df1887f9021a581fbf207bc", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,b446a47b182d93a9e7e74f5f7c8d41c2", + "samtools-stats-dp.txt:md5,a6501ad36c9d1e9b97878e69f072d63c", "samtools_alignment_plot.txt:md5,7138a2d29f515993e1df8d745e27b757", "samtools_insert_size.txt:md5,e0c5f4ebb18a0e6bd437f0b919725b39", "sample1.strelka.variants.bcftools_stats.txt:md5,bcb50cfcfefdce0d203aff1d054d9f24", @@ -636,22 +639,22 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample2.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.recal.mosdepth.global.dist.txt:md5,d9a4dd6429560b2b647da346050766c5", "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample1.strelka.variants.FILTER.summary:md5,fef8aeadd3b0f3b8c040c0da03bf1cbd", "sample1.strelka.variants.TsTv.count:md5,c5b7a8eda2526d899098439ae4c06a49", "sample4_vs_sample3.strelka.somatic_indels.FILTER.summary:md5,30a45e2bc87f40c89388032cbf75ec65", @@ -669,11 +672,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:37:04.502091857", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:43:48.55687233" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools strelka --no_intervals germline": { "content": [ @@ -683,10 +686,11 @@ "bcftools": "1.23.1" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -833,7 +837,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.strelka.variants.bcftools_stats.txt:md5,198d97ab341f78b4c33ee345ebdfe5e2", @@ -841,7 +845,7 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample1.strelka.variants.FILTER.summary:md5,8697a0a983314e98b99b5f6038af65f6", "sample1.strelka.variants.TsTv.count:md5,1481854d2a765f5641856ecf95ca4097" ], @@ -853,11 +857,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:30:57.796189985", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:46:48.703134861" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools strelka --no_intervals somatic": { "content": [ @@ -867,10 +871,11 @@ "bcftools": "1.23.1" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -1047,7 +1052,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.strelka.variants.bcftools_stats.txt:md5,9a87ae32f97121c0e033043cd6605f67", @@ -1057,12 +1062,12 @@ "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.strelka.variants.FILTER.summary:md5,8697a0a983314e98b99b5f6038af65f6", "sample3.strelka.variants.TsTv.count:md5,1481854d2a765f5641856ecf95ca4097", "sample4_vs_sample3.strelka.somatic_indels.FILTER.summary:md5,30a45e2bc87f40c89388032cbf75ec65", @@ -1080,10 +1085,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:35:17.803996008", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:49:57.22542474" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_strelka_bp.nf.test.snap b/tests/variant_calling_strelka_bp.nf.test.snap index a24394f377..9ffbc319f1 100644 --- a/tests/variant_calling_strelka_bp.nf.test.snap +++ b/tests/variant_calling_strelka_bp.nf.test.snap @@ -13,10 +13,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -220,7 +221,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", @@ -233,12 +234,12 @@ "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample3.manta.diploid_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "sample4_vs_sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", @@ -265,11 +266,11 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:32:41.117980259", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:53:32.414589191" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools manta,strelka somatic": { "content": [ @@ -288,10 +289,11 @@ "manta": "1.6.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "STRELKA_SINGLE": { "strelka": "2.9.10" @@ -496,7 +498,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.manta.diploid_sv.bcftools_stats.txt:md5,5aafdb8e25b73849c4dae1aace2154ca", @@ -509,12 +511,12 @@ "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample3.manta.diploid_sv.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "sample4_vs_sample3.manta.diploid_sv.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", @@ -541,10 +543,10 @@ ], "No warnings" ], + "timestamp": "2026-07-27T10:35:43.999417751", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:51:45.217803492" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_tiddit.nf.test.snap b/tests/variant_calling_tiddit.nf.test.snap index 2b872c1619..09bb83af3f 100644 --- a/tests/variant_calling_tiddit.nf.test.snap +++ b/tests/variant_calling_tiddit.nf.test.snap @@ -10,10 +10,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -138,7 +139,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,edd8dfc8023e629e476e01c3a1448d30", "mosdepth_perchrom.txt:md5,49fd828d21d79a5c9430cdb30d7f0126", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,41d36c1a8413d565788a1a364b467606", + "samtools-stats-dp.txt:md5,5b881919a10bdc8661d05845dead0a98", "samtools_alignment_plot.txt:md5,35f8fd2a557568b2237193f46afbab5c", "samtools_insert_size.txt:md5,be7a60f43f0ca5238674cbf0f9d48917", "sample1.tiddit.bcftools_stats.txt:md5,ce8d4ce1c8fde22cf1557603caa1c4e9", @@ -146,7 +147,7 @@ "sample1.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample1.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample1.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample1.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample1.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample1.tiddit.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample1.tiddit.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -157,10 +158,10 @@ ], "No warnings" ], - "timestamp": "2026-05-20T09:36:34.643829502", + "timestamp": "2026-07-27T10:29:34.219316164", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools tiddit tumoronly": { @@ -174,10 +175,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { "bgzip": "1.21", @@ -302,7 +304,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,8398d1127a10d0c002831ddedfb9713b", "mosdepth_perchrom.txt:md5,ff38f1e35ce12244c751921db673b23c", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,6618ece77181051a58275f504f67ea5b", + "samtools-stats-dp.txt:md5,42facbec7ea07232de8dc0369f0da065", "samtools_alignment_plot.txt:md5,6136e5e1d072f166f280fb79424c392f", "samtools_insert_size.txt:md5,5cb5779e1a7baf077b529af8c427147c", "sample2.tiddit.bcftools_stats.txt:md5,f49030d75a44dde7a9d068af09e89c52", @@ -310,7 +312,7 @@ "sample2.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample2.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample2.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample2.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample2.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample2.tiddit.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample2.tiddit.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a" ], @@ -321,10 +323,10 @@ ], "No warnings" ], - "timestamp": "2026-05-20T09:39:22.408315557", + "timestamp": "2026-07-27T10:32:32.25435422", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } }, "-profile test --tools tiddit somatic": { @@ -338,10 +340,11 @@ "gawk": "5.3.0" }, "MOSDEPTH": { - "mosdepth": "0.3.10" + "gzip": "1.14", + "mosdepth": "0.3.14" }, "SAMTOOLS_STATS": { - "samtools": 1.21 + "samtools": "1.24" }, "SVDB_MERGE": { "bcftools": "1.23", @@ -491,7 +494,7 @@ "mosdepth-cumcoverage-dist-id.txt:md5,0cc87c596a0fc30ebb676c4587e986de", "mosdepth_perchrom.txt:md5,336d786b273c4d4e714d51c44207ff56", "multiqc_citations.txt:md5,d40980f61eb64026d58102841b7f3860", - "samtools-stats-dp.txt:md5,e0a8d8867064083908a8ca1ea782d7ac", + "samtools-stats-dp.txt:md5,bf6d30315fd7608b97b2a4eb1dc71fdc", "samtools_alignment_plot.txt:md5,f4b1a7cef760291172144a8614b4a1cd", "samtools_insert_size.txt:md5,8fa108dcbe0da42e9425dd125fe22905", "sample3.tiddit.bcftools_stats.txt:md5,981a4170dd5a6bd6e5f51bbb169f8a17", @@ -500,12 +503,12 @@ "sample3.recal.mosdepth.region.dist.txt:md5,1f3dab381958e08eb00f7c5e1135f677", "sample3.recal.mosdepth.summary.txt:md5,d7676e7c1de851b0ee5185d21096123b", "sample3.recal.regions.bed.gz:md5,6edeb8f7041a4403cb73651744b5bc82", - "sample3.recal.regions.bed.gz.csi:md5,5fc6f880df27ca754ab229f0ccad2aea", + "sample3.recal.regions.bed.gz.csi:md5,9fa6b12aa02f0f0a673b1fbe19d6fb75", "sample4.recal.mosdepth.global.dist.txt:md5,53f9ae9ab5002ffba340fa8cef7d70e4", "sample4.recal.mosdepth.region.dist.txt:md5,17600d21ac453506c52249cf435ad8ea", "sample4.recal.mosdepth.summary.txt:md5,7141030385af1f653718c9e0c9a5be80", "sample4.recal.regions.bed.gz:md5,c680c5d75f0cea068e3f917f4cf9bf52", - "sample4.recal.regions.bed.gz.csi:md5,68b7a9a98053b1122bdca68a1e1c87dd", + "sample4.recal.regions.bed.gz.csi:md5,569288ccaecad1a91b1310d0e981a497", "sample3.tiddit.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", "sample3.tiddit.TsTv.count:md5,fa27f678965b7cba6a92efcd039f802a", "sample4_vs_sample3.tiddit_sv_merge.FILTER.summary:md5,1ce42d34e4ae919afb519efc99146423", @@ -521,10 +524,10 @@ ], "No warnings" ], - "timestamp": "2026-05-20T09:38:11.731089821", + "timestamp": "2026-07-27T10:24:40.00162687", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/workflows/sarek.nf b/workflows/sarek.nf index eef91cfbc7..da01b6bf97 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -168,7 +168,6 @@ workflow SAREK { true, ) - two_fastq_gz_from_spring = r1_fastq_gz_from_spring.fastq.join(r2_fastq_gz_from_spring.fastq).map { meta, fastq_1, fastq_2 -> [meta, [fastq_1, fastq_2]] } two_fastq_gz_from_spring = two_fastq_gz_from_spring.map { meta, files -> addReadgroupToMeta(meta, files) } @@ -180,13 +179,11 @@ workflow SAREK { interleave_input = false CONVERT_FASTQ_INPUT( input_sample_type.bam, - [[id: "fasta"], []], - [[id: 'null'], []], + fasta, + fasta_fai, interleave_input, ) - versions = versions.mix(CONVERT_FASTQ_INPUT.out.versions) - // Gather fastq (inputed or converted) // Theorically this could work on mixed input (fastq for one sample and bam for another) // But not sure how to handle that with the samplesheet @@ -228,7 +225,6 @@ workflow SAREK { // Gather used softwares versions reports = reports.mix(FASTQ_PREPROCESS_PARABRICKS.out.reports) - versions = versions.mix(FASTQ_PREPROCESS_PARABRICKS.out.versions) } else { // PREPROCESSING @@ -292,7 +288,7 @@ workflow SAREK { } // convert cram files - CRAM_TO_BAM(cram_variant_calling_status_tmp.cram, fasta, fasta_fai) + CRAM_TO_BAM(cram_variant_calling_status_tmp.cram, fasta.combine(fasta_fai).map { meta, fasta_, _meta_fai, fai -> [ meta, fasta_, fai ] }.collect()) // gather all bam files bam_variant_calling = CRAM_TO_BAM.out.bam @@ -301,8 +297,6 @@ workflow SAREK { .map { meta, bam, bai -> [meta + [data_type: 'bam'], bam, bai] } - - versions = versions.mix(CRAM_TO_BAM.out.versions) } // Logic to separate germline samples, tumor samples with no matched normal, and combine tumor-normal pairs From 62edfac9d49d22b1139b24c709660562df161795 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Mon, 27 Jul 2026 21:37:47 +0200 Subject: [PATCH 18/27] chore(modules): migrate QC/coverage modules to versions topic channel (#2242) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates QC / coverage modules to the `versions` topic channel. **Stacked on #2241** (base: `topic/samtools`). ### Changes - Updates `fastqc`, `ngscheckmate/ncm`, `goleft/indexcov`, `msisensor2/msi`, `msisensorpro/{msisomatic,scan}`, `ascat` to their topic-channel versions (fastqc + ngscheckmate were already migrated on dev). - Removes the corresponding `.out.versions` wiring. Test snapshots need regenerating in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- .github/actions/nf-test/action.yml | 7 - CHANGELOG.md | 1 + modules.json | 10 +- modules/nf-core/ascat/main.nf | 101 +++++------ modules/nf-core/ascat/meta.yml | 170 ++++++++++++------ modules/nf-core/goleft/indexcov/main.nf | 51 +++--- modules/nf-core/goleft/indexcov/meta.yml | 94 +++++++--- modules/nf-core/msisensor2/msi/main.nf | 26 +-- modules/nf-core/msisensor2/msi/meta.yml | 29 ++- .../nf-core/msisensorpro/msisomatic/main.nf | 16 +- .../nf-core/msisensorpro/msisomatic/meta.yml | 44 +++-- modules/nf-core/msisensorpro/scan/main.nf | 16 +- modules/nf-core/msisensorpro/scan/meta.yml | 40 +++-- subworkflows/local/bam_markduplicates/main.nf | 6 - .../local/bam_markduplicates_spark/main.nf | 5 - subworkflows/local/bam_sentieon_dedup/main.nf | 6 - .../bam_variant_calling_indexcov/main.nf | 3 - .../bam_variant_calling_somatic_all/main.nf | 2 - .../bam_variant_calling_somatic_ascat/main.nf | 7 - .../main.nf | 1 - .../local/cram_qc_mosdepth_samtools/main.nf | 2 - subworkflows/local/cram_sampleqc/main.nf | 5 - .../local/fastq_preprocess_gatk/main.nf | 23 --- subworkflows/local/prepare_genome/main.nf | 1 - tests/variant_calling_ascat.nf.test.snap | 4 +- tests/variant_calling_msisensor2.nf.test.snap | 2 +- workflows/sarek.nf | 4 +- 27 files changed, 352 insertions(+), 324 deletions(-) diff --git a/.github/actions/nf-test/action.yml b/.github/actions/nf-test/action.yml index 341139f2f3..434f7b247e 100644 --- a/.github/actions/nf-test/action.yml +++ b/.github/actions/nf-test/action.yml @@ -74,14 +74,7 @@ runs: NFT_WORKDIR: ${{ env.NFT_WORKDIR }} SENTIEON_LICSRVR_IP: ${{ env.SENTIEON_LICSRVR_IP }} SENTIEON_AUTH_MECH: "GitHub Actions - token" - # Use nf-test's native differ instead of pdiff: pdiff wraps the snapshot - # diff to the terminal width and truncates md5 checksums in the CI log. - # The native differ prints full-length values on one line (scrapeable). - NFT_DIFF: diff run: | - # setup-nf-test exports NFT_DIFF_ARGS (pdiff flags) into the env; those - # flags suppress the native differ's output entirely, so drop them here. - unset NFT_DIFF_ARGS # In update-snapshot mode, regenerate snapshots over ALL tagged tests # (drop --changed-since, which is only meaningful for PR/push diffs). CHANGED_SINCE="--changed-since HEAD^" diff --git a/CHANGELOG.md b/CHANGELOG.md index cbac014e25..e5d006f4e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2239](https://github.com/nf-core/sarek/pull/2239) - Migrate alignment/UMI/utility modules (`bwa`, `bwamem2`, `dragmap`, `fgbio`, `fastp`, `cat`, `gawk`, `gunzip`, `untar`, `unzip`, `spring`) to the versions topic channel (fastp 0.24.0 → 1.1.0) - [#2240](https://github.com/nf-core/sarek/pull/2240) - Migrate variant-calling modules (`freebayes`, `strelka`, `manta`, `tiddit`, `lofreq`, `svdb`, `vcflib`, `vcftools`) to the versions topic channel - [#2241](https://github.com/nf-core/sarek/pull/2241) - Migrate `samtools/*` and `mosdepth` modules to the versions topic channel +- [#2242](https://github.com/nf-core/sarek/pull/2242) - Migrate QC/coverage modules (`fastqc`, `ngscheckmate`, `goleft`, `msisensor2`, `msisensorpro`, `ascat`) to the versions topic channel ### Fixed diff --git a/modules.json b/modules.json index fc37c5232f..d8ee6235ab 100644 --- a/modules.json +++ b/modules.json @@ -7,7 +7,7 @@ "nf-core": { "ascat": { "branch": "master", - "git_sha": "edd5dd7ef8d99cc059dcdff2de08d936838b8ca4", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "bbmap/bbsplit": { @@ -338,7 +338,7 @@ }, "goleft/indexcov": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "268dd690f53fd7f7bb524648ef1144a9b4e963eb", "installed_by": ["modules"] }, "gunzip": { @@ -373,17 +373,17 @@ }, "msisensor2/msi": { "branch": "master", - "git_sha": "d96d6f176de5729d21c3b33a610b486f7ef7eac9", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "msisensorpro/msisomatic": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "8f37155cb42259efed9e9aef24f7d1ba66ea983f", "installed_by": ["modules"] }, "msisensorpro/scan": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "8f37155cb42259efed9e9aef24f7d1ba66ea983f", "installed_by": ["modules"] }, "multiqc": { diff --git a/modules/nf-core/ascat/main.nf b/modules/nf-core/ascat/main.nf index b18948f525..4dac1f90f4 100644 --- a/modules/nf-core/ascat/main.nf +++ b/modules/nf-core/ascat/main.nf @@ -1,65 +1,70 @@ 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 in ['singularity', 'apptainer'] && !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) // 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("*purityploidy.txt") , emit: purityploidy - tuple val(meta), path("*segments.txt") , emit: segments - path "versions.yml" , emit: versions + 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 + tuple val("${task.process}"), val('bioconductor-ascat'), eval('Rscript -e "library(ASCAT); cat(as.character(packageVersion(\'ASCAT\')))"'), topic: versions, emit: versions_ascat + tuple val("${task.process}"), val('alleleCounter'), eval("alleleCounter --version"), topic: versions, emit: versions_allelecounter 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}" : "" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" - if(args.additional_allelecounter_flags && fasta) { + 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 ) { + } + else if (args.additional_allelecounter_flags) { additional_allelecounter_arg = ", additional_allelecounter_flags = \"${args.additional_allelecounter_flags}\" " - } else if (fasta) { + } + else if (fasta) { additional_allelecounter_arg = ", additional_allelecounter_flags = '-r \"${fasta}\"'" - } else { + } + else { additional_allelecounter_arg = "" } """ - #!/usr/bin/env Rscript + Rscript - <<'EOF' library(RColorBrewer) library(ASCAT) options(bitmapType='cairo') @@ -213,15 +218,7 @@ process ASCAT { 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) - writeLines(paste(" ascat:", ascat_version), f) - writeLines(paste(" alleleCounter:", alleleCounter_version), f) - close(f) + EOF """ stub: @@ -245,13 +242,5 @@ process ASCAT { 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 """ - - } diff --git a/modules/nf-core/ascat/meta.yml b/modules/nf-core/ascat/meta.yml index db7c92926a..8aebd0bc76 100644 --- a/modules/nf-core/ascat/meta.yml +++ b/modules/nf-core/ascat/meta.yml @@ -6,17 +6,18 @@ keywords: - cram tools: - ascat: - description: ASCAT is a method to derive copy number profiles of tumour cells, - accounting for normal cell admixture and tumour aneuploidy. ASCAT infers tumour - purity (the fraction of tumour cells) and ploidy (the amount of DNA per tumour - cell), expressed as multiples of haploid genomes from SNP array or massively - parallel sequencing data, and calculates whole-genome allele-specific copy number - profiles (the number of copies of both parental alleles for all SNP loci across - the genome). + description: ASCAT is a method to derive copy number profiles of tumour + cells, accounting for normal cell admixture and tumour aneuploidy. ASCAT + infers tumour purity (the fraction of tumour cells) and ploidy (the amount + of DNA per tumour cell), expressed as multiples of haploid genomes from + SNP array or massively parallel sequencing data, and calculates + whole-genome allele-specific copy number profiles (the number of copies of + both parental alleles for all SNP loci across the genome). documentation: https://github.com/VanLoo-lab/ascat/tree/master/man tool_dev_url: https://github.com/VanLoo-lab/ascat doi: "10.1093/bioinformatics/btaa538" - licence: ["GPL v3"] + licence: + - "GPL v3" identifier: biotools:ascat input: - - meta: @@ -26,51 +27,63 @@ input: e.g. [ id:'test', single_end:false ] - input_normal: type: file - description: BAM/CRAM file, must adhere to chr1, chr2, ...chrX notation For - modifying chromosome notation in bam files please follow + description: BAM/CRAM file, must adhere to chr1, chr2, ...chrX notation + For 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 +92,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 +102,9 @@ output: - "*BAF.txt": type: file description: BAF file - - cnvs: - - meta: + ontologies: [] + cnvs: + - - meta: type: map description: | Groovy Map containing sample information @@ -97,8 +112,9 @@ output: - "*cnvs.txt": type: file description: CNV file - - logrs: - - meta: + ontologies: [] + logrs: + - - meta: type: map description: | Groovy Map containing sample information @@ -106,8 +122,9 @@ output: - "*LogR.txt": type: file description: LogR file - - metrics: - - meta: + ontologies: [] + metrics: + - - meta: type: map description: | Groovy Map containing sample information @@ -116,8 +133,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 +144,9 @@ output: type: file description: ASCAT plots pattern: "*.{png}" - - purityploidy: - - meta: + ontologies: [] + purityploidy: + - - meta: type: map description: | Groovy Map containing sample information @@ -136,8 +155,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 +166,47 @@ 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_ascat: + - - ${task.process}: + type: string + description: The name of the process + - bioconductor-ascat: + type: string + description: The name of the tool + - Rscript -e "library(ASCAT); cat(as.character(packageVersion('ASCAT')))": + type: eval + description: The expression to obtain the version of the tool + versions_allelecounter: + - - ${task.process}: + type: string + description: The name of the process + - alleleCounter: + type: string + description: The name of the tool + - alleleCounter --version: + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - bioconductor-ascat: + type: string + description: The name of the tool + - Rscript -e "library(ASCAT); cat(as.character(packageVersion('ASCAT')))": + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - alleleCounter: + type: string + description: The name of the tool + - alleleCounter --version: + type: eval + description: The expression to obtain the version of the tool authors: - "@aasNGC" - "@lassefolkersen" diff --git a/modules/nf-core/goleft/indexcov/main.nf b/modules/nf-core/goleft/indexcov/main.nf index 5d0ed5dfb0..b9402734e4 100644 --- a/modules/nf-core/goleft/indexcov/main.nf +++ b/modules/nf-core/goleft/indexcov/main.nf @@ -3,23 +3,24 @@ process GOLEFT_INDEXCOV { label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/goleft:0.2.4--h9ee0642_1': - 'biocontainers/goleft:0.2.4--h9ee0642_1' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/goleft:0.2.4--h9ee0642_1' + : 'quay.io/biocontainers/goleft:0.2.4--h9ee0642_1'}" input: tuple val(meta), path(bams), path(indexes) tuple val(meta2), path(fai) output: - tuple val(meta), path("${prefix}/*") , emit: output - tuple val(meta), path("${prefix}/*ped") , emit: ped , optional: true - tuple val(meta), path("${prefix}/*bed.gz") , emit: bed , optional: true - tuple val(meta), path("${prefix}/*bed.gz.tbi"), emit: bed_index , optional: true - tuple val(meta), path("${prefix}/*roc") , emit: roc , optional: true - tuple val(meta), path("${prefix}/*html") , emit: html, optional: true - tuple val(meta), path("${prefix}/*png") , emit: png , optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}/*"), emit: output + tuple val(meta), path("${prefix}/*ped"), emit: ped, optional: true + tuple val(meta), path("${prefix}/*bed.gz"), emit: bed, optional: true + tuple val(meta), path("${prefix}/*bed.gz.tbi"), emit: bed_index, optional: true + tuple val(meta), path("${prefix}/*roc"), emit: roc, optional: true + tuple val(meta), path("${prefix}/*html"), emit: html, optional: true + tuple val(meta), path("${prefix}/*png"), emit: png, optional: true + tuple val("${task.process}"), val('goleft'), eval("goleft --version |& sed '1!d;s/^.*goleft Version: //'"), topic: versions, emit: versions_goleft + tuple val("${task.process}"), val('tabix'), eval("tabix -h |& sed -n 's/^.*Version: //p'"), topic: versions, emit: versions_tabix when: task.ext.when == null || task.ext.when @@ -28,38 +29,26 @@ process GOLEFT_INDEXCOV { def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" // indexcov uses BAM files or CRAI - def input_files = bams.findAll{it.name.endsWith(".bam")} + indexes.findAll{it.name.endsWith(".crai")} - def extranormalize = input_files.any{it.name.endsWith(".crai")} ? " --extranormalize " : "" + def input_files = bams.findAll {bam_file -> bam_file.name.endsWith(".bam") } + indexes.findAll {index_file -> index_file.name.endsWith(".crai") } + def extranormalize = input_files.any {input_file -> input_file.name.endsWith(".crai") } ? " --extranormalize " : "" """ goleft indexcov \\ --fai ${fai} \\ --directory ${prefix} \\ ${extranormalize} \\ - $args \\ + ${args} \\ ${input_files.join(" ")} if [ -f "${prefix}/${prefix}-indexcov.bed.gz" ] ; then - tabix -p bed "${prefix}/${prefix}-indexcov.bed.gz" + tabix -p bed ${prefix}/${prefix}-indexcov.bed.gz fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - goleft: \$(goleft --version 2>&1 | head -n 1 | sed 's/^.*goleft Version: //') - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS """ + stub: - def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" """ - mkdir "${prefix}" - echo "" | gzip > "${prefix}/${prefix}-indexcov.bed.gz" - touch "${prefix}/${prefix}-indexcov.bed.gz.tbi" - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - goleft: \$(goleft --version 2>&1 | head -n 1 | sed 's/^.*goleft Version: //') - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS + mkdir ${prefix} + echo "" | gzip > ${prefix}/${prefix}-indexcov.bed.gz + touch ${prefix}/${prefix}-indexcov.bed.gz.tbi """ } diff --git a/modules/nf-core/goleft/indexcov/meta.yml b/modules/nf-core/goleft/indexcov/meta.yml index 1619caf32d..b9165f9b6f 100644 --- a/modules/nf-core/goleft/indexcov/meta.yml +++ b/modules/nf-core/goleft/indexcov/meta.yml @@ -1,8 +1,7 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json name: "goleft_indexcov" -description: Quickly estimate coverage from a whole-genome bam or cram index. A bam - index has 16KB resolution so that's what this gives, but it provides what appears - to be a high-quality coverage estimate in seconds per genome. +description: Quickly estimate coverage from a whole-genome bam or cram index. A + bam index has 16KB resolution so that's what this gives, but it provides what + appears to be a high-quality coverage estimate in seconds per genome. keywords: - coverage - cnv @@ -16,7 +15,8 @@ tools: documentation: "https://github.com/brentp/goleft" tool_dev_url: "https://github.com/brentp/goleft" doi: "10.1093/gigascience/gix090" - licence: ["MIT"] + licence: + - "MIT" identifier: "" input: - - meta: @@ -28,10 +28,12 @@ input: type: file description: Sorted BAM/CRAM/SAM files pattern: "*.{bam,cram,sam}" + ontologies: [] - indexes: type: file description: BAI/CRAI files pattern: "*.{bai,crai}" + ontologies: [] - - meta2: type: map description: | @@ -41,9 +43,10 @@ input: type: file description: FASTA index pattern: "*.{fai}" + ontologies: [] output: - - output: - - meta: + output: + - - meta: type: map description: | Groovy Map containing sample information @@ -51,8 +54,9 @@ output: - ${prefix}/*: type: file description: Files generated by indexcov - - ped: - - meta: + ontologies: [] + ped: + - - meta: type: map description: | Groovy Map containing sample information @@ -61,8 +65,9 @@ output: type: file description: ped files pattern: "*ped" - - bed: - - meta: + ontologies: [] + bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -71,8 +76,10 @@ output: type: file description: bed files pattern: "*bed.gz" - - bed_index: - - meta: + ontologies: + - edam: http://edamontology.org/format_3989 # GZIP format + bed_index: + - - meta: type: map description: | Groovy Map containing sample information @@ -81,8 +88,9 @@ output: type: file description: bed index files pattern: "*bed.gz.tbi" - - roc: - - meta: + ontologies: [] + roc: + - - meta: type: map description: | Groovy Map containing sample information @@ -91,8 +99,9 @@ output: type: file description: roc files pattern: "*roc" - - html: - - meta: + ontologies: [] + html: + - - meta: type: map description: | Groovy Map containing sample information @@ -101,8 +110,9 @@ output: type: file description: html files pattern: "*html" - - png: - - meta: + ontologies: [] + png: + - - meta: type: map description: | Groovy Map containing sample information @@ -111,11 +121,47 @@ output: type: file description: png files pattern: "*png" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_goleft: + - - ${task.process}: + type: string + description: The name of the process + - goleft: + type: string + description: The name of the tool + - "goleft --version |& sed '1!d;s/^.*goleft Version: //'": + type: eval + description: The expression to obtain the version of the tool + versions_tabix: + - - ${task.process}: + type: string + description: The name of the process + - tabix: + type: string + description: The name of the tool + - "tabix -h |& sed -n 's/^.*Version: //p'": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - goleft: + type: string + description: The name of the tool + - "goleft --version |& sed '1!d;s/^.*goleft Version: //'": + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - tabix: + type: string + description: The name of the tool + - "tabix -h |& sed -n 's/^.*Version: //p'": + type: eval + description: The expression to obtain the version of the tool authors: - "@lindenb" maintainers: diff --git a/modules/nf-core/msisensor2/msi/main.nf b/modules/nf-core/msisensor2/msi/main.nf index a15e2f66e2..51ecda3ca2 100644 --- a/modules/nf-core/msisensor2/msi/main.nf +++ b/modules/nf-core/msisensor2/msi/main.nf @@ -3,19 +3,19 @@ process MSISENSOR2_MSI { label 'process_low' conda "${moduleDir}/environment.yml" - container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/msisensor2:0.1--hd03093a_0' : - 'biocontainers/msisensor2:0.1--hd03093a_0'}" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/msisensor2:0.1--hd03093a_0' + : 'quay.io/biocontainers/msisensor2:0.1--hd03093a_0'}" input: tuple val(meta), path(tumor_bam), path(tumor_bam_index) tuple val(meta2), path(models) output: - tuple val(meta), path("${prefix}"), emit: msi - tuple val(meta), path("${prefix}_dis"), emit: distribution - tuple val(meta), path("${prefix}_somatic"), emit: somatic - path "versions.yml", emit: versions + tuple val(meta), path("${prefix}"), emit: msi + tuple val(meta), path("${prefix}_dis"), emit: distribution + tuple val(meta), path("${prefix}_somatic"), emit: somatic + tuple val("${task.process}"), val('msisensor2'), eval("msisensor2 2> >(grep Version) | sed 's/Version: v//g'"), topic: versions, emit: versions_msisensor2 when: task.ext.when == null || task.ext.when @@ -30,11 +30,6 @@ process MSISENSOR2_MSI { -M ${models} \\ -t ${tumor_bam} \\ -o ${prefix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - msisensor2: \$(echo \$(msisensor2 2> >(grep Version) | sed 's/Version: v//g')) - END_VERSIONS """ stub: @@ -43,10 +38,5 @@ process MSISENSOR2_MSI { touch ${prefix} touch ${prefix}_dis touch ${prefix}_somatic - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - msisensor2: \$(echo \$(msisensor2 2> >(grep Version) | sed 's/Version: v//g')) - END_VERSIONS """ -} \ No newline at end of file +} diff --git a/modules/nf-core/msisensor2/msi/meta.yml b/modules/nf-core/msisensor2/msi/meta.yml index 9cece656ac..af03315190 100644 --- a/modules/nf-core/msisensor2/msi/meta.yml +++ b/modules/nf-core/msisensor2/msi/meta.yml @@ -16,7 +16,8 @@ tools: homepage: "https://github.com/niu-lab/msisensor2" documentation: "https://github.com/niu-lab/msisensor2/blob/master/README.md" tool_dev_url: "https://github.com/niu-lab/msisensor2" - license: ["GPL-3.0"] + license: + - "GPL-3.0" identifier: "" input: - - meta: @@ -76,13 +77,27 @@ output: type: file description: Somatic MSI regions detected. ontologies: [] + versions_msisensor2: + - - ${task.process}: + type: string + description: The name of the process + - msisensor2: + type: string + description: The name of the tool + - "msisensor2 2> >(grep Version) | sed 's/Version: v//g'": + 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 + - msisensor2: + type: string + description: The name of the tool + - "msisensor2 2> >(grep Version) | sed 's/Version: v//g'": + type: eval + description: The expression to obtain the version of the tool authors: - "@adamrtalbot" maintainers: diff --git a/modules/nf-core/msisensorpro/msisomatic/main.nf b/modules/nf-core/msisensorpro/msisomatic/main.nf index 41e8a04cfb..bee22f679c 100644 --- a/modules/nf-core/msisensorpro/msisomatic/main.nf +++ b/modules/nf-core/msisensorpro/msisomatic/main.nf @@ -3,9 +3,9 @@ process MSISENSORPRO_MSISOMATIC { label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/msisensor-pro%3A1.3.0--hfef96ef_0': - 'biocontainers/msisensor-pro:1.3.0--hfef96ef_0' }" + 'quay.io/biocontainers/msisensor-pro:1.3.0--hfef96ef_0' }" input: tuple val(meta), path(normal), path(normal_index), path(tumor), path(tumor_index), path(intervals) @@ -17,7 +17,7 @@ process MSISENSORPRO_MSISOMATIC { tuple val(meta), path("${prefix}_dis") , emit: output_dis tuple val(meta), path("${prefix}_germline"), emit: output_germline, optional: true tuple val(meta), path("${prefix}_somatic") , emit: output_somatic, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('msisensor-pro'), eval("msisensor-pro --version 2>&1 | sed -nE 's/Version:\\s*v//p'") , emit: versions_msisensorpro, topic: versions when: task.ext.when == null || task.ext.when @@ -39,11 +39,6 @@ process MSISENSORPRO_MSISOMATIC { -b ${task.cpus} \\ ${intervals_cmd} \\ ${args} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - msisensor-pro: \$(msisensor-pro 2>&1 | sed -nE 's/Version:\\sv([0-9]\\.[0-9])/\\1/ p') - END_VERSIONS """ stub: @@ -54,10 +49,5 @@ process MSISENSORPRO_MSISOMATIC { touch ${prefix}_dis touch ${prefix}_germline touch ${prefix}_somatic - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - msisensor-pro: \$(msisensor-pro 2>&1 | sed -nE 's/Version:\\sv([0-9]\\.[0-9])/\\1/ p') - END_VERSIONS """ } diff --git a/modules/nf-core/msisensorpro/msisomatic/meta.yml b/modules/nf-core/msisensorpro/msisomatic/meta.yml index 1c05e25e3c..26f91b00ee 100644 --- a/modules/nf-core/msisensorpro/msisomatic/meta.yml +++ b/modules/nf-core/msisensorpro/msisomatic/meta.yml @@ -1,7 +1,8 @@ name: msisensorpro_msisomatic -description: MSIsensor-pro evaluates Microsatellite Instability (MSI) for cancer patients - with next generation sequencing data. It accepts the whole genome sequencing, whole - exome sequencing and target region (panel) sequencing data as input +description: MSIsensor-pro evaluates Microsatellite Instability (MSI) for cancer + patients with next generation sequencing data. It accepts the whole genome + sequencing, whole exome sequencing and target region (panel) sequencing data + as input keywords: - micro-satellite-scan - msisensor-pro @@ -9,13 +10,14 @@ keywords: - somatic tools: - msisensorpro: - description: Microsatellite Instability (MSI) detection using high-throughput - sequencing data. + description: Microsatellite Instability (MSI) detection using + high-throughput sequencing data. homepage: https://github.com/xjtu-omics/msisensor-pro documentation: https://github.com/xjtu-omics/msisensor-pro/wiki tool_dev_url: https://github.com/xjtu-omics/msisensor-pro doi: "10.1016/j.gpb.2020.02.001" - licence: ["Custom Licence"] + licence: + - "Custom Licence" identifier: "" input: - - meta: @@ -72,8 +74,8 @@ output: e.g. [ id:'test', single_end:false ] - ${prefix}: type: file - description: File containing final report with all detected microsatellites, - unstable somatic microsatellites, msi score + description: File containing final report with all detected + microsatellites, unstable somatic microsatellites, msi score ontologies: [] output_dis: - - meta: @@ -105,13 +107,27 @@ output: type: file description: File containing somatic results ontologies: [] + versions_msisensorpro: + - - ${task.process}: + type: string + description: The name of the process + - msisensor-pro: + type: string + description: The name of the tool + - msisensor-pro --version 2>&1 | sed -nE 's/Version:\s*v//p': + 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 + - msisensor-pro: + type: string + description: The name of the tool + - msisensor-pro --version 2>&1 | sed -nE 's/Version:\s*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" maintainers: diff --git a/modules/nf-core/msisensorpro/scan/main.nf b/modules/nf-core/msisensorpro/scan/main.nf index 7ef4ae172c..8d2859d7ca 100644 --- a/modules/nf-core/msisensorpro/scan/main.nf +++ b/modules/nf-core/msisensorpro/scan/main.nf @@ -3,16 +3,16 @@ process MSISENSORPRO_SCAN { label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/msisensor-pro%3A1.3.0--hfef96ef_0': - 'biocontainers/msisensor-pro:1.3.0--hfef96ef_0' }" + 'quay.io/biocontainers/msisensor-pro:1.3.0--hfef96ef_0' }" input: tuple val(meta), path(fasta) output: tuple val(meta), path("*.list"), emit: list - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('msisensor-pro'), eval("msisensor-pro --version 2>&1 | sed -nE 's/Version:\\s*v//p'") , emit: versions_msisensorpro, topic: versions when: task.ext.when == null || task.ext.when @@ -26,21 +26,11 @@ process MSISENSORPRO_SCAN { -d $fasta \\ -o ${prefix}.msisensor_scan.list \\ $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - msisensor-pro: \$(msisensor-pro 2>&1 | sed -nE 's/Version:\\sv([0-9]\\.[0-9])/\\1/ p') - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.msisensor_scan.list - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - msisensor-pro: \$(msisensor-pro 2>&1 | sed -nE 's/Version:\\sv([0-9]\\.[0-9])/\\1/ p') - END_VERSIONS """ } diff --git a/modules/nf-core/msisensorpro/scan/meta.yml b/modules/nf-core/msisensorpro/scan/meta.yml index 2380922c21..c255d53297 100644 --- a/modules/nf-core/msisensorpro/scan/meta.yml +++ b/modules/nf-core/msisensorpro/scan/meta.yml @@ -1,20 +1,22 @@ name: msisensorpro_scan -description: MSIsensor-pro evaluates Microsatellite Instability (MSI) for cancer patients - with next generation sequencing data. It accepts the whole genome sequencing, whole - exome sequencing and target region (panel) sequencing data as input +description: MSIsensor-pro evaluates Microsatellite Instability (MSI) for cancer + patients with next generation sequencing data. It accepts the whole genome + sequencing, whole exome sequencing and target region (panel) sequencing data + as input keywords: - micro-satellite-scan - msisensor-pro - scan tools: - msisensorpro: - description: Microsatellite Instability (MSI) detection using high-throughput - sequencing data. + description: Microsatellite Instability (MSI) detection using + high-throughput sequencing data. homepage: https://github.com/xjtu-omics/msisensor-pro documentation: https://github.com/xjtu-omics/msisensor-pro/wiki tool_dev_url: https://github.com/xjtu-omics/msisensor-pro doi: "10.1016/j.gpb.2020.02.001" - licence: ["Custom Licence"] + licence: + - "Custom Licence" identifier: "" input: - - meta: @@ -39,13 +41,27 @@ output: description: File containing microsatellite list pattern: "*.{list}" ontologies: [] + versions_msisensorpro: + - - ${task.process}: + type: string + description: The name of the process + - msisensor-pro: + type: string + description: The name of the tool + - msisensor-pro --version 2>&1 | sed -nE 's/Version:\s*v//p': + 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 + - msisensor-pro: + type: string + description: The name of the tool + - msisensor-pro --version 2>&1 | sed -nE 's/Version:\s*v//p': + type: eval + description: The expression to obtain the version of the tool authors: - "@FriederikeHanssen" maintainers: diff --git a/subworkflows/local/bam_markduplicates/main.nf b/subworkflows/local/bam_markduplicates/main.nf index 2e770e732c..a5ca322259 100644 --- a/subworkflows/local/bam_markduplicates/main.nf +++ b/subworkflows/local/bam_markduplicates/main.nf @@ -15,7 +15,6 @@ workflow BAM_MARKDUPLICATES { intervals_bed_combined // channel: [optional] [ intervals_bed ] main: - versions = channel.empty() reports = channel.empty() // RUN MARKUPDUPLICATES @@ -36,12 +35,7 @@ workflow BAM_MARKDUPLICATES { reports = reports.mix(GATK4_MARKDUPLICATES.out.metrics) reports = reports.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.reports) - // Gather versions of all tools used - versions = versions.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.versions) - emit: alignment // channel: [ meta, file, index ] — BAM or CRAM reports - - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_markduplicates_spark/main.nf b/subworkflows/local/bam_markduplicates_spark/main.nf index 0c9172b706..a2883f3884 100644 --- a/subworkflows/local/bam_markduplicates_spark/main.nf +++ b/subworkflows/local/bam_markduplicates_spark/main.nf @@ -18,7 +18,6 @@ workflow BAM_MARKDUPLICATES_SPARK { intervals_bed_combined // channel: [optional] intervals_bed main: - versions = channel.empty() reports = channel.empty() // RUN MARKUPDUPLICATES SPARK @@ -41,12 +40,8 @@ workflow BAM_MARKDUPLICATES_SPARK { reports = reports.mix(GATK4_ESTIMATELIBRARYCOMPLEXITY.out.metrics) reports = reports.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.reports) - // Gather versions of all tools used - versions = versions.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.versions) emit: alignment // channel: [ meta, file, index ] — BAM or CRAM reports - - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_sentieon_dedup/main.nf b/subworkflows/local/bam_sentieon_dedup/main.nf index 151febcc39..1abe715464 100644 --- a/subworkflows/local/bam_sentieon_dedup/main.nf +++ b/subworkflows/local/bam_sentieon_dedup/main.nf @@ -13,7 +13,6 @@ workflow BAM_SENTIEON_DEDUP { intervals_bed_combined // channel: [optional] [ intervals_bed ] main: - versions = channel.empty() reports = channel.empty() bam = bam.map{ meta, bam_ -> [ meta - meta.subMap('data_type'), bam_ ] } @@ -38,12 +37,7 @@ workflow BAM_SENTIEON_DEDUP { reports = reports.mix(SENTIEON_DEDUP.out.score) reports = reports.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.reports) - // Gather versions of all tools used - versions = versions.mix(CRAM_QC_MOSDEPTH_SAMTOOLS.out.versions) - emit: alignment // channel: [ meta, file, index ] — BAM or CRAM reports - - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_variant_calling_indexcov/main.nf b/subworkflows/local/bam_variant_calling_indexcov/main.nf index 4255de91cc..59c261d10c 100644 --- a/subworkflows/local/bam_variant_calling_indexcov/main.nf +++ b/subworkflows/local/bam_variant_calling_indexcov/main.nf @@ -34,9 +34,6 @@ workflow BAM_VARIANT_CALLING_INDEXCOV { fasta_fai ) - versions = versions.mix(goleft_ch.versions) - - emit: out_indexcov = goleft_ch.output diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index 4ca65663ad..2c43feee40 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -83,7 +83,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { rt_file, ) - versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_ASCAT.out.versions) } // CONTROLFREEC @@ -201,7 +200,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { if (tools && tools.split(',').contains('msisensorpro')) { MSISENSORPRO_MSISOMATIC(cram.combine(intervals_bed_combined), fasta, msisensorpro_scan) - versions = versions.mix(MSISENSORPRO_MSISOMATIC.out.versions) out_msisensorpro = out_msisensorpro.mix(MSISENSORPRO_MSISOMATIC.out.output_report) } diff --git a/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf b/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf index f771726eed..015533444b 100644 --- a/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_ascat/main.nf @@ -19,12 +19,5 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ASCAT { main: - ch_versions = channel.empty() - ASCAT(cram_pair, allele_files, loci_files, intervals_bed, fasta, gc_file, rt_file) - - ch_versions = ch_versions.mix(ASCAT.out.versions) - - emit: - versions = ch_versions } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index 9b83123f0f..b72ffb0fea 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -126,7 +126,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { MSISENSOR2_MSI(bam, msisensor2_models) - versions = versions.mix(MSISENSOR2_MSI.out.versions) out_msisensor2 = out_msisensor2.mix(MSISENSOR2_MSI.out.distribution) out_msisensor2 = out_msisensor2.mix(MSISENSOR2_MSI.out.somatic) } diff --git a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf index d5a1371cb3..db88c83141 100644 --- a/subworkflows/local/cram_qc_mosdepth_samtools/main.nf +++ b/subworkflows/local/cram_qc_mosdepth_samtools/main.nf @@ -15,7 +15,6 @@ workflow CRAM_QC_MOSDEPTH_SAMTOOLS { intervals main: - versions = channel.empty() reports = channel.empty() // Reports run on cram @@ -30,5 +29,4 @@ workflow CRAM_QC_MOSDEPTH_SAMTOOLS { emit: reports - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/cram_sampleqc/main.nf b/subworkflows/local/cram_sampleqc/main.nf index 4ac78c2af8..1a36e6a89e 100644 --- a/subworkflows/local/cram_sampleqc/main.nf +++ b/subworkflows/local/cram_sampleqc/main.nf @@ -10,7 +10,6 @@ workflow CRAM_SAMPLEQC { intervals_for_preprocessing // channel: main: - versions = channel.empty() reports = channel.empty() if (!skip_baserecalibration) { @@ -24,9 +23,6 @@ workflow CRAM_SAMPLEQC { // Gather QC reports reports = CRAM_QC_RECAL.out.reports.collect { _meta, report -> report } - - // Gather used softwares versions - versions = versions.mix(CRAM_QC_RECAL.out.versions) } BAM_NGSCHECKMATE(cram.map { meta, cram_, _crai -> [meta, cram_] }, ngscheckmate_bed.map { bed -> [[id: "ngscheckmate"], bed] }, fasta_fai) @@ -38,5 +34,4 @@ workflow CRAM_SAMPLEQC { vcf = BAM_NGSCHECKMATE.out.vcf // channel: [ meta, vcf ] pdf = BAM_NGSCHECKMATE.out.pdf // channel: [ meta, pdf ] reports - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/fastq_preprocess_gatk/main.nf b/subworkflows/local/fastq_preprocess_gatk/main.nf index 6fdb2613ee..044dd0173e 100644 --- a/subworkflows/local/fastq_preprocess_gatk/main.nf +++ b/subworkflows/local/fastq_preprocess_gatk/main.nf @@ -63,7 +63,6 @@ workflow FASTQ_PREPROCESS_GATK { // To gather all QC reports for MultiQC reports = channel.empty() - versions = channel.empty() // PREPROCESSING @@ -95,8 +94,6 @@ workflow FASTQ_PREPROCESS_GATK { interleave_input) reads_for_fastp = CONVERT_FASTQ_UMI.out.reads - - // Gather used softwares versions } else { reads_for_fastp = input_fastq } @@ -236,8 +233,6 @@ workflow FASTQ_PREPROCESS_GATK { // Create CSV to restart from this step if (params.save_output_as_bam) CHANNEL_ALIGN_CREATE_CSV(BAM_MERGE_INDEX_SAMTOOLS.out.bam_bai, params.outdir, params.save_output_as_bam) else CHANNEL_ALIGN_CREATE_CSV(BAM_TO_CRAM_MAPPING.out.cram.join(BAM_TO_CRAM_MAPPING.out.crai, failOnDuplicate: true, failOnMismatch: true), params.outdir, params.save_output_as_bam) - - // Gather used softwares versions } } @@ -283,8 +278,6 @@ workflow FASTQ_PREPROCESS_GATK { // Gather QC reports reports = reports.mix(CRAM_QC_NO_MD.out.reports.collect{ _meta, report -> [ report ] }) - // Gather used softwares versions - versions = versions.mix(CRAM_QC_NO_MD.out.versions) } else if (params.use_gatk_spark && params.use_gatk_spark.contains('markduplicates')) { BAM_MARKDUPLICATES_SPARK( cram_for_markduplicates, @@ -297,8 +290,6 @@ workflow FASTQ_PREPROCESS_GATK { // Gather QC reports reports = reports.mix(BAM_MARKDUPLICATES_SPARK.out.reports.collect{ _meta, report -> [ report ] }) - // Gather used softwares versions - versions = versions.mix(BAM_MARKDUPLICATES_SPARK.out.versions) } else if (params.tools && params.tools.split(',').contains('sentieon_dedup')) { crai_for_markduplicates = params.step == 'mapping' ? bai_mapped @@ -315,8 +306,6 @@ workflow FASTQ_PREPROCESS_GATK { // Gather QC reports reports = reports.mix(BAM_SENTIEON_DEDUP.out.reports.collect{ _meta, report -> [ report ] }) - // Gather used softwares versions - versions = versions.mix(BAM_SENTIEON_DEDUP.out.versions) } else { BAM_MARKDUPLICATES( @@ -330,8 +319,6 @@ workflow FASTQ_PREPROCESS_GATK { // Gather QC reports reports = reports.mix(BAM_MARKDUPLICATES.out.reports.collect{ _meta, report -> [ report ] }) - // Gather used softwares versions - versions = versions.mix(BAM_MARKDUPLICATES.out.versions) } // ch_md_cram_for_restart contains either: @@ -389,8 +376,6 @@ workflow FASTQ_PREPROCESS_GATK { known_sites_indels_tbi) ch_table_bqsr_spark = BAM_BASERECALIBRATOR_SPARK.out.table_bqsr - - // Gather used softwares versions } else { BAM_BASERECALIBRATOR( @@ -403,8 +388,6 @@ workflow FASTQ_PREPROCESS_GATK { known_sites_indels_tbi) ch_table_bqsr_no_spark = BAM_BASERECALIBRATOR.out.table_bqsr - - // Gather used softwares versions } // ch_table_bqsr contains either: @@ -447,9 +430,6 @@ workflow FASTQ_PREPROCESS_GATK { intervals_and_num_intervals) cram_variant_calling_spark = BAM_APPLYBQSR_SPARK.out.alignment - - // Gather used softwares versions - } else { BAM_APPLYBQSR( @@ -460,8 +440,6 @@ workflow FASTQ_PREPROCESS_GATK { intervals_and_num_intervals) cram_variant_calling_no_spark = BAM_APPLYBQSR.out.alignment - - // Gather used softwares versions } cram_variant_calling = channel.empty().mix( @@ -486,6 +464,5 @@ workflow FASTQ_PREPROCESS_GATK { emit: cram_variant_calling reports - versions } diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index c52b73d911..9856373a6c 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -219,7 +219,6 @@ workflow PREPARE_GENOME { else if (tools.split(',').contains('msisensorpro')) { MSISENSORPRO_SCAN(fasta) msisensorpro_scan = MSISENSORPRO_SCAN.out.list.map { _meta, list -> [list] }.collect() - versions = versions.mix(MSISENSORPRO_SCAN.out.versions) } else { msisensorpro_scan = channel.value([]) diff --git a/tests/variant_calling_ascat.nf.test.snap b/tests/variant_calling_ascat.nf.test.snap index d2078a5658..ac5d21fc53 100644 --- a/tests/variant_calling_ascat.nf.test.snap +++ b/tests/variant_calling_ascat.nf.test.snap @@ -195,7 +195,7 @@ { "ASCAT": { "alleleCounter": "4.3.0", - "ascat": "3.2.0" + "bioconductor-ascat": "3.2.0" }, "MOSDEPTH": { "gzip": "1.14", @@ -347,7 +347,7 @@ { "ASCAT": { "alleleCounter": "4.3.0", - "ascat": "3.2.0" + "bioconductor-ascat": "3.2.0" }, "MOSDEPTH": { "gzip": "1.14", diff --git a/tests/variant_calling_msisensor2.nf.test.snap b/tests/variant_calling_msisensor2.nf.test.snap index db76dbf777..570a51c0f9 100644 --- a/tests/variant_calling_msisensor2.nf.test.snap +++ b/tests/variant_calling_msisensor2.nf.test.snap @@ -171,7 +171,7 @@ "mosdepth": "0.3.14" }, "MSISENSOR2_MSI": { - "msisensor2": 0.1 + "msisensor2": "0.1" }, "SAMTOOLS_STATS": { "samtools": "1.24" diff --git a/workflows/sarek.nf b/workflows/sarek.nf index da01b6bf97..5df7d648d1 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -246,9 +246,8 @@ workflow SAREK { cram_variant_calling = channel.empty() cram_variant_calling = cram_variant_calling.mix(FASTQ_PREPROCESS_GATK.out.cram_variant_calling) - // Gather used softwares versions + // Gather QC reports reports = reports.mix(FASTQ_PREPROCESS_GATK.out.reports) - versions = versions.mix(FASTQ_PREPROCESS_GATK.out.versions) } } @@ -272,7 +271,6 @@ workflow SAREK { ) reports = reports.mix(CRAM_SAMPLEQC.out.reports) - versions = versions.mix(CRAM_SAMPLEQC.out.versions) if (tools) { From aa42b5d538aa250f9e1bc32b5cee2333eefc65d9 Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Wed, 29 Jul 2026 10:18:21 +0200 Subject: [PATCH 19/27] chore(modules): migrate cnvkit/tabix modules to versions topic channel (#2243) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates `cnvkit/*` modules to the `versions` topic channel and updates tabix. Base: `dev`. ### Changes - Updates `cnvkit/{antitarget,batch,call,export,genemetrics,reference}` to their topic-channel versions. - Removes the corresponding `.out.versions` wiring. - Rewires `cnvkit/batch` for its new input signature: `fasta`+`fai` combined into one tuple; tumor/normal now carry index slots (`[]`, unused by the script — it indexes internally). - Tool bump: cnvkit 0.9.11 → 0.9.12. - Removes dead `versions` channel plumbing left behind by modules that had already moved to the topic channel via unrelated upstream syncs (`sentieon/*`, `bcftools/sort`, `bcftools/isec`, `bcftools/concat`, `ensemblvep/vep`, `snpsift/annmem`, `consensus_from_sites`), across `bam_joint_calling_germline_sentieon`, `bam_variant_calling_sentieon_dnascope`/`_haplotyper`, `bam_variant_calling_somatic_tnscope`/`_tumor_only_tnscope`, `vcf_consensus`, `vcf_annotate_all`, and `bam_variant_calling_tumor_only_all`. - Replaces the upstream-deprecated `tabix/tabix` and `tabix/bgziptabix` modules (both now `assert false` on any future module update) with `htslib/bgziptabix` across all 15 real call sites plus the vendored `vcf_annotate_snpeff` subworkflow. Test snapshots need regenerating in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 7 +- conf/base.config | 2 +- conf/modules/annotate.config | 6 +- conf/modules/freebayes.config | 2 + conf/modules/post_variant_calling.config | 2 +- conf/modules/prepare_genome.config | 6 + conf/modules/varlociraptor.config | 1 + main.nf | 2 - modules.json | 29 ++-- .../nf-core/cnvkit/antitarget/environment.yml | 2 +- modules/nf-core/cnvkit/antitarget/main.nf | 23 +-- modules/nf-core/cnvkit/antitarget/meta.yml | 32 ++++- modules/nf-core/cnvkit/batch/environment.yml | 6 +- modules/nf-core/cnvkit/batch/main.nf | 106 +++++++------- modules/nf-core/cnvkit/batch/meta.yml | 131 ++++++++++++++---- modules/nf-core/cnvkit/call/environment.yml | 2 +- modules/nf-core/cnvkit/call/main.nf | 30 ++-- modules/nf-core/cnvkit/call/meta.yml | 40 ++++-- modules/nf-core/cnvkit/export/environment.yml | 2 +- modules/nf-core/cnvkit/export/main.nf | 24 +--- modules/nf-core/cnvkit/export/meta.yml | 39 ++++-- .../cnvkit/genemetrics/environment.yml | 2 +- modules/nf-core/cnvkit/genemetrics/main.nf | 27 ++-- modules/nf-core/cnvkit/genemetrics/meta.yml | 47 ++++--- .../nf-core/cnvkit/reference/environment.yml | 2 +- modules/nf-core/cnvkit/reference/main.nf | 30 ++-- modules/nf-core/cnvkit/reference/meta.yml | 69 +++++---- .../bgziptabix/environment.yml | 4 +- modules/nf-core/htslib/bgziptabix/main.nf | 88 ++++++++++++ modules/nf-core/htslib/bgziptabix/meta.yml | 125 +++++++++++++++++ modules/nf-core/tabix/bgziptabix/main.nf | 40 ------ modules/nf-core/tabix/bgziptabix/meta.yml | 93 ------------- modules/nf-core/tabix/tabix/environment.yml | 8 -- modules/nf-core/tabix/tabix/main.nf | 45 ------ modules/nf-core/tabix/tabix/meta.yml | 63 --------- .../main.nf | 4 - .../local/bam_variant_calling_cnvkit/main.nf | 13 +- .../bam_variant_calling_freebayes/main.nf | 18 +-- .../bam_variant_calling_germline_all/main.nf | 8 -- .../main.nf | 3 - .../main.nf | 3 - .../bam_variant_calling_single_tiddit/main.nf | 8 +- .../bam_variant_calling_somatic_all/main.nf | 4 - .../main.nf | 3 - .../main.nf | 8 -- .../main.nf | 3 - .../local/post_variantcalling/main.nf | 3 - subworkflows/local/prepare_genome/main.nf | 44 +++--- .../prepare_genome/tests/bbsplit.nf.test | 12 +- subworkflows/local/prepare_intervals/main.nf | 14 +- .../local/prepare_reference_cnvkit/main.nf | 6 - subworkflows/local/vcf_annotate_all/main.nf | 2 - .../local/vcf_concatenate_germline/main.nf | 7 +- subworkflows/local/vcf_consensus/main.nf | 4 - subworkflows/local/vcf_normalization/main.nf | 6 +- .../local/vcf_varlociraptor_somatic/main.nf | 16 +-- .../nf-core/vcf_annotate_snpeff/main.nf | 18 ++- .../nf-core/vcf_annotate_snpeff/meta.yml | 2 +- tests/aligner-bwa-mem.nf.test.snap | 48 +++---- tests/aligner-bwa-mem2.nf.test.snap | 44 +++--- tests/aligner-dragmap.nf.test.snap | 44 +++--- tests/aligner-parabricks.nf.test.snap | 40 +++--- tests/alignment_from_everything.nf.test.snap | 8 +- tests/alignment_to_fastq.nf.test.snap | 8 +- tests/annotation_merge.nf.test.snap | 36 ++--- tests/bbsplit.nf.test.snap | 26 ++-- tests/default.nf.test.snap | 16 +-- tests/fastp.nf.test.snap | 24 ++-- tests/intervals.nf.test.snap | 58 ++++---- ...joint_calling_haplotypecaller.nf.test.snap | 16 +-- tests/joint_calling_mutect2.nf.test.snap | 18 +-- tests/lane_integer.nf.test.snap | 16 +-- tests/multi_lane.nf.test.snap | 26 ++-- tests/postprocess_concatenation.nf.test.snap | 18 +-- ...s_concatenation_normalization.nf.test.snap | 36 ++--- tests/postprocess_consensus.nf.test.snap | 36 ++--- tests/postprocess_filtering.nf.test.snap | 14 +- tests/postprocess_normalization.nf.test.snap | 18 +-- tests/postprocess_varlociraptor.nf.test.snap | 35 ++--- tests/qc_ngscheckmate.nf.test.snap | 16 +-- tests/save_mapped.nf.test.snap | 16 +-- tests/save_output_as_bam.nf.test.snap | 55 ++++---- tests/sentieon.nf.test.snap | 8 +- tests/sentieon_aligner_bwamem.nf.test.snap | 48 +++---- tests/sentieon_dedup.nf.test.snap | 48 +++---- tests/spark.nf.test.snap | 24 ++-- tests/start_from_markduplicates.nf.test.snap | 34 ++--- ...art_from_preparerecalibration.nf.test.snap | 50 +++---- tests/start_from_recalibration.nf.test.snap | 48 +++---- tests/tumor-normal-pair.nf.test.snap | 8 +- tests/umi_fastp.nf.test.snap | 8 +- tests/umi_fgbio.nf.test.snap | 8 +- tests/umi_in_read_names.nf.test.snap | 18 +-- tests/variant_calling_all.nf.test.snap | 95 +++++++------ tests/variant_calling_ascat.nf.test.snap | 16 +-- tests/variant_calling_cnvkit.nf.test.snap | 113 +++++++-------- .../variant_calling_controlfreec.nf.test.snap | 24 ++-- .../variant_calling_deepvariant.nf.test.snap | 26 ++-- tests/variant_calling_freebayes.nf.test.snap | 67 +++++---- ...riant_calling_haplotypecaller.nf.test.snap | 24 ++-- tests/variant_calling_lofreq.nf.test.snap | 12 +- tests/variant_calling_manta.nf.test.snap | 50 +++---- tests/variant_calling_mpileup.nf.test.snap | 24 ++-- tests/variant_calling_msisensor2.nf.test.snap | 26 ++-- .../variant_calling_msisensorpro.nf.test.snap | 26 ++-- tests/variant_calling_muse.nf.test.snap | 16 +-- tests/variant_calling_mutect2.nf.test.snap | 28 ++-- ...ant_calling_sentieon_dnascope.nf.test.snap | 30 ++-- ...ling_sentieon_haplotypecaller.nf.test.snap | 34 ++--- ...iant_calling_sentieon_tnscope.nf.test.snap | 60 ++++---- tests/variant_calling_strelka.nf.test.snap | 34 ++--- tests/variant_calling_strelka_bp.nf.test.snap | 12 +- tests/variant_calling_tiddit.nf.test.snap | 36 ++--- workflows/sarek.nf | 4 - 114 files changed, 1585 insertions(+), 1492 deletions(-) rename modules/nf-core/{tabix => htslib}/bgziptabix/environment.yml (77%) create mode 100644 modules/nf-core/htslib/bgziptabix/main.nf create mode 100644 modules/nf-core/htslib/bgziptabix/meta.yml delete mode 100644 modules/nf-core/tabix/bgziptabix/main.nf delete mode 100644 modules/nf-core/tabix/bgziptabix/meta.yml delete mode 100644 modules/nf-core/tabix/tabix/environment.yml delete mode 100644 modules/nf-core/tabix/tabix/main.nf delete mode 100644 modules/nf-core/tabix/tabix/meta.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index e5d006f4e3..b815a4a08f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2239](https://github.com/nf-core/sarek/pull/2239) - Migrate alignment/UMI/utility modules (`bwa`, `bwamem2`, `dragmap`, `fgbio`, `fastp`, `cat`, `gawk`, `gunzip`, `untar`, `unzip`, `spring`) to the versions topic channel (fastp 0.24.0 → 1.1.0) - [#2240](https://github.com/nf-core/sarek/pull/2240) - Migrate variant-calling modules (`freebayes`, `strelka`, `manta`, `tiddit`, `lofreq`, `svdb`, `vcflib`, `vcftools`) to the versions topic channel - [#2241](https://github.com/nf-core/sarek/pull/2241) - Migrate `samtools/*` and `mosdepth` modules to the versions topic channel -- [#2242](https://github.com/nf-core/sarek/pull/2242) - Migrate QC/coverage modules (`fastqc`, `ngscheckmate`, `goleft`, `msisensor2`, `msisensorpro`, `ascat`) to the versions topic channel +- [#2242](https://github.com/nf-core/sarek/pull/2242) - Migrate QC/coverage modules (`ascat`, `goleft`, `msisensor2`, `msisensorpro`) to the versions topic channel +- [#2243](https://github.com/nf-core/sarek/pull/2243) - Migrate `cnvkit/*` modules to the versions topic channel, and replace the deprecated `tabix/tabix`/`tabix/bgziptabix` modules with `htslib/bgziptabix` ### Fixed @@ -37,7 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | Dependency | Old version | New version | | ------------- | ----------- | ----------- | | bcftools | 1.21 | 1.23.1 | -| htslib | 1.21 | 1.23.1 | +| htslib | 1.21 | 1.24 | | varlociraptor | 8.9.3 | 8.9.5 | | ensembl-vep | 115.2 | 116.0 | | gatk4 | 4.6.1.0 | 4.6.2.0 | @@ -53,6 +54,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | vcftools | 0.1.16 | 0.1.17 | | samtools | 1.21 | 1.24 | | mosdepth | 0.3.10 | 0.3.14 | +| cnvkit | 0.9.11 | 0.9.12 | +| xz | - | 5.8.3 | ### Dependencies - plugins diff --git a/conf/base.config b/conf/base.config index 4e184eca9c..63d7104837 100644 --- a/conf/base.config +++ b/conf/base.config @@ -58,7 +58,7 @@ process { withLabel:process_high_memory { memory = { 200.GB * task.attempt } } - withName: 'UNZIP.*|UNTAR.*|TABIX.*|BUILD_INTERVALS|CREATE_INTERVALS_BED|VCFTOOLS|BCFTOOLS.*|SAMTOOLS_INDEX' { + withName: 'UNZIP.*|UNTAR.*|TABIX.*|HTSLIB_BGZIPTABIX|BUILD_INTERVALS|CREATE_INTERVALS_BED|VCFTOOLS|BCFTOOLS.*|SAMTOOLS_INDEX' { cpus = { 1 * task.attempt } memory = { 1.GB * task.attempt } } diff --git a/conf/modules/annotate.config b/conf/modules/annotate.config index 35a160b4d2..065baabb6e 100644 --- a/conf/modules/annotate.config +++ b/conf/modules/annotate.config @@ -109,8 +109,8 @@ process { } // ALL ANNOTATION TOOLS - withName: 'NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:.*:(TABIX_BGZIPTABIX|TABIX_TABIX)' { - ext.prefix = { input.name - '.vcf' } + withName: 'NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:.*:HTSLIB_BGZIPTABIX' { + ext.prefix = { infile.name - '.vcf' } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/annotation/${meta.variantcaller}/${meta.id}/" }, @@ -118,7 +118,7 @@ process { ] } - withName: 'NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_SNPEFF:TABIX_BGZIPTABIX' { + withName: 'NFCORE_SAREK:SAREK:VCF_ANNOTATE_ALL:VCF_ANNOTATE_SNPEFF:HTSLIB_BGZIPTABIX' { publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/annotation/${meta.variantcaller}/${meta.id}/" }, diff --git a/conf/modules/freebayes.config b/conf/modules/freebayes.config index 26deda7b42..3ada1ed988 100644 --- a/conf/modules/freebayes.config +++ b/conf/modules/freebayes.config @@ -45,6 +45,7 @@ process { } withName : 'TABIX_VC_FREEBAYES' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/freebayes/${meta.id}/" }, @@ -63,6 +64,7 @@ process { } withName: 'TABIX_VC_FREEBAYES_FILT' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/variant_calling/freebayes/${meta.id}/" }, diff --git a/conf/modules/post_variant_calling.config b/conf/modules/post_variant_calling.config index a42cefd668..c191b928ba 100644 --- a/conf/modules/post_variant_calling.config +++ b/conf/modules/post_variant_calling.config @@ -33,7 +33,7 @@ process { } withName: 'TABIX_EXT_VCF' { - ext.prefix = { "${input.baseName}" } + ext.prefix = { infile.baseName } publishDir = [ enabled: false ] } diff --git a/conf/modules/prepare_genome.config b/conf/modules/prepare_genome.config index cf045029f5..fd72505910 100644 --- a/conf/modules/prepare_genome.config +++ b/conf/modules/prepare_genome.config @@ -108,6 +108,7 @@ process { } withName: 'TABIX_BCFTOOLS_ANNOTATIONS' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/bcfann" }, @@ -117,6 +118,7 @@ process { } withName: 'TABIX_DBSNP' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/dbsnp" }, @@ -126,6 +128,7 @@ process { } withName: 'TABIX_GERMLINE_RESOURCE' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/germline_resource" }, @@ -135,6 +138,7 @@ process { } withName: 'TABIX_KNOWN_INDELS' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/known_indels" }, @@ -144,6 +148,7 @@ process { } withName: 'TABIX_KNOWN_SNPS' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/known_snps" }, @@ -153,6 +158,7 @@ process { } withName: 'TABIX_PON' { + ext.prefix = { infile.baseName } publishDir = [ mode: params.publish_dir_mode, path: { "${params.outdir}/reference/pon" }, diff --git a/conf/modules/varlociraptor.config b/conf/modules/varlociraptor.config index 575a2bf336..3b7dcbdfa7 100644 --- a/conf/modules/varlociraptor.config +++ b/conf/modules/varlociraptor.config @@ -136,6 +136,7 @@ process { } withName: '.*:VCF_VARLOCIRAPTOR_SOMATIC:TABIX_GERMLINE|.*:VCF_VARLOCIRAPTOR_SOMATIC:TABIX_SOMATIC' { + ext.prefix = { infile.baseName } publishDir = [ enabled: false ] diff --git a/main.nf b/main.nf index 2316687d8d..dadcb67358 100755 --- a/main.nf +++ b/main.nf @@ -160,14 +160,12 @@ workflow NFCORE_SAREK { else { PREPARE_REFERENCE_CNVKIT(PREPARE_GENOME.out.fasta, intervals_bed_combined) cnvkit_reference = PREPARE_REFERENCE_CNVKIT.out.cnvkit_reference - versions = versions.mix(PREPARE_REFERENCE_CNVKIT.out.versions) } } else { cnvkit_reference = channel.value([]) } // Gather used softwares versions - versions = versions.mix(PREPARE_GENOME.out.versions) versions = versions.mix(PREPARE_INTERVALS.out.versions) // Fails when consensus calling is specified without normalization diff --git a/modules.json b/modules.json index d8ee6235ab..4c47c23b6c 100644 --- a/modules.json +++ b/modules.json @@ -92,32 +92,32 @@ }, "cnvkit/antitarget": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "cnvkit/batch": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "cnvkit/call": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "cnvkit/export": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "cnvkit/genemetrics": { "branch": "master", - "git_sha": "81880787133db07d9b4c1febd152c090eb8325dc", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "cnvkit/reference": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, "controlfreec/assesssignificance": { @@ -346,6 +346,11 @@ "git_sha": "0902eac3012baaf4f9ab6513c8c55acc9353c96c", "installed_by": ["modules"] }, + "htslib/bgziptabix": { + "branch": "master", + "git_sha": "37f69c8ca3eb3d038a5d44f33a329e49f44bd4f2", + "installed_by": ["modules", "vcf_annotate_snpeff"] + }, "lofreq/callparallel": { "branch": "master", "git_sha": "9707facbacc9c5c02ecf0b192f0604a29351b00a", @@ -546,16 +551,6 @@ "git_sha": "6bc8ff03ace2cb373f683b9502ce79930c8a07f0", "installed_by": ["modules"] }, - "tabix/bgziptabix": { - "branch": "master", - "git_sha": "23004c9c64013c90b7d835621ef4cdeff19a1427", - "installed_by": ["modules", "vcf_annotate_snpeff"] - }, - "tabix/tabix": { - "branch": "master", - "git_sha": "f2cfcf9d3f6a2d123e6c44aefa788aa232204a7a", - "installed_by": ["modules"] - }, "tiddit/sv": { "branch": "master", "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", @@ -642,7 +637,7 @@ }, "vcf_annotate_snpeff": { "branch": "master", - "git_sha": "23004c9c64013c90b7d835621ef4cdeff19a1427", + "git_sha": "54e41f4ed3aead45054380a9befeb927612ffc91", "installed_by": ["subworkflows"] } } diff --git a/modules/nf-core/cnvkit/antitarget/environment.yml b/modules/nf-core/cnvkit/antitarget/environment.yml index 9b3082be06..9d97ecfab4 100644 --- a/modules/nf-core/cnvkit/antitarget/environment.yml +++ b/modules/nf-core/cnvkit/antitarget/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::cnvkit=0.9.11 + - bioconda::cnvkit=0.9.12 diff --git a/modules/nf-core/cnvkit/antitarget/main.nf b/modules/nf-core/cnvkit/antitarget/main.nf index 0c1f6674a4..7582338cac 100644 --- a/modules/nf-core/cnvkit/antitarget/main.nf +++ b/modules/nf-core/cnvkit/antitarget/main.nf @@ -1,18 +1,18 @@ process CNVKIT_ANTITARGET { - tag "$meta.id" + 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/cnvkit:0.9.11--pyhdfd78af_0': - 'biocontainers/cnvkit:0.9.11--pyhdfd78af_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.12--pyhdfd78af_0' + : 'quay.io/biocontainers/cnvkit:0.9.12--pyhdfd78af_0'}" input: tuple val(meta), path(targets) output: tuple val(meta), path("*.bed"), emit: bed - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('cnvkit'), eval('cnvkit.py version | sed -e "s/cnvkit v//g"'), emit: versions_cnvkit, topic: versions when: task.ext.when == null || task.ext.when @@ -24,13 +24,14 @@ process CNVKIT_ANTITARGET { """ cnvkit.py \\ antitarget \\ - $targets \\ + ${targets} \\ --output ${prefix}.antitarget.bed \\ - $args + ${args} + """ - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvkit: \$(cnvkit.py version | sed -e "s/cnvkit v//g") - END_VERSIONS + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.antitarget.bed """ } diff --git a/modules/nf-core/cnvkit/antitarget/meta.yml b/modules/nf-core/cnvkit/antitarget/meta.yml index 13f12a10c0..e50a5ffe35 100644 --- a/modules/nf-core/cnvkit/antitarget/meta.yml +++ b/modules/nf-core/cnvkit/antitarget/meta.yml @@ -26,9 +26,10 @@ input: type: file description: File containing genomic regions pattern: "*.{bed}" + ontologies: [] output: - - bed: - - meta: + bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -37,11 +38,28 @@ output: type: file description: File containing off-target regions pattern: "*.{bed}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_cnvkit: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool authors: - "@adamrtalbot" - "@priesgo" diff --git a/modules/nf-core/cnvkit/batch/environment.yml b/modules/nf-core/cnvkit/batch/environment.yml index a2466da99f..76271e4aa5 100644 --- a/modules/nf-core/cnvkit/batch/environment.yml +++ b/modules/nf-core/cnvkit/batch/environment.yml @@ -5,6 +5,6 @@ channels: - bioconda dependencies: - - bioconda::cnvkit=0.9.10 - - bioconda::htslib=1.17 - - bioconda::samtools=1.17 + - bioconda::cnvkit=0.9.12 + - bioconda::htslib=1.21 + - bioconda::samtools=1.21 diff --git a/modules/nf-core/cnvkit/batch/main.nf b/modules/nf-core/cnvkit/batch/main.nf index 9e8aafac65..d2a7dd5a02 100644 --- a/modules/nf-core/cnvkit/batch/main.nf +++ b/modules/nf-core/cnvkit/batch/main.nf @@ -1,19 +1,18 @@ process CNVKIT_BATCH { - tag "$meta.id" + 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/mulled-v2-780d630a9bb6a0ff2e7b6f730906fd703e40e98f:c94363856059151a2974dc501fb07a0360cc60a3-0' : - 'biocontainers/mulled-v2-780d630a9bb6a0ff2e7b6f730906fd703e40e98f:c94363856059151a2974dc501fb07a0360cc60a3-0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/3e/3e8542cdb0190cfe2cedd74f714f021a2ffa94be3ec2a5b95ff52610cb3e2c34/data' + : 'community.wave.seqera.io/library/cnvkit_htslib_samtools:86928c121163aca7'}" input: - tuple val(meta), path(tumor), path(normal) - tuple val(meta2), path(fasta) - tuple val(meta3), path(fasta_fai) + tuple val(meta), path(tumor), path(tumor_index), path(normal), path(normal_index) + tuple val(meta2), path(fasta), path(fasta_fai) tuple val(meta4), path(targets) tuple val(meta5), path(reference) - val panel_of_normals + val panel_of_normals output: tuple val(meta), path("*.bed"), emit: bed @@ -22,89 +21,100 @@ process CNVKIT_BATCH { tuple val(meta), path("*.cns"), emit: cns, optional: true tuple val(meta), path("*.pdf"), emit: pdf, optional: true tuple val(meta), path("*.png"), emit: png, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('cnvkit'), eval('cnvkit.py version | sed -e "s/cnvkit v//g"'), emit: versions_cnvkit, topic: 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 - script: def args = task.ext.args ?: '' - def tumor_exists = tumor ? true : false def normal_exists = normal ? true : false def reference_exists = reference ? true : false - - // execute samtools only when cram files are input, cnvkit runs natively on bam but is prohibitively slow + // execute samtools only when cram files are input, cnvkit runs natively on cram but is prohibitively slow def tumor_cram = tumor_exists && tumor.Extension == "cram" ? true : false def normal_cram = normal_exists && normal.Extension == "cram" ? true : false - def tumor_bam = tumor_exists && tumor.Extension == "bam" ? true : false - def normal_bam = normal_exists && normal.Extension == "bam" ? true : false def tumor_out = tumor_cram ? tumor.BaseName + ".bam" : "${tumor}" // tumor_only mode does not need fasta & target - // instead it requires a pre-computed reference.cnn which is built from fasta & target + // instead a pre-computed reference.cnn may be supplied which is built from fasta & target def (normal_out, normal_args, fasta_args) = ["", "", ""] def fai_reference = fasta_fai ? "--fai-reference ${fasta_fai}" : "" - if (normal_exists){ + if (normal_exists) { def normal_prefix = normal.BaseName normal_out = normal_cram ? "${normal_prefix}" + ".bam" : "${normal}" - fasta_args = fasta ? "--fasta $fasta" : "" + fasta_args = fasta ? "--fasta ${fasta}" : "" // germline mode // normal samples must be input without a flag // requires flag --normal to be empty [] - if(!tumor_exists){ + if (!tumor_exists) { tumor_out = "${normal_prefix}" + ".bam" normal_args = "--normal " } - // somatic mode else { - normal_args = normal_prefix ? "--normal $normal_out" : "" + normal_args = normal_prefix ? "--normal ${normal_out}" : "" } - if (reference_exists){ + if (reference_exists) { fasta_args = "" normal_args = "" } } - // generation of panel of normals def generate_pon = panel_of_normals ? true : false - if (generate_pon && !tumor_exists){ + if (generate_pon && !tumor_exists) { def pon_input = normal.join(' ') - normal_args = "--normal $pon_input" + normal_args = "--normal ${pon_input}" tumor_out = "" } - def target_args = targets && !reference_exists ? "--targets $targets" : "" - def reference_args = reference ? "--reference $reference" : "" + // tumor_only mode and no reference + // generate a "flat" reference which assumes equal coverage + // by passing '--normal' without any files + if (!reference_exists & !normal_exists & tumor_exists) { + normal_args = normal_args ?: "--normal" + } + + def target_args = targets && !reference_exists ? "--targets ${targets}" : "" + def reference_args = reference ? "--reference ${reference}" : "" def samtools_cram_convert = '' - samtools_cram_convert += normal_cram ? " samtools view -T $fasta $fai_reference $normal -@ $task.cpus -o $normal_out\n" : '' - samtools_cram_convert += normal_cram ? " samtools index $normal_out\n" : '' - samtools_cram_convert += tumor_cram ? " samtools view -T $fasta $fai_reference $tumor -@ $task.cpus -o $tumor_out\n" : '' - samtools_cram_convert += tumor_cram ? " samtools index $tumor_out\n" : '' - def versions = normal_cram || tumor_cram ? - "samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//')\n cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g')" : - "cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g')" + samtools_cram_convert += normal_cram ? " samtools view -T ${fasta} ${fai_reference} ${normal} -@ ${task.cpus} -o ${normal_out}\n" : '' + samtools_cram_convert += normal_cram ? " samtools index ${normal_out}\n" : '' + samtools_cram_convert += tumor_cram ? " samtools view -T ${fasta} ${fai_reference} ${tumor} -@ ${task.cpus} -o ${tumor_out}\n" : '' + samtools_cram_convert += tumor_cram ? " samtools index ${tumor_out}\n" : '' """ - $samtools_cram_convert - + ${samtools_cram_convert} cnvkit.py \\ batch \\ - $tumor_out \\ - $normal_args \\ - $fasta_args \\ - $reference_args \\ - $target_args \\ - --processes $task.cpus \\ - $args - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - ${versions} - END_VERSIONS + ${tumor_out} \\ + ${normal_args} \\ + ${fasta_args} \\ + ${reference_args} \\ + ${target_args} \\ + --processes ${task.cpus} \\ + ${args} + """ + stub: + def tumor_exists = tumor ? true : false + def reference_exists = reference ? true : false + // identify BED naming pattern + def bed_prefix = reference_exists ? reference.BaseName : targets ? targets.BaseName : "" + def bed_suffix = reference_exists ? "-tmp.bed" : ".bed" + // execute samtools only when cram files are input, cnvkit runs natively on cram but is prohibitively slow + def out_base_name = tumor_exists ? tumor.BaseName : normal.BaseName + """ + touch ${bed_prefix}.antitarget${bed_suffix} + touch ${bed_prefix}.target${bed_suffix} + touch "reference.cnn" + touch ${out_base_name}.antitargetcoverage.cnn + touch ${out_base_name}.bintest.cns + touch ${out_base_name}.call.cns + touch ${out_base_name}.cnr + touch ${out_base_name}.cns + touch ${out_base_name}.targetcoverage.cnn """ } diff --git a/modules/nf-core/cnvkit/batch/meta.yml b/modules/nf-core/cnvkit/batch/meta.yml index 30f7a1a29b..622f76af10 100644 --- a/modules/nf-core/cnvkit/batch/meta.yml +++ b/modules/nf-core/cnvkit/batch/meta.yml @@ -11,7 +11,8 @@ tools: CNVkit is a Python library and command-line software toolkit to infer and visualize copy number from high-throughput DNA sequencing data. It is designed for use with hybrid capture, including both whole-exome and custom target panels, and short-read sequencing platforms such as Illumina and Ion Torrent. homepage: https://cnvkit.readthedocs.io/en/stable/index.html documentation: https://cnvkit.readthedocs.io/en/stable/index.html - licence: ["Apache-2.0"] + licence: + - "Apache-2.0" identifier: biotools:cnvkit input: - - meta: @@ -23,10 +24,32 @@ input: type: file description: | Input tumour sample bam file (or cram) + pattern: "*.{bam,cram}" + ontologies: + - edam: http://edamontology.org/format_2572 # BAM + - edam: http://edamontology.org/format_3462 # CRAM + - tumor_index: + type: file + description: | + Input tumour sample bam/cram index file (only needed for bam input) + pattern: "*.{bai,crai}" + ontologies: + - edam: http://edamontology.org/format_3327 # BAI - normal: type: file description: | Input normal sample bam file (or cram) + pattern: "*.{bam,cram}" + ontologies: + - edam: http://edamontology.org/format_2572 # BAM + - edam: http://edamontology.org/format_3462 # CRAM + - normal_index: + type: file + description: | + Input normal sample bam/cram index file (only needed for bam input) + pattern: "*.{bai,crai}" + ontologies: + - edam: http://edamontology.org/format_3327 # BAI - - meta2: type: map description: | @@ -36,15 +59,15 @@ input: type: file description: | Input reference genome fasta file (only needed for cram_input and/or when normal_samples are provided) - - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'test' ] + pattern: "*.{fa,fasta}" + ontologies: + - edam: http://edamontology.org/format_1929 # FASTA - fasta_fai: type: file description: | Input reference genome fasta index (optional, but recommended for cram_input) + pattern: "*.{fai}" + ontologies: [] - - meta4: type: map description: | @@ -54,6 +77,9 @@ input: type: file description: | Input target bed file + pattern: "*.{bed}" + ontologies: + - edam: http://edamontology.org/format_3003 # BED - - meta5: type: map description: | @@ -63,13 +89,17 @@ input: type: file description: | Input reference cnn-file (only for germline and tumor-only running) - - - panel_of_normals: - type: file - description: | - Input panel of normals file + pattern: "*.{cnn}" + ontologies: [] + - panel_of_normals: + type: file + description: | + Input panel of normals file + pattern: "*.{cnn}" + ontologies: [] output: - - bed: - - meta: + bed: + - - meta: type: map description: | Groovy Map containing sample information @@ -78,8 +108,10 @@ output: type: file description: File containing genomic regions pattern: "*.{bed}" - - cnn: - - meta: + ontologies: + - edam: http://edamontology.org/format_3003 # BED + cnn: + - - meta: type: map description: | Groovy Map containing sample information @@ -88,8 +120,9 @@ output: type: file description: File containing coverage information pattern: "*.{cnn}" - - cnr: - - meta: + ontologies: [] + cnr: + - - meta: type: map description: | Groovy Map containing sample information @@ -98,8 +131,9 @@ output: type: file description: File containing copy number ratio information pattern: "*.{cnr}" - - cns: - - meta: + ontologies: [] + cns: + - - meta: type: map description: | Groovy Map containing sample information @@ -108,8 +142,9 @@ output: type: file description: File containing copy number segment information pattern: "*.{cns}" - - pdf: - - meta: + ontologies: [] + pdf: + - - meta: type: map description: | Groovy Map containing sample information @@ -118,21 +153,61 @@ output: type: file description: File with plot of copy numbers or segments on chromosomes pattern: "*.{pdf}" - - png: - - meta: + ontologies: + - edam: http://edamontology.org/format_3508 # PDF + png: + - - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - "*.png": type: file - description: File with plot of bin-level log2 coverages and segmentation calls + description: File with plot of bin-level log2 coverages and segmentation + calls pattern: "*.{png}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3603 # PNG + versions_cnvkit: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool + 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: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool + - - ${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: - "@adamrtalbot" - "@drpatelh" diff --git a/modules/nf-core/cnvkit/call/environment.yml b/modules/nf-core/cnvkit/call/environment.yml index 690d8fd7f7..9d97ecfab4 100644 --- a/modules/nf-core/cnvkit/call/environment.yml +++ b/modules/nf-core/cnvkit/call/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::cnvkit=0.9.10 + - bioconda::cnvkit=0.9.12 diff --git a/modules/nf-core/cnvkit/call/main.nf b/modules/nf-core/cnvkit/call/main.nf index 06d51e857e..161c3943a6 100644 --- a/modules/nf-core/cnvkit/call/main.nf +++ b/modules/nf-core/cnvkit/call/main.nf @@ -1,18 +1,18 @@ process CNVKIT_CALL { - tag "$meta.id" + 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/cnvkit:0.9.10--pyhdfd78af_0': - 'biocontainers/cnvkit:0.9.10--pyhdfd78af_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.12--pyhdfd78af_0' + : 'quay.io/biocontainers/cnvkit:0.9.12--pyhdfd78af_0'}" input: - tuple val(meta) , path(cns), path(vcf) + tuple val(meta), path(cns), path(vcf) output: tuple val(meta), path("*.cns"), emit: cns - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('cnvkit'), eval('cnvkit.py version | sed -e "s/cnvkit v//g"'), emit: versions_cnvkit, topic: versions when: task.ext.when == null || task.ext.when @@ -20,28 +20,18 @@ process CNVKIT_CALL { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def vcf_cmd = vcf ? "-v $vcf" : "" + def vcf_cmd = vcf ? "-v ${vcf}" : "" """ cnvkit.py call \\ - $cns \\ - $vcf_cmd \\ - $args \\ + ${cns} \\ + ${vcf_cmd} \\ + ${args} \\ -o ${prefix}.cns - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g') - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.cns - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g') - END_VERSIONS """ } diff --git a/modules/nf-core/cnvkit/call/meta.yml b/modules/nf-core/cnvkit/call/meta.yml index b3b4a4a78a..d33147e152 100644 --- a/modules/nf-core/cnvkit/call/meta.yml +++ b/modules/nf-core/cnvkit/call/meta.yml @@ -1,6 +1,6 @@ name: cnvkit_call -description: Given segmented log2 ratio estimates (.cns), derive each segment’s absolute - integer copy number +description: Given segmented log2 ratio estimates (.cns), derive each segment’s + absolute integer copy number keywords: - cnvkit - bam @@ -12,7 +12,8 @@ tools: CNVkit is a Python library and command-line software toolkit to infer and visualize copy number from high-throughput DNA sequencing data. It is designed for use with hybrid capture, including both whole-exome and custom target panels, and short-read sequencing platforms such as Illumina and Ion Torrent. homepage: https://cnvkit.readthedocs.io/en/stable/index.html documentation: https://cnvkit.readthedocs.io/en/stable/index.html - licence: ["Apache-2.0"] + licence: + - "Apache-2.0" identifier: biotools:cnvkit input: - - meta: @@ -24,13 +25,15 @@ input: type: file description: CNVKit CNS file. pattern: "*.cns" + ontologies: [] - vcf: type: file description: Germline VCF file for BAF. pattern: "*.vcf{,.gz}" + ontologies: [] output: - - cns: - - meta: + cns: + - - meta: type: map description: | Groovy Map containing sample information @@ -39,11 +42,28 @@ output: type: file description: CNS file. pattern: "*.cns" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_cnvkit: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool authors: - "@adamrtalbot" - "@priesgo" diff --git a/modules/nf-core/cnvkit/export/environment.yml b/modules/nf-core/cnvkit/export/environment.yml index 690d8fd7f7..9d97ecfab4 100644 --- a/modules/nf-core/cnvkit/export/environment.yml +++ b/modules/nf-core/cnvkit/export/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::cnvkit=0.9.10 + - bioconda::cnvkit=0.9.12 diff --git a/modules/nf-core/cnvkit/export/main.nf b/modules/nf-core/cnvkit/export/main.nf index d1d7d3415b..a36abe1047 100644 --- a/modules/nf-core/cnvkit/export/main.nf +++ b/modules/nf-core/cnvkit/export/main.nf @@ -1,18 +1,18 @@ process CNVKIT_EXPORT { - tag "$meta.id" + 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/cnvkit:0.9.10--pyhdfd78af_0': - 'biocontainers/cnvkit:0.9.10--pyhdfd78af_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.12--pyhdfd78af_0' + : 'quay.io/biocontainers/cnvkit:0.9.12--pyhdfd78af_0'}" input: tuple val(meta), path(cns) output: tuple val(meta), path("${prefix}.${suffix}"), emit: output - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('cnvkit'), eval('cnvkit.py version | sed -e "s/cnvkit v//g"'), emit: versions_cnvkit, topic: versions when: task.ext.when == null || task.ext.when @@ -23,14 +23,9 @@ process CNVKIT_EXPORT { suffix = task.ext.args.tokenize(" ")[0] """ cnvkit.py export \\ - $args \\ - $cns \\ + ${args} \\ + ${cns} \\ -o ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g') - END_VERSIONS """ stub: @@ -38,10 +33,5 @@ process CNVKIT_EXPORT { suffix = task.ext.args.tokenize(" ")[0] """ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvkit: \$(cnvkit.py version | sed -e 's/cnvkit v//g') - END_VERSIONS """ } diff --git a/modules/nf-core/cnvkit/export/meta.yml b/modules/nf-core/cnvkit/export/meta.yml index d37e41f98f..4d6441b985 100644 --- a/modules/nf-core/cnvkit/export/meta.yml +++ b/modules/nf-core/cnvkit/export/meta.yml @@ -1,6 +1,6 @@ name: cnvkit_export -description: Convert copy number ratio tables (.cnr files) or segments (.cns) to another - format. +description: Convert copy number ratio tables (.cnr files) or segments (.cns) to + another format. keywords: - cnvkit - copy number @@ -14,7 +14,8 @@ tools: target panels, and short-read sequencing platforms such as Illumina and Ion Torrent. homepage: https://cnvkit.readthedocs.io/en/stable/index.html documentation: https://cnvkit.readthedocs.io/en/stable/index.html - licence: ["Apache-2.0"] + licence: + - "Apache-2.0" identifier: biotools:cnvkit input: - - meta: @@ -26,9 +27,10 @@ input: type: file description: CNVKit CNS file. pattern: "*.cns" + ontologies: [] output: - - output: - - meta: + output: + - - meta: type: map description: | Groovy Map containing sample information @@ -36,11 +38,28 @@ output: - ${prefix}.${suffix}: type: file description: Output file - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: [] + versions_cnvkit: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool authors: - "@adamrtalbot" - "@priesgo" diff --git a/modules/nf-core/cnvkit/genemetrics/environment.yml b/modules/nf-core/cnvkit/genemetrics/environment.yml index 690d8fd7f7..9d97ecfab4 100644 --- a/modules/nf-core/cnvkit/genemetrics/environment.yml +++ b/modules/nf-core/cnvkit/genemetrics/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::cnvkit=0.9.10 + - bioconda::cnvkit=0.9.12 diff --git a/modules/nf-core/cnvkit/genemetrics/main.nf b/modules/nf-core/cnvkit/genemetrics/main.nf index 825b12bdac..252e36043f 100644 --- a/modules/nf-core/cnvkit/genemetrics/main.nf +++ b/modules/nf-core/cnvkit/genemetrics/main.nf @@ -1,19 +1,18 @@ process CNVKIT_GENEMETRICS { - tag "$meta.id" + 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/cnvkit:0.9.10--pyhdfd78af_0': - 'biocontainers/cnvkit:0.9.10--pyhdfd78af_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.12--pyhdfd78af_0' + : 'quay.io/biocontainers/cnvkit:0.9.12--pyhdfd78af_0'}" input: tuple val(meta), path(cnr), path(cns) output: tuple val(meta), path("*.tsv"), emit: tsv - //tuple val(meta), path("*.cnn"), emit: cnn - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('cnvkit'), eval('cnvkit.py version | sed -e "s/cnvkit v//g"'), emit: versions_cnvkit, topic: versions when: task.ext.when == null || task.ext.when @@ -26,14 +25,16 @@ process CNVKIT_GENEMETRICS { """ cnvkit.py \\ genemetrics \\ - $cnr \\ - $segments \\ + ${cnr} \\ + ${segments} \\ --output ${prefix}.tsv \\ - $args + ${args} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvkit: \$(cnvkit.py version | sed -e "s/cnvkit v//g") - END_VERSIONS + """ + touch ${prefix}.tsv """ } diff --git a/modules/nf-core/cnvkit/genemetrics/meta.yml b/modules/nf-core/cnvkit/genemetrics/meta.yml index 6b110accc2..34595e308e 100644 --- a/modules/nf-core/cnvkit/genemetrics/meta.yml +++ b/modules/nf-core/cnvkit/genemetrics/meta.yml @@ -11,7 +11,8 @@ tools: CNVkit is a Python library and command-line software toolkit to infer and visualize copy number from high-throughput DNA sequencing data. It is designed for use with hybrid capture, including both whole-exome and custom target panels, and short-read sequencing platforms such as Illumina and Ion Torrent. homepage: https://cnvkit.readthedocs.io/en/stable/index.html documentation: https://cnvkit.readthedocs.io/en/stable/index.html - licence: ["Apache-2.0"] + licence: + - "Apache-2.0" identifier: biotools:cnvkit input: - - meta: @@ -23,13 +24,15 @@ input: type: file description: CNR file pattern: "*.cnr" + ontologies: [] - cns: type: file description: CNS file [Optional] pattern: "*.cns" + ontologies: [] output: - - tsv: - - meta: + tsv: + - - meta: type: map description: | Groovy Map containing sample information @@ -38,21 +41,29 @@ output: type: file description: TSV file pattern: "*.tsv" - - cnn: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.cnn": - type: file - description: CNN file - pattern: "*.cnn" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + ontologies: + - edam: http://edamontology.org/format_3475 + versions_cnvkit: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool authors: - "@adamrtalbot" - "@marrip" diff --git a/modules/nf-core/cnvkit/reference/environment.yml b/modules/nf-core/cnvkit/reference/environment.yml index 9b3082be06..9d97ecfab4 100644 --- a/modules/nf-core/cnvkit/reference/environment.yml +++ b/modules/nf-core/cnvkit/reference/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::cnvkit=0.9.11 + - bioconda::cnvkit=0.9.12 diff --git a/modules/nf-core/cnvkit/reference/main.nf b/modules/nf-core/cnvkit/reference/main.nf index 857996f111..e1de0fffd7 100644 --- a/modules/nf-core/cnvkit/reference/main.nf +++ b/modules/nf-core/cnvkit/reference/main.nf @@ -1,11 +1,11 @@ process CNVKIT_REFERENCE { - tag "$fasta" + tag "${fasta}" label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.11--pyhdfd78af_0': - 'biocontainers/cnvkit:0.9.11--pyhdfd78af_0' }" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/cnvkit:0.9.12--pyhdfd78af_0' + : 'quay.io/biocontainers/cnvkit:0.9.12--pyhdfd78af_0'}" input: path fasta @@ -13,8 +13,8 @@ process CNVKIT_REFERENCE { path antitargets output: - path "*.cnn" , emit: cnn - path "versions.yml", emit: versions + path "*.cnn", emit: cnn + tuple val("${task.process}"), val('cnvkit'), eval('cnvkit.py version | sed -e "s/cnvkit v//g"'), emit: versions_cnvkit, topic: versions when: task.ext.when == null || task.ext.when @@ -26,15 +26,17 @@ process CNVKIT_REFERENCE { """ cnvkit.py \\ reference \\ - --fasta $fasta \\ - --targets $targets \\ - --antitargets $antitargets \\ + --fasta ${fasta} \\ + --targets ${targets} \\ + --antitargets ${antitargets} \\ --output ${prefix}.reference.cnn \\ - $args + ${args} + """ + + stub: + def prefix = task.ext.prefix ?: targets.BaseName - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cnvkit: \$(cnvkit.py version | sed -e "s/cnvkit v//g") - END_VERSIONS + """ + touch ${prefix}.reference.cnn """ } diff --git a/modules/nf-core/cnvkit/reference/meta.yml b/modules/nf-core/cnvkit/reference/meta.yml index 965a7b5795..87b124eb8a 100644 --- a/modules/nf-core/cnvkit/reference/meta.yml +++ b/modules/nf-core/cnvkit/reference/meta.yml @@ -14,33 +14,54 @@ tools: documentation: https://cnvkit.readthedocs.io/en/stable/index.html tool_dev_url: https://github.com/etal/cnvkit doi: 10.1371/journal.pcbi.1004873 - licence: ["Apache-2.0"] + licence: + - "Apache-2.0" identifier: biotools:cnvkit input: - - - fasta: - type: file - description: File containing reference genome - pattern: "*.{fasta}" - - - targets: - type: file - description: File containing genomic regions - pattern: "*.{bed}" - - - antitargets: - type: file - description: File containing off-target genomic regions - pattern: "*.{bed}" + - fasta: + type: file + description: File containing reference genome + pattern: "*.{fasta}" + ontologies: [] + - targets: + type: file + description: File containing genomic regions + pattern: "*.{bed}" + ontologies: [] + - antitargets: + type: file + description: File containing off-target genomic regions + pattern: "*.{bed}" + ontologies: [] output: - - cnn: - - "*.cnn": - type: file - description: File containing a copy-number reference (required for CNV calling - in tumor_only mode) - pattern: "*.{cnn}" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" + cnn: + - "*.cnn": + type: file + description: File containing a copy-number reference (required for CNV + calling in tumor_only mode) + pattern: "*.{cnn}" + ontologies: [] + versions_cnvkit: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - cnvkit: + type: string + description: The name of the tool + - 'cnvkit.py version | sed -e "s/cnvkit v//g"': + type: eval + description: The expression to obtain the version of the tool authors: - "@adamrtalbot" - "@priesgo" diff --git a/modules/nf-core/tabix/bgziptabix/environment.yml b/modules/nf-core/htslib/bgziptabix/environment.yml similarity index 77% rename from modules/nf-core/tabix/bgziptabix/environment.yml rename to modules/nf-core/htslib/bgziptabix/environment.yml index 771b138707..ec62c057d7 100644 --- a/modules/nf-core/tabix/bgziptabix/environment.yml +++ b/modules/nf-core/htslib/bgziptabix/environment.yml @@ -3,6 +3,6 @@ channels: - conda-forge - bioconda - dependencies: - - bioconda::htslib=1.21 + - bioconda::htslib=1.24 + - conda-forge::xz=5.8.3 diff --git a/modules/nf-core/htslib/bgziptabix/main.nf b/modules/nf-core/htslib/bgziptabix/main.nf new file mode 100644 index 0000000000..573c05fcdc --- /dev/null +++ b/modules/nf-core/htslib/bgziptabix/main.nf @@ -0,0 +1,88 @@ +process HTSLIB_BGZIPTABIX { + tag "${meta.id}" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${workflow.containerEngine in ['singularity', 'apptainer'] && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/86/863ca0dbbba30c8367fa4fbd3fa3a84393532fb7b300a5c5c2e70f0dfc475bbf/data' + : 'community.wave.seqera.io/library/htslib_xz:32f2772a564b3cd2'}" + + input: + tuple val(meta), path(infile), path(infile_tbi), path(regions) + val action + val make_index + val out_ext + + output: + tuple val(meta), path("${outfile}"), emit: output + tuple val(meta), path("${outfile}.{tbi,csi}"), emit: index, optional: true + // all htslib tools have the same version, we use bgzip + tuple val("${task.process}"), val('htslib'), eval("bgzip --version | sed '1! d; s/bgzip (htslib) //'"), topic: versions, emit: versions_htslib + tuple val("${task.process}"), val('xz'), eval("xz --version | sed '1! d; s/xz (XZ Utils) //'"), topic: versions, emit: versions_xz + + when: + task.ext.when == null || task.ext.when + + script: + def allowed_actions = ["compress", "decompress"] + if (action !in allowed_actions) { + error("htslib/bgziptabix: Invalid action: ${action}. Allowed actions are: ${allowed_actions.join(', ')}") + } + + if (action == "decompress" && make_index) { + log.warn("htslib/bgziptabix: Cannot create index when decompressing. Ignoring make_index option.") + } + + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + outfile = action == "compress" ? (out_ext ? "${prefix}.${out_ext}.gz" : "${prefix}.gz") : (out_ext ? "${prefix}.${out_ext}" : "${prefix}") + + def compress_cmd = action == "compress" ? "bgzip -c ${args} -@ ${task.cpus}" : "cat" + def bgzip_cmd = action == "compress" ? "[ '\$(basename ${infile})' != '\$(basename ${outfile})' ] && ln -s ${infile} ${outfile}" : "bgzip -c -d ${args} -@ ${task.cpus} ${infile} > ${outfile}" + + def regions_arg = regions ? "-R ${regions}" : "" + def tabix_cmd = (make_index && !infile_tbi) ? "tabix -@ ${task.cpus} ${regions_arg} ${args2} -f ${outfile}" : "" + def link_tabix_cmd = make_index && infile_tbi ? "ln -s ${infile_tbi} ${outfile}.${infile_tbi.extension}" : "" + def uncompressed_cmd = action == "compress" ? "${compress_cmd} ${infile} > ${outfile}" : (infile.getName() == outfile ? "" : "ln -s ${infile} ${outfile}") + """ + ${link_tabix_cmd} + + FILE_TYPE=\$(htsfile ${infile}) + + case "\$FILE_TYPE" in + *BGZF-compressed*) + ${bgzip_cmd} ;; + *gzip-compressed*) + [ "\$(basename ${infile})" == "\$(basename ${outfile})" ] && echo "Input and output names cannot be the same" && exit 1 + bgzip -d -c -@ ${task.cpus} ${infile} | ${compress_cmd} > ${outfile} ;; + *bzip2-compressed*) + bzcat ${infile} | ${compress_cmd} > ${outfile} ;; + *XZ-compressed*) + xzcat ${infile} | ${compress_cmd} > ${outfile} ;; + *) + ${uncompressed_cmd} ;; + esac + + ${tabix_cmd} + """ + + stub: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + outfile = action == "compress" ? (out_ext ? "${prefix}.${out_ext}.gz" : "${prefix}.gz") : (out_ext ? "${prefix}.${out_ext}" : "${prefix}") + + def touch_cmd = action == "compress" ? "echo | bgzip -c" : "echo" + def index_fmt = args2.contains('-C') ? 'csi' : 'tbi' + def tabix_cmd = make_index ? "touch ${outfile}.${index_fmt}" : "" + def link_tabix_cmd = make_index && infile_tbi ? "ln -s ${infile_tbi} ${outfile}.${infile_tbi.extension}" : "" + """ + echo ${args} + + ${touch_cmd} > ${outfile} + + ${tabix_cmd} + ${link_tabix_cmd} + """ +} diff --git a/modules/nf-core/htslib/bgziptabix/meta.yml b/modules/nf-core/htslib/bgziptabix/meta.yml new file mode 100644 index 0000000000..4cdefd0e16 --- /dev/null +++ b/modules/nf-core/htslib/bgziptabix/meta.yml @@ -0,0 +1,125 @@ +name: "htslib_bgziptabix" +description: "Multi-purpose module to compress, decompress and index files using bgzip + and tabix." +keywords: + - compress + - decompress + - index + - bgzip + - tabix + - gzip + - bzip + - xz +tools: + - "htslib": + description: "C library for high-throughput sequencing data formats." + homepage: "http://www.htslib.org/" + documentation: "http://www.htslib.org/doc/" + tool_dev_url: "https://github.com/samtools/htslib" + doi: "10.1093/gigascience/giab007" + licence: + - "MIT" + identifier: biotools:htslib +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - infile: + type: file + description: Input file to compress or decompress + pattern: "*" + ontologies: [] + - infile_tbi: + type: file + description: Optional tabix index for the input file. + pattern: "*.{tbi,csi}" + ontologies: + - edam: http://edamontology.org/format_3616 # tabix + - regions: + type: file + description: Optional file of regions to extract (BED or chr:start-end format). + Only used when creating an index for the output file. + pattern: "*.{bed,txt,tsv}" + ontologies: + - edam: http://edamontology.org/format_3475 # TSV + - edam: http://edamontology.org/format_3003 # BED + - action: + type: string + description: Action to perform, either `compress` or `decompress` + - make_index: + type: boolean + description: Whether to create a tabix index for the output file; only used + if `action` is `compress` + - out_ext: + type: string + description: Output file extension without `.gz` suffix (for example `vcf`) +output: + output: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - ${outfile}: + type: file + description: Compressed or decompressed output file + pattern: "*" + ontologies: [] + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - ${outfile}.{tbi,csi}: + type: file + description: Tabix index file for the compressed output file + pattern: "*.{tbi,csi}" + ontologies: + - edam: http://edamontology.org/format_3616 # tabix + versions_htslib: + - - ${task.process}: + type: string + description: The name of the process + - htslib: + type: string + description: The name of the tool + - bgzip --version | sed '1! d; s/bgzip (htslib) //': + type: eval + description: The expression to obtain the version of the tool + versions_xz: + - - ${task.process}: + type: string + description: The name of the process + - xz: + type: string + description: The name of the tool + - xz --version | sed '1! d; s/xz (XZ Utils) //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - htslib: + type: string + description: The name of the tool + - bgzip --version | sed '1! d; s/bgzip (htslib) //': + type: eval + description: The expression to obtain the version of the tool + - - ${task.process}: + type: string + description: The name of the process + - xz: + type: string + description: The name of the tool + - xz --version | sed '1! d; s/xz (XZ Utils) //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@itrujnara" +maintainers: + - "@itrujnara" diff --git a/modules/nf-core/tabix/bgziptabix/main.nf b/modules/nf-core/tabix/bgziptabix/main.nf deleted file mode 100644 index 30eae745fc..0000000000 --- a/modules/nf-core/tabix/bgziptabix/main.nf +++ /dev/null @@ -1,40 +0,0 @@ -process TABIX_BGZIPTABIX { - 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/92/92859404d861ae01afb87e2b789aebc71c0ab546397af890c7df74e4ee22c8dd/data' : - 'community.wave.seqera.io/library/htslib:1.21--ff8e28a189fbecaa' }" - - input: - tuple val(meta), path(input) - - output: - tuple val(meta), path("*.gz"), path("*.{tbi,csi}"), emit: gz_index - 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('bgzip'), eval("bgzip --version | sed '1!d;s/.* //'"), topic: versions, emit: versions_bgzip - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ - bgzip --threads ${task.cpus} -c $args $input > ${prefix}.${input.getExtension()}.gz - tabix --threads ${task.cpus} $args2 ${prefix}.${input.getExtension()}.gz - - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - def args2 = task.ext.args2 ?: '' - def index = args2.contains("-C ") || args2.contains("--csi") ? "csi" : "tbi" - """ - echo "" | gzip > ${prefix}.${input.getExtension()}.gz - touch ${prefix}.${input.getExtension()}.gz.${index} - - """ -} diff --git a/modules/nf-core/tabix/bgziptabix/meta.yml b/modules/nf-core/tabix/bgziptabix/meta.yml deleted file mode 100644 index 2a3078c55f..0000000000 --- a/modules/nf-core/tabix/bgziptabix/meta.yml +++ /dev/null @@ -1,93 +0,0 @@ -name: tabix_bgziptabix -description: bgzip a sorted tab-delimited genome file and then create tabix - index -keywords: - - bgzip - - compress - - index - - tabix - - vcf -tools: - - tabix: - description: Generic indexer for TAB-delimited genome position files. - homepage: https://www.htslib.org/doc/tabix.html - documentation: https://www.htslib.org/doc/tabix.1.html - doi: 10.1093/bioinformatics/btq671 - licence: ["MIT"] - identifier: biotools:tabix -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: - type: file - description: Sorted tab-delimited genome file - ontologies: [] -output: - gz_index: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.gz": - type: file - description: bgzipped tab-delimited genome file - pattern: "*.gz" - ontologies: - - edam: http://edamontology.org/format_3989 # GZIP format - - "*.{tbi,csi}": - type: file - description: Tabix index file (either tbi or csi) - pattern: "*.{tbi,csi}" - ontologies: [] - versions_tabix: - - - ${task.process}: - type: string - description: The process the versions were collected from - - 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_bgzip: - - - ${task.process}: - type: string - description: The process the versions were collected from - - bgzip: - type: string - description: The tool name - - bgzip --version | sed '1!d;s/.* //': - 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 - - 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 the versions were collected from - - bgzip: - type: string - description: The tool name - - bgzip --version | sed '1!d;s/.* //': - type: eval - description: The expression to obtain the version of the tool - -authors: - - "@maxulysse" - - "@DLBPointon" -maintainers: - - "@maxulysse" - - "@DLBPointon" diff --git a/modules/nf-core/tabix/tabix/environment.yml b/modules/nf-core/tabix/tabix/environment.yml deleted file mode 100644 index 771b138707..0000000000 --- a/modules/nf-core/tabix/tabix/environment.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda - -dependencies: - - bioconda::htslib=1.21 diff --git a/modules/nf-core/tabix/tabix/main.nf b/modules/nf-core/tabix/tabix/main.nf deleted file mode 100644 index 325b8bbff8..0000000000 --- a/modules/nf-core/tabix/tabix/main.nf +++ /dev/null @@ -1,45 +0,0 @@ -process TABIX_TABIX { - 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/92/92859404d861ae01afb87e2b789aebc71c0ab546397af890c7df74e4ee22c8dd/data' : - 'community.wave.seqera.io/library/htslib:1.21--ff8e28a189fbecaa' }" - - input: - tuple val(meta), path(tab) - - output: - tuple val(meta), path("*.tbi"), optional:true, emit: tbi - tuple val(meta), path("*.csi"), optional:true, emit: csi - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - """ - tabix \\ - --threads $task.cpus \\ - $args \\ - $tab - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS - """ - - stub: - """ - touch ${tab}.tbi - touch ${tab}.csi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/tabix/tabix/meta.yml b/modules/nf-core/tabix/tabix/meta.yml deleted file mode 100644 index c172968d87..0000000000 --- a/modules/nf-core/tabix/tabix/meta.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: tabix_tabix -description: create tabix index from a sorted bgzip tab-delimited genome file -keywords: - - index - - tabix - - vcf -tools: - - tabix: - description: Generic indexer for TAB-delimited genome position files. - homepage: https://www.htslib.org/doc/tabix.html - documentation: https://www.htslib.org/doc/tabix.1.html - doi: 10.1093/bioinformatics/btq671 - licence: ["MIT"] - identifier: biotools:tabix -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - tab: - type: file - description: TAB-delimited genome position file compressed with bgzip - pattern: "*.{bed.gz,gff.gz,sam.gz,vcf.gz}" - ontologies: [] -output: - tbi: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.tbi": - type: file - description: tabix index file - pattern: "*.{tbi}" - ontologies: [] - csi: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.csi": - type: file - description: coordinate sorted index file - pattern: "*.{csi}" - ontologies: [] - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML -authors: - - "@joseespinosa" - - "@drpatelh" - - "@maxulysse" -maintainers: - - "@joseespinosa" - - "@drpatelh" - - "@maxulysse" diff --git a/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf b/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf index a364876c6b..775aca85be 100644 --- a/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf +++ b/subworkflows/local/bam_joint_calling_germline_sentieon/main.nf @@ -30,8 +30,6 @@ workflow BAM_JOINT_CALLING_GERMLINE_SENTIEON { variant_caller main: - versions = channel.empty() - sentieon_input = input .map{ meta, gvcf, tbi, intervals -> [ [ id:'joint_variant_calling', intervals_name:intervals.baseName, num_intervals:meta.num_intervals ], gvcf, tbi, intervals ] } .groupTuple(by:[0, 3]) @@ -139,6 +137,4 @@ workflow BAM_JOINT_CALLING_GERMLINE_SENTIEON { emit: genotype_index // channel: [ val(meta), [ tbi ] ] genotype_vcf // channel: [ val(meta), [ vcf ] ] - - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_variant_calling_cnvkit/main.nf b/subworkflows/local/bam_variant_calling_cnvkit/main.nf index 2567f0042c..2e969a520a 100644 --- a/subworkflows/local/bam_variant_calling_cnvkit/main.nf +++ b/subworkflows/local/bam_variant_calling_cnvkit/main.nf @@ -18,10 +18,14 @@ workflow BAM_VARIANT_CALLING_CNVKIT { reference // channel: [optional] meta, cnn main: - versions = channel.empty() generate_pon = false - CNVKIT_BATCH(cram, fasta, fasta_fai, targets, reference, generate_pon) + // tumor/normal index slots are unused (CNVKIT_BATCH indexes CRAMs internally) + cram_input = cram.map { meta, tumor, normal -> [meta, tumor, [], normal, []] } + + fasta_input = fasta.combine(fasta_fai).map { meta, fasta_, _meta_fai, fasta_fai_ -> [meta, fasta_, fasta_fai_] } + + CNVKIT_BATCH(cram_input, fasta_input, targets, reference, generate_pon) // right now we do not use an input VCF to improve the calling of B alleles // based on SNV frequencies from the VCF file @@ -35,12 +39,7 @@ workflow BAM_VARIANT_CALLING_CNVKIT { ch_genemetrics = CNVKIT_BATCH.out.cnr.join(CNVKIT_BATCH.out.cns).map{ meta, cnr, cns -> [meta, cnr, cns[2]]} CNVKIT_GENEMETRICS(ch_genemetrics) - versions = versions.mix(CNVKIT_BATCH.out.versions) - versions = versions.mix(CNVKIT_GENEMETRICS.out.versions) - versions = versions.mix(CNVKIT_CALL.out.versions) - versions = versions.mix(CNVKIT_EXPORT.out.versions) emit: cnv_calls_raw = CNVKIT_CALL.out.cns // channel: [ meta, cns ] cnv_calls_export = CNVKIT_EXPORT.out.output // channel: [ meta, export_format ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_variant_calling_freebayes/main.nf b/subworkflows/local/bam_variant_calling_freebayes/main.nf index 9491697a8a..b859ade32d 100644 --- a/subworkflows/local/bam_variant_calling_freebayes/main.nf +++ b/subworkflows/local/bam_variant_calling_freebayes/main.nf @@ -7,8 +7,8 @@ include { BCFTOOLS_SORT } from '../../../modules/nf-core/bcftools/sort' include { FREEBAYES } from '../../../modules/nf-core/freebayes' include { GATK4_MERGEVCFS as MERGE_FREEBAYES } from '../../../modules/nf-core/gatk4/mergevcfs' -include { TABIX_TABIX as TABIX_VC_FREEBAYES } from '../../../modules/nf-core/tabix/tabix' -include { TABIX_TABIX as TABIX_VC_FREEBAYES_FILT } from '../../../modules/nf-core/tabix/tabix' +include { HTSLIB_BGZIPTABIX as TABIX_VC_FREEBAYES } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_VC_FREEBAYES_FILT } from '../../../modules/nf-core/htslib/bgziptabix' include { VCFLIB_VCFFILTER } from '../../../modules/nf-core/vcflib/vcffilter' workflow BAM_VARIANT_CALLING_FREEBAYES { @@ -20,8 +20,6 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { ch_intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = channel.empty() - // Combine cram and intervals for spread and gather strategy cram_intervals = ch_cram.combine(ch_intervals) // Move num_intervals to meta map and reorganize channel for FREEBAYES module @@ -43,7 +41,7 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { MERGE_FREEBAYES(vcf_to_merge, ch_dict) // Only when no_intervals - TABIX_VC_FREEBAYES(bcftools_vcf_out.no_intervals) + TABIX_VC_FREEBAYES(bcftools_vcf_out.no_intervals.map{ meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, '') // Mix intervals and no_intervals channels together, including the tabix index merged_vcf_with_tbi = MERGE_FREEBAYES.out.vcf @@ -51,7 +49,7 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { .map{ meta, vcf, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'freebayes' ], vcf, tbi ] } no_intervals_with_tbi = bcftools_vcf_out.no_intervals - .join(TABIX_VC_FREEBAYES.out.tbi, by: [0]) + .join(TABIX_VC_FREEBAYES.out.index, by: [0]) .map{ meta, vcf, tbi -> [ meta - meta.subMap('num_intervals') + [ variantcaller:'freebayes' ], vcf, tbi ] } // Final channel with VCF and its index @@ -62,16 +60,12 @@ workflow BAM_VARIANT_CALLING_FREEBAYES { vcf_filtered = VCFLIB_VCFFILTER.out.vcf // Index the filtered VCFs - TABIX_VC_FREEBAYES_FILT(vcf_filtered) - - versions = versions.mix(TABIX_VC_FREEBAYES.out.versions) - versions = versions.mix(TABIX_VC_FREEBAYES_FILT.out.versions) + TABIX_VC_FREEBAYES_FILT(vcf_filtered.map{ meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, '') emit: vcf_unfiltered = ch_vcf // channel: [ meta, vcf, tbi ] // Use the QUAL filtered vcfs for the next steps vcf = vcf_filtered // channel: [ meta, vcf ] - tbi = TABIX_VC_FREEBAYES_FILT.out.tbi // channel: [ meta, tbi ] - versions + tbi = TABIX_VC_FREEBAYES_FILT.out.index // channel: [ meta, tbi ] } diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index 1a1c7af1fc..abea346137 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -104,7 +104,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { intervals_bed_combined.map{_intervals -> _intervals ? [[id:_intervals[0].baseName], _intervals]: [[id:'no_intervals'], []]}, params.cnvkit_reference ? cnvkit_reference.map{ reference -> [[id:reference[0].baseName], reference] } : [[:],[]] ) - versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT.out.versions) } // DEEPVARIANT @@ -135,7 +134,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_freebayes = BAM_VARIANT_CALLING_FREEBAYES.out.vcf tbi_freebayes = BAM_VARIANT_CALLING_FREEBAYES.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_FREEBAYES.out.versions) } // HAPLOTYPECALLER @@ -231,8 +229,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { sentieon_dnascope_pcr_indel_model, sentieon_dnascope_model) - versions = versions.mix(BAM_VARIANT_CALLING_SENTIEON_DNASCOPE.out.versions) - vcf_sentieon_dnascope = BAM_VARIANT_CALLING_SENTIEON_DNASCOPE.out.vcf tbi_sentieon_dnascope = BAM_VARIANT_CALLING_SENTIEON_DNASCOPE.out.vcf_tbi gvcf_sentieon_dnascope = BAM_VARIANT_CALLING_SENTIEON_DNASCOPE.out.gvcf @@ -257,7 +253,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_sentieon_dnascope = BAM_JOINT_CALLING_GERMLINE_SENTIEON.out.genotype_vcf tbi_sentieon_dnascope = BAM_JOINT_CALLING_GERMLINE_SENTIEON.out.genotype_index - versions = versions.mix(BAM_JOINT_CALLING_GERMLINE_SENTIEON.out.versions) } else { // If single sample track, check if filtering should be done if (!(skip_tools && skip_tools.split(',').contains('dnascope_filter'))) { @@ -288,8 +283,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { joint_germline, sentieon_haplotyper_emit_mode) - versions = versions.mix(BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER.out.versions) - vcf_sentieon_haplotyper = BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER.out.vcf tbi_sentieon_haplotyper = BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER.out.vcf_tbi gvcf_sentieon_haplotyper = BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER.out.gvcf @@ -314,7 +307,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { vcf_sentieon_haplotyper = BAM_JOINT_CALLING_GERMLINE_SENTIEON.out.genotype_vcf tbi_sentieon_haplotyper = BAM_JOINT_CALLING_GERMLINE_SENTIEON.out.genotype_index - versions = versions.mix(BAM_JOINT_CALLING_GERMLINE_SENTIEON.out.versions) } else { // If single sample track, check if filtering should be done diff --git a/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf b/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf index 5c4fd80957..8e5901f198 100644 --- a/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf +++ b/subworkflows/local/bam_variant_calling_sentieon_dnascope/main.nf @@ -23,8 +23,6 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { sentieon_dnascope_model // channel main: - versions = channel.empty() - gvcf = channel.empty() vcf = channel.empty() genotype_intervals = channel.empty() @@ -143,7 +141,6 @@ workflow BAM_VARIANT_CALLING_SENTIEON_DNASCOPE { emit: - versions vcf vcf_tbi gvcf diff --git a/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf b/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf index f014af1740..6fea625118 100644 --- a/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf +++ b/subworkflows/local/bam_variant_calling_sentieon_haplotyper/main.nf @@ -21,8 +21,6 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { sentieon_haplotyper_emit_mode main: - versions = channel.empty() - gvcf = channel.empty() vcf = channel.empty() genotype_intervals = channel.empty() @@ -140,7 +138,6 @@ workflow BAM_VARIANT_CALLING_SENTIEON_HAPLOTYPER { emit: - versions vcf vcf_tbi gvcf diff --git a/subworkflows/local/bam_variant_calling_single_tiddit/main.nf b/subworkflows/local/bam_variant_calling_single_tiddit/main.nf index 001fabc257..ef5afcb7ab 100644 --- a/subworkflows/local/bam_variant_calling_single_tiddit/main.nf +++ b/subworkflows/local/bam_variant_calling_single_tiddit/main.nf @@ -4,7 +4,7 @@ // For all modules here: // A when clause condition is defined in the conf/modules.config to determine if the module should be run -include { TABIX_BGZIPTABIX as TABIX_BGZIP_TIDDIT_SV } from '../../../modules/nf-core/tabix/bgziptabix/main' +include { HTSLIB_BGZIPTABIX as TABIX_BGZIP_TIDDIT_SV } from '../../../modules/nf-core/htslib/bgziptabix/main' include { TIDDIT_SV } from '../../../modules/nf-core/tiddit/sv/main' workflow BAM_VARIANT_CALLING_SINGLE_TIDDIT { @@ -18,11 +18,11 @@ workflow BAM_VARIANT_CALLING_SINGLE_TIDDIT { TIDDIT_SV(cram, fasta.combine(fasta_fai).map { fasta_meta, fasta_path, _fai_meta, fai_path -> [ fasta_meta, fasta_path, fai_path ] }, bwa) - TABIX_BGZIP_TIDDIT_SV(TIDDIT_SV.out.vcf) + TABIX_BGZIP_TIDDIT_SV(TIDDIT_SV.out.vcf.map { meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, 'vcf') ploidy = TIDDIT_SV.out.ploidy - vcf = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, gz, _tbi -> [meta + [variantcaller: 'tiddit'], gz] } - tbi = TABIX_BGZIP_TIDDIT_SV.out.gz_index.map { meta, _gz, tbi -> [meta + [variantcaller: 'tiddit'], tbi] } + vcf = TABIX_BGZIP_TIDDIT_SV.out.output.join(TABIX_BGZIP_TIDDIT_SV.out.index).map { meta, gz, _tbi -> [meta + [variantcaller: 'tiddit'], gz] } + tbi = TABIX_BGZIP_TIDDIT_SV.out.output.join(TABIX_BGZIP_TIDDIT_SV.out.index).map { meta, _gz, tbi -> [meta + [variantcaller: 'tiddit'], tbi] } emit: ploidy diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index 2c43feee40..5d9a0210f7 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -132,8 +132,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { intervals_bed_combined.map { _intervals -> _intervals ? [[id: _intervals[0].baseName], _intervals] : [[id: 'no_intervals'], []] }, [[id: "null"], []], ) - - versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT.out.versions) } // FREEBAYES @@ -148,7 +146,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_freebayes = BAM_VARIANT_CALLING_FREEBAYES.out.vcf tbi_freebayes = BAM_VARIANT_CALLING_FREEBAYES.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_FREEBAYES.out.versions) } // MANTA @@ -262,7 +259,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { vcf_tnscope = BAM_VARIANT_CALLING_SOMATIC_TNSCOPE.out.vcf tbi_tnscope = BAM_VARIANT_CALLING_SOMATIC_TNSCOPE.out.index - versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_TNSCOPE.out.versions) } // TIDDIT diff --git a/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf b/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf index c66b1b9148..ea40562a63 100644 --- a/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_tnscope/main.nf @@ -19,8 +19,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_TNSCOPE { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = channel.empty() - // Combine input and intervals for spread and gather strategy input_intervals = input.combine(intervals) // Move num_intervals to meta map and reorganize channel for TNSCOPE module @@ -68,5 +66,4 @@ workflow BAM_VARIANT_CALLING_SOMATIC_TNSCOPE { emit: vcf // channel: [ meta, vcf ] index // channel: [ meta, index ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf index b72ffb0fea..8a0b92ec41 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_all/main.nf @@ -43,9 +43,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { main: // Channels are often remapped to match module/subworkflow - // Gather all versions - versions = channel.empty() - //TODO: Temporary until the if's can be removed and printing to terminal is prevented with "when" in the modules.config out_msisensor2 = channel.empty() vcf_freebayes = channel.empty() @@ -102,8 +99,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { [[id: "null"], []], cnvkit_reference.map { reference -> [[id: reference[0].baseName], reference] }, ) - - versions = versions.mix(BAM_VARIANT_CALLING_CNVKIT.out.versions) } // FREEBAYES @@ -118,7 +113,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { vcf_freebayes = BAM_VARIANT_CALLING_FREEBAYES.out.vcf tbi_freebayes = BAM_VARIANT_CALLING_FREEBAYES.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_FREEBAYES.out.versions) } // MSISENSOR @@ -209,7 +203,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { vcf_tnscope = BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE.out.vcf tbi_tnscope = BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE.out.tbi - versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE.out.versions) } vcf_all = channel.empty() @@ -252,5 +245,4 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_ALL { tbi_mutect2 tbi_tiddit tbi_tnscope - versions } diff --git a/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf b/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf index 0c233bad0e..9a8e69fece 100644 --- a/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf +++ b/subworkflows/local/bam_variant_calling_tumor_only_tnscope/main.nf @@ -19,8 +19,6 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE { intervals // channel: [mandatory] [ intervals, num_intervals ] or [ [], 0 ] if no intervals main: - versions = channel.empty() - // Combine input and intervals for spread and gather strategy input_intervals = input.combine(intervals) // Move num_intervals to meta map and reorganize channel for TNSCOPE module @@ -69,5 +67,4 @@ workflow BAM_VARIANT_CALLING_TUMOR_ONLY_TNSCOPE { vcf // channel: [ meta, vcf ] tbi = index // channel: [ meta, tbi ] index // channel: [ meta, index ] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/post_variantcalling/main.nf b/subworkflows/local/post_variantcalling/main.nf index 277bed9765..1dbfd3059c 100644 --- a/subworkflows/local/post_variantcalling/main.nf +++ b/subworkflows/local/post_variantcalling/main.nf @@ -56,7 +56,6 @@ workflow POST_VARIANTCALLING { vcfs = vcfs.mix(VCF_VARLOCIRAPTOR_SOMATIC.out.vcf) tbis = tbis.mix(VCF_VARLOCIRAPTOR_SOMATIC.out.tbi) - versions = versions.mix(VCF_VARLOCIRAPTOR_SOMATIC.out.versions) // TUMOR ONLY VCF_VARLOCIRAPTOR_TUMOR_ONLY(cram_tumor_only, fasta, fai, varlociraptor_scenario_tumor_only, tumor_only_vcfs, varlociraptor_chunk_size, 'tumor', varlociraptor_events_tumor_only, varlociraptor_fdr) @@ -147,8 +146,6 @@ workflow POST_VARIANTCALLING { // Mix consensus VCF with individual caller VCFs for downstream annotation small_variant_vcfs = consensus_vcfs.mix(individual_caller_vcfs) small_variant_tbis = consensus_tbis.mix(individual_caller_tbis) - - versions = versions.mix(CONSENSUS.out.versions) } vcfs = small_variant_vcfs.mix(all_vcfs.other) diff --git a/subworkflows/local/prepare_genome/main.nf b/subworkflows/local/prepare_genome/main.nf index 9856373a6c..7534e3bf24 100644 --- a/subworkflows/local/prepare_genome/main.nf +++ b/subworkflows/local/prepare_genome/main.nf @@ -5,12 +5,12 @@ include { DRAGMAP_HASHTABLE } from '../../../modules/nf- include { GATK4_CREATESEQUENCEDICTIONARY } from '../../../modules/nf-core/gatk4/createsequencedictionary' include { MSISENSORPRO_SCAN } from '../../../modules/nf-core/msisensorpro/scan' include { SAMTOOLS_FAIDX } from '../../../modules/nf-core/samtools/faidx' -include { TABIX_TABIX as TABIX_BCFTOOLS_ANNOTATIONS } from '../../../modules/nf-core/tabix/tabix' -include { TABIX_TABIX as TABIX_DBSNP } from '../../../modules/nf-core/tabix/tabix' -include { TABIX_TABIX as TABIX_GERMLINE_RESOURCE } from '../../../modules/nf-core/tabix/tabix' -include { TABIX_TABIX as TABIX_KNOWN_INDELS } from '../../../modules/nf-core/tabix/tabix' -include { TABIX_TABIX as TABIX_KNOWN_SNPS } from '../../../modules/nf-core/tabix/tabix' -include { TABIX_TABIX as TABIX_PON } from '../../../modules/nf-core/tabix/tabix' +include { HTSLIB_BGZIPTABIX as TABIX_BCFTOOLS_ANNOTATIONS } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_DBSNP } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_GERMLINE_RESOURCE } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_KNOWN_INDELS } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_KNOWN_SNPS } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_PON } from '../../../modules/nf-core/htslib/bgziptabix' include { UNTAR as UNTAR_BBSPLIT_INDEX } from '../../../modules/nf-core/untar' include { UNTAR as UNTAR_CHR_DIR } from '../../../modules/nf-core/untar' include { UNTAR as UNTAR_MSISENSOR2_MODELS } from '../../../modules/nf-core/untar' @@ -54,8 +54,6 @@ workflow PREPARE_GENOME { vep_include_fasta // params.vep_include_fasta main: - versions = channel.empty() - // TODO: EXTRACT FASTA FILE? fasta = fasta_in ? channel.fromPath(fasta_in).map { fasta -> [[id: fasta.baseName], fasta] }.collect() : channel.empty() vep_fasta = vep_include_fasta ? fasta : [[id: 'null'], []] @@ -144,8 +142,8 @@ workflow PREPARE_GENOME { bcftools_annotations_tbi = bcftools_annotations_tbi_in ? channel.fromPath(bcftools_annotations_tbi_in).collect() : channel.value([]) if (!bcftools_annotations_tbi_in && bcftools_annotations_in) { - TABIX_BCFTOOLS_ANNOTATIONS(bcftools_annotations.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) - bcftools_annotations_tbi = TABIX_BCFTOOLS_ANNOTATIONS.out.tbi.map { _meta, tbi -> [tbi] }.collect() + TABIX_BCFTOOLS_ANNOTATIONS(bcftools_annotations.flatten().map { vcf -> [[id: vcf.baseName], vcf, [], []] }, 'compress', true, '') + bcftools_annotations_tbi = TABIX_BCFTOOLS_ANNOTATIONS.out.index.map { _meta, tbi -> [tbi] }.collect() } @@ -153,45 +151,40 @@ workflow PREPARE_GENOME { dbsnp_tbi = dbsnp_tbi_in ? channel.fromPath(dbsnp_tbi_in).collect() : channel.value([]) if (!dbsnp_tbi_in && dbsnp_in && ((step == "mapping" || step == "markduplicates" || step == "prepare_recalibration") || (tools.split(',').contains('controlfreec') || tools.split(',').contains('haplotypecaller') || tools.split(',').contains('sentieon_haplotyper') || tools.split(',').contains('sentieon_dnascope') || tools.split(',').contains('muse') || tools.split(',').contains('mutect2')))) { - TABIX_DBSNP(dbsnp.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) - dbsnp_tbi = TABIX_DBSNP.out.tbi.map { _meta, tbi -> [tbi] }.collect() - versions = versions.mix(TABIX_DBSNP.out.versions) + TABIX_DBSNP(dbsnp.flatten().map { vcf -> [[id: vcf.baseName], vcf, [], []] }, 'compress', true, '') + dbsnp_tbi = TABIX_DBSNP.out.index.map { _meta, tbi -> [tbi] }.collect() } germline_resource = germline_resource_in ? channel.fromPath(germline_resource_in).collect() : channel.value([]) germline_resource_tbi = germline_resource_tbi_in ? channel.fromPath(germline_resource_tbi_in).collect() : channel.value([]) if (!germline_resource_tbi_in && germline_resource_in && (tools.split(',').contains('mutect2') || tools.split(',').contains('sentieon_tnscope'))) { - TABIX_GERMLINE_RESOURCE(germline_resource.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) - germline_resource_tbi = TABIX_GERMLINE_RESOURCE.out.tbi.map { _meta, tbi -> [tbi] }.collect() - versions = versions.mix(TABIX_GERMLINE_RESOURCE.out.versions) + TABIX_GERMLINE_RESOURCE(germline_resource.flatten().map { vcf -> [[id: vcf.baseName], vcf, [], []] }, 'compress', true, '') + germline_resource_tbi = TABIX_GERMLINE_RESOURCE.out.index.map { _meta, tbi -> [tbi] }.collect() } known_indels = known_indels_in ? channel.fromPath(known_indels_in).collect() : channel.value([]) known_indels_tbi = known_indels_tbi_in ? channel.fromPath(known_indels_tbi_in).collect() : channel.value([]) if (!known_indels_tbi_in && known_indels_in && (step == 'mapping' || step == "markduplicates" || step == 'prepare_recalibration' || (tools.split(',').contains('haplotypecaller') || tools.split(',').contains('sentieon_haplotyper') || tools.split(',').contains('sentieon_dnascope')))) { - TABIX_KNOWN_INDELS(known_indels.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) - known_indels_tbi = TABIX_KNOWN_INDELS.out.tbi.map { _meta, tbi -> [tbi] }.collect() - versions = versions.mix(TABIX_KNOWN_INDELS.out.versions) + TABIX_KNOWN_INDELS(known_indels.flatten().map { vcf -> [[id: vcf.baseName], vcf, [], []] }, 'compress', true, '') + known_indels_tbi = TABIX_KNOWN_INDELS.out.index.map { _meta, tbi -> [tbi] }.collect() } known_snps = known_snps_in ? channel.fromPath(known_snps_in).collect() : channel.value([]) known_snps_tbi = known_snps_tbi_in ? channel.fromPath(known_snps_tbi_in).collect() : channel.value([]) if (!known_snps_tbi_in && known_snps_in && (step == 'mapping' || step == "markduplicates" || step == 'prepare_recalibration' || (tools.split(',').contains('haplotypecaller') || tools.split(',').contains('sentieon_haplotyper')))) { - TABIX_KNOWN_SNPS(known_snps.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) - known_snps_tbi = TABIX_KNOWN_SNPS.out.tbi.map { _meta, tbi -> [tbi] }.collect() - versions = versions.mix(TABIX_KNOWN_SNPS.out.versions) + TABIX_KNOWN_SNPS(known_snps.flatten().map { vcf -> [[id: vcf.baseName], vcf, [], []] }, 'compress', true, '') + known_snps_tbi = TABIX_KNOWN_SNPS.out.index.map { _meta, tbi -> [tbi] }.collect() } pon = pon_in ? channel.fromPath(pon_in).collect() : channel.value([]) pon_tbi = pon_tbi_in ? channel.fromPath(pon_tbi_in).collect() : channel.value([]) if (!pon_tbi_in && pon_in && tools.split(',').contains('mutect2')) { - TABIX_PON(pon.flatten().map { vcf -> [[id: vcf.baseName], vcf] }) - pon_tbi = TABIX_PON.out.tbi.map { _meta, tbi -> [tbi] }.collect() - versions = versions.mix(TABIX_PON.out.versions) + TABIX_PON(pon.flatten().map { vcf -> [[id: vcf.baseName], vcf, [], []] }, 'compress', true, '') + pon_tbi = TABIX_PON.out.index.map { _meta, tbi -> [tbi] }.collect() } // known_sites is made by grouping both the dbsnp and the known snps/indels resources @@ -310,5 +303,4 @@ workflow PREPARE_GENOME { pon // Channel: [pon] pon_tbi // Channel: [pon_tbi] vep_fasta // Channel: [meta, vep_fasta] - versions // Channel: [versions.yml] } diff --git a/subworkflows/local/prepare_genome/tests/bbsplit.nf.test b/subworkflows/local/prepare_genome/tests/bbsplit.nf.test index 026ed1dd9c..34ca3976e8 100644 --- a/subworkflows/local/prepare_genome/tests/bbsplit.nf.test +++ b/subworkflows/local/prepare_genome/tests/bbsplit.nf.test @@ -58,8 +58,7 @@ nextflow_workflow { assertAll( { assert workflow.success}, { assert snapshot( - workflow.out.bbsplit_index, - workflow.out.versions + workflow.out.bbsplit_index ).match() } ) } @@ -171,8 +170,7 @@ nextflow_workflow { assertAll( { assert workflow.success }, { assert snapshot( - workflow.out.bbsplit_index, - workflow.out.versions + workflow.out.bbsplit_index ).match() } ) } @@ -230,8 +228,7 @@ nextflow_workflow { assertAll( { assert workflow.success }, { assert snapshot( - workflow.out.bbsplit_index, - workflow.out.versions + workflow.out.bbsplit_index ).match() } ) } @@ -292,8 +289,7 @@ nextflow_workflow { assertAll( { assert workflow.success }, { assert snapshot( - workflow.out.bbsplit_index, - workflow.out.versions + workflow.out.bbsplit_index ).match() } ) } diff --git a/subworkflows/local/prepare_intervals/main.nf b/subworkflows/local/prepare_intervals/main.nf index 55bf2e233a..d51d2b2728 100644 --- a/subworkflows/local/prepare_intervals/main.nf +++ b/subworkflows/local/prepare_intervals/main.nf @@ -9,8 +9,8 @@ include { CREATE_INTERVALS_BED } from '../../../modules/local/create_intervals_bed' include { GATK4_INTERVALLISTTOBED } from '../../../modules/nf-core/gatk4/intervallisttobed' include { GAWK as BUILD_INTERVALS } from '../../../modules/nf-core/gawk' -include { TABIX_BGZIPTABIX as TABIX_BGZIPTABIX_INTERVAL_SPLIT } from '../../../modules/nf-core/tabix/bgziptabix' -include { TABIX_BGZIPTABIX as TABIX_BGZIPTABIX_INTERVAL_COMBINED } from '../../../modules/nf-core/tabix/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_BGZIPTABIX_INTERVAL_SPLIT } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_BGZIPTABIX_INTERVAL_COMBINED } from '../../../modules/nf-core/htslib/bgziptabix' workflow PREPARE_INTERVALS { take: @@ -29,7 +29,7 @@ workflow PREPARE_INTERVALS { intervals_combined = channel.empty() // Single bed file containing all intervals if (no_intervals) { - file("${outdir}/no_intervals.bed").text = "no_intervals\n" + file("${outdir}/no_intervals.bed").text = "" file("${outdir}/no_intervals.bed.gz").text = "no_intervals\n" file("${outdir}/no_intervals.bed.gz.tbi").text = "no_intervals\n" @@ -88,18 +88,18 @@ workflow PREPARE_INTERVALS { .transpose() // 2. Create bed.gz and bed.gz.tbi for each interval file. They are split by region (see above) - TABIX_BGZIPTABIX_INTERVAL_SPLIT(intervals_bed.map{ file, _num_intervals -> [ [ id:file.baseName], file ] }) + TABIX_BGZIPTABIX_INTERVAL_SPLIT(intervals_bed.map{ file, _num_intervals -> [ [ id:file.baseName], file, [], [] ] }, 'compress', true, 'bed') - intervals_bed_gz_tbi = TABIX_BGZIPTABIX_INTERVAL_SPLIT.out.gz_index.map{ _meta, bed, tbi -> [ bed, tbi ] }.toList() + intervals_bed_gz_tbi = TABIX_BGZIPTABIX_INTERVAL_SPLIT.out.output.join(TABIX_BGZIPTABIX_INTERVAL_SPLIT.out.index).map{ _meta, bed, tbi -> [ bed, tbi ] }.toList() // Adding number of intervals as elements .map{ files -> [ files, files.size() ] } .transpose() } - TABIX_BGZIPTABIX_INTERVAL_COMBINED(intervals_combined) + TABIX_BGZIPTABIX_INTERVAL_COMBINED(intervals_combined.map{ meta, bed -> [ meta, bed, [], [] ] }, 'compress', true, 'bed') intervals_bed_combined = intervals_combined.map{_meta, bed -> bed }.collect() - intervals_bed_gz_tbi_combined = TABIX_BGZIPTABIX_INTERVAL_COMBINED.out.gz_index.map{_meta, gz, tbi -> [gz, tbi] }.collect() + intervals_bed_gz_tbi_combined = TABIX_BGZIPTABIX_INTERVAL_COMBINED.out.output.join(TABIX_BGZIPTABIX_INTERVAL_COMBINED.out.index).map{_meta, gz, tbi -> [gz, tbi] }.collect() emit: // Intervals split for parallel execution diff --git a/subworkflows/local/prepare_reference_cnvkit/main.nf b/subworkflows/local/prepare_reference_cnvkit/main.nf index 74b8b3694c..cf5b97b01f 100644 --- a/subworkflows/local/prepare_reference_cnvkit/main.nf +++ b/subworkflows/local/prepare_reference_cnvkit/main.nf @@ -7,16 +7,10 @@ workflow PREPARE_REFERENCE_CNVKIT { intervals_bed_combined // channel: [] main: - versions = channel.empty() - // prepare a antitarget reference files for tumor_only mode of cnvkit CNVKIT_ANTITARGET(intervals_bed_combined.flatten().map { bed -> [[id: 'intervals'], bed] }) CNVKIT_REFERENCE(fasta.map { _meta, fasta_ -> [fasta_] }, intervals_bed_combined, CNVKIT_ANTITARGET.out.bed.map { _meta, bed -> [bed] }) - versions = versions.mix(CNVKIT_ANTITARGET.out.versions) - versions = versions.mix(CNVKIT_REFERENCE.out.versions) - emit: cnvkit_reference = CNVKIT_REFERENCE.out.cnn.collect() - versions } diff --git a/subworkflows/local/vcf_annotate_all/main.nf b/subworkflows/local/vcf_annotate_all/main.nf index ea559ed6c0..e274499efd 100644 --- a/subworkflows/local/vcf_annotate_all/main.nf +++ b/subworkflows/local/vcf_annotate_all/main.nf @@ -30,7 +30,6 @@ workflow VCF_ANNOTATE_ALL { vcf_ann = channel.empty() tab_ann = channel.empty() json_ann = channel.empty() - versions = channel.empty() if (tools.split(',').contains('bcfann')) { BCFTOOLS_ANNOTATE( @@ -78,5 +77,4 @@ workflow VCF_ANNOTATE_ALL { vcf_ann // channel: [ val(meta), vcf.gz, vcf.gz.tbi ] tab_ann json_ann - versions // path: versions.yml } diff --git a/subworkflows/local/vcf_concatenate_germline/main.nf b/subworkflows/local/vcf_concatenate_germline/main.nf index 3c3010666f..db649fdaab 100644 --- a/subworkflows/local/vcf_concatenate_germline/main.nf +++ b/subworkflows/local/vcf_concatenate_germline/main.nf @@ -6,8 +6,7 @@ include { ADD_INFO_TO_VCF } from '../../../modules/local/add_info_to_vcf' include { BCFTOOLS_CONCAT as GERMLINE_VCFS_CONCAT } from '../../../modules/nf-core/bcftools/concat' include { BCFTOOLS_SORT as GERMLINE_VCFS_CONCAT_SORT } from '../../../modules/nf-core/bcftools/sort' -include { TABIX_BGZIPTABIX as TABIX_EXT_VCF } from '../../../modules/nf-core/tabix/bgziptabix' -include { TABIX_TABIX as TABIX_GERMLINE_VCFS_CONCAT_SORT } from '../../../modules/nf-core/tabix/tabix' +include { HTSLIB_BGZIPTABIX as TABIX_EXT_VCF } from '../../../modules/nf-core/htslib/bgziptabix' workflow CONCATENATE_GERMLINE_VCFS { take: @@ -18,10 +17,10 @@ workflow CONCATENATE_GERMLINE_VCFS { // Concatenate vcf-files ADD_INFO_TO_VCF(vcfs) - TABIX_EXT_VCF(ADD_INFO_TO_VCF.out.vcf) + TABIX_EXT_VCF(ADD_INFO_TO_VCF.out.vcf.map{ meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, 'vcf') // Gather vcfs and vcf-tbis for concatenating germline-vcfs - germline_vcfs_with_tbis = TABIX_EXT_VCF.out.gz_index.groupTuple() + germline_vcfs_with_tbis = TABIX_EXT_VCF.out.output.join(TABIX_EXT_VCF.out.index).groupTuple() GERMLINE_VCFS_CONCAT(germline_vcfs_with_tbis) GERMLINE_VCFS_CONCAT_SORT(GERMLINE_VCFS_CONCAT.out.vcf) diff --git a/subworkflows/local/vcf_consensus/main.nf b/subworkflows/local/vcf_consensus/main.nf index 8cedb412b2..933c692115 100644 --- a/subworkflows/local/vcf_consensus/main.nf +++ b/subworkflows/local/vcf_consensus/main.nf @@ -12,8 +12,6 @@ workflow CONSENSUS { vcfs // [meta, vcf ,tbi] main: - ch_versions = channel.empty() - ch_vcfs = vcfs .branch{ meta, _vcf, _tbi -> // Somatic Strelka samples have tumor_id field (tumor-normal pairs) @@ -68,11 +66,9 @@ workflow CONSENSUS { } // Create consensus VCF from sites.txt with caller presence info - // Versions are collected via topic channel CONSENSUS_FROM_SITES(ch_isec_with_results) emit: - versions = ch_versions vcfs = CONSENSUS_FROM_SITES.out.vcf tbis = CONSENSUS_FROM_SITES.out.tbi diff --git a/subworkflows/local/vcf_normalization/main.nf b/subworkflows/local/vcf_normalization/main.nf index 8878eeacd3..4c17cbe412 100644 --- a/subworkflows/local/vcf_normalization/main.nf +++ b/subworkflows/local/vcf_normalization/main.nf @@ -4,7 +4,7 @@ include { ADD_INFO_TO_VCF } from '../../../modules/local/add_info_to_vcf' include { BCFTOOLS_NORM as VCFS_NORM } from '../../../modules/nf-core/bcftools/norm' include { BCFTOOLS_SORT as VCFS_NORM_SORT } from '../../../modules/nf-core/bcftools/sort' -include { TABIX_BGZIPTABIX as TABIX_EXT_VCF } from '../../../modules/nf-core/tabix/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_EXT_VCF } from '../../../modules/nf-core/htslib/bgziptabix' // Workflow to normalize, compress, and index VCF files workflow NORMALIZE_VCFS { @@ -19,10 +19,10 @@ workflow NORMALIZE_VCFS { ADD_INFO_TO_VCF(vcfs) // Compress the VCF files with bgzip - TABIX_EXT_VCF(ADD_INFO_TO_VCF.out.vcf) + TABIX_EXT_VCF(ADD_INFO_TO_VCF.out.vcf.map{ meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, 'vcf') // Normalize the VCF files with BCFTOOLS_NORM - VCFS_NORM(TABIX_EXT_VCF.out.gz_index, fasta) + VCFS_NORM(TABIX_EXT_VCF.out.output.join(TABIX_EXT_VCF.out.index), fasta) // Sort the normalized VCF files VCFS_NORM_SORT(VCFS_NORM.out.vcf) diff --git a/subworkflows/local/vcf_varlociraptor_somatic/main.nf b/subworkflows/local/vcf_varlociraptor_somatic/main.nf index 7234a5d072..b43ff4dfa2 100644 --- a/subworkflows/local/vcf_varlociraptor_somatic/main.nf +++ b/subworkflows/local/vcf_varlociraptor_somatic/main.nf @@ -3,8 +3,8 @@ include { BCFTOOLS_CONCAT as CONCAT_SOMATIC_STRELKA include { BCFTOOLS_MERGE as MERGE_GERMLINE_SOMATIC_VCFS } from '../../../modules/nf-core/bcftools/merge' include { BCFTOOLS_SORT as SORT_CALLED_CHUNKS } from '../../../modules/nf-core/bcftools/sort' include { BCFTOOLS_SORT as SORT_FINAL_VCF } from '../../../modules/nf-core/bcftools/sort' -include { TABIX_TABIX as TABIX_GERMLINE } from '../../../modules/nf-core/tabix/tabix' -include { TABIX_TABIX as TABIX_SOMATIC } from '../../../modules/nf-core/tabix/tabix' +include { HTSLIB_BGZIPTABIX as TABIX_GERMLINE } from '../../../modules/nf-core/htslib/bgziptabix' +include { HTSLIB_BGZIPTABIX as TABIX_SOMATIC } from '../../../modules/nf-core/htslib/bgziptabix' include { RBT_VCFSPLIT } from '../../../modules/nf-core/rbt/vcfsplit' include { VARLOCIRAPTOR_CALLVARIANTS } from '../../../modules/nf-core/varlociraptor/callvariants' include { VARLOCIRAPTOR_ESTIMATEALIGNMENTPROPERTIES as ALIGNMENTPROPERTIES_NORMAL } from '../../../modules/nf-core/varlociraptor/estimatealignmentproperties' @@ -27,7 +27,6 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { val_fdr main: - ch_versions = channel.empty() meta_map = ch_cram.map { meta, _normal_cram, _normal_crai, _tumor_cram, _tumor_crai -> meta + [sex_string: (meta.sex == "XX" ? "female" : "male")] @@ -57,9 +56,8 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { // // CONCAT SNV AND INDEL VCFS FOR STRELKA // - TABIX_SOMATIC(ch_somatic_vcf) - ch_versions = ch_versions.mix(TABIX_SOMATIC.out.versions) - ch_somatic_vcf_tbi = ch_somatic_vcf.join(TABIX_SOMATIC.out.tbi, by: [0]) + TABIX_SOMATIC(ch_somatic_vcf.map{ meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, '') + ch_somatic_vcf_tbi = ch_somatic_vcf.join(TABIX_SOMATIC.out.index, by: [0]) // CONCAT SNV / INDEL VCFs COMING FROM STRELKA ch_somatic_branched = ch_somatic_vcf_tbi.branch { meta, _vcf, _tbi -> @@ -85,9 +83,8 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { // // MERGE GERMLINE AND SOMATIC VCFs // - TABIX_GERMLINE(ch_germline_vcf) - ch_versions = ch_versions.mix(TABIX_GERMLINE.out.versions) - ch_germline_vcf_tbi = ch_germline_vcf.join(TABIX_GERMLINE.out.tbi, by: [0]) + TABIX_GERMLINE(ch_germline_vcf.map{ meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, '') + ch_germline_vcf_tbi = ch_germline_vcf.join(TABIX_GERMLINE.out.index, by: [0]) def somatic_with_key = ch_somatic_vcf_conc.map { meta, vcf, tbi -> [[id: meta.normal_id, variantcaller: meta.variantcaller], meta, vcf, tbi] @@ -288,5 +285,4 @@ workflow VCF_VARLOCIRAPTOR_SOMATIC { emit: vcf = SORT_FINAL_VCF.out.vcf tbi = SORT_FINAL_VCF.out.index - versions = ch_versions } diff --git a/subworkflows/nf-core/vcf_annotate_snpeff/main.nf b/subworkflows/nf-core/vcf_annotate_snpeff/main.nf index 3eccc896f8..3ffe0ebf50 100644 --- a/subworkflows/nf-core/vcf_annotate_snpeff/main.nf +++ b/subworkflows/nf-core/vcf_annotate_snpeff/main.nf @@ -3,7 +3,7 @@ // include { SNPEFF_SNPEFF } from '../../../modules/nf-core/snpeff/snpeff' -include { TABIX_BGZIPTABIX } from '../../../modules/nf-core/tabix/bgziptabix' +include { HTSLIB_BGZIPTABIX } from '../../../modules/nf-core/htslib/bgziptabix' workflow VCF_ANNOTATE_SNPEFF { take: @@ -13,12 +13,20 @@ workflow VCF_ANNOTATE_SNPEFF { main: SNPEFF_SNPEFF(ch_vcf, val_snpeff_db, ch_snpeff_cache) - TABIX_BGZIPTABIX(SNPEFF_SNPEFF.out.vcf) + HTSLIB_BGZIPTABIX( + SNPEFF_SNPEFF.out.vcf.map { meta, vcf -> [ meta, vcf, [], [] ] }, + "compress", + true, + "vcf" + ) + ch_vcf_tbi = HTSLIB_BGZIPTABIX.out.output.join( + HTSLIB_BGZIPTABIX.out.index + ) emit: - vcf_tbi = TABIX_BGZIPTABIX.out.gz_index // channel: [ val(meta), path(vcf), path(tbi) ] - reports = SNPEFF_SNPEFF.out.report // channel: [ path(html) ] + vcf_tbi = ch_vcf_tbi // channel: [ val(meta), path(vcf), path(tbi) ] + reports = SNPEFF_SNPEFF.out.report // channel: [ path(html) ] summary = SNPEFF_SNPEFF.out.summary_html // channel: [ path(html) ] - genes_txt = SNPEFF_SNPEFF.out.genes_txt // channel: [ path(genes.txt) ] + genes_txt = SNPEFF_SNPEFF.out.genes_txt // channel: [ path(genes.txt) ] } diff --git a/subworkflows/nf-core/vcf_annotate_snpeff/meta.yml b/subworkflows/nf-core/vcf_annotate_snpeff/meta.yml index bf2db6523b..17aa43605d 100644 --- a/subworkflows/nf-core/vcf_annotate_snpeff/meta.yml +++ b/subworkflows/nf-core/vcf_annotate_snpeff/meta.yml @@ -8,7 +8,7 @@ keywords: components: - snpeff - snpeff/snpeff - - tabix/bgziptabix + - htslib/bgziptabix input: - ch_vcf: description: | diff --git a/tests/aligner-bwa-mem.nf.test.snap b/tests/aligner-bwa-mem.nf.test.snap index f450b48c78..bf60ddd9c9 100644 --- a/tests/aligner-bwa-mem.nf.test.snap +++ b/tests/aligner-bwa-mem.nf.test.snap @@ -26,12 +26,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -79,11 +79,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T14:28:32.64734047", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T18:55:05.917351813" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --aligner bwa-mem --save_reference --build_only_index -stub": { "content": [ @@ -99,12 +99,12 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -150,12 +150,12 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -193,11 +193,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-28T10:56:53.177914755", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.3" - }, - "timestamp": "2025-06-12T10:31:18.476995966" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --aligner bwa-mem --save_reference skip QC/recal/md -stub": { "content": [ @@ -226,12 +226,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/aligner-bwa-mem2.nf.test.snap b/tests/aligner-bwa-mem2.nf.test.snap index 5879c7efa9..50dfd96e4b 100644 --- a/tests/aligner-bwa-mem2.nf.test.snap +++ b/tests/aligner-bwa-mem2.nf.test.snap @@ -13,12 +13,12 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -56,10 +56,10 @@ "No VCF files", "No warnings" ], - "timestamp": "2025-06-12T10:35:55.383074123", + "timestamp": "2026-07-28T10:58:34.052160784", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.3" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --aligner bwa-mem2 --save_reference skip QC/recal/md": { @@ -89,12 +89,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -142,10 +142,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2025-12-15T18:58:41.317252772", + "timestamp": "2026-07-28T14:29:32.949195758", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --aligner bwa-mem2 --save_reference --build_only_index - stub": { @@ -162,12 +162,12 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -226,12 +226,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/aligner-dragmap.nf.test.snap b/tests/aligner-dragmap.nf.test.snap index 5a1f1fb712..2850663098 100644 --- a/tests/aligner-dragmap.nf.test.snap +++ b/tests/aligner-dragmap.nf.test.snap @@ -13,12 +13,12 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -61,10 +61,10 @@ "WARN: DragMap was specified as aligner. Base recalibration is not contained in --skip_tools. It is recommended to skip baserecalibration when using DragMap" ] ], - "timestamp": "2025-12-15T19:02:48.431048619", + "timestamp": "2026-07-28T10:58:04.077770914", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --aligner dragmap --save_reference skip QC/recal/md": { @@ -95,12 +95,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -151,10 +151,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2025-12-15T19:01:59.187593488", + "timestamp": "2026-07-28T14:28:21.866075734", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --aligner dragmap --save_reference --build_only_index - stub": { @@ -171,12 +171,12 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -232,12 +232,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/aligner-parabricks.nf.test.snap b/tests/aligner-parabricks.nf.test.snap index 9efe301a64..ff3cb07b10 100644 --- a/tests/aligner-parabricks.nf.test.snap +++ b/tests/aligner-parabricks.nf.test.snap @@ -35,12 +35,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -227,7 +227,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T11:40:10.237605568", + "timestamp": "2026-07-28T11:02:40.730776056", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -266,12 +266,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -464,7 +464,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T11:40:10.53055388", + "timestamp": "2026-07-28T11:04:20.26832985", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -521,12 +521,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -795,7 +795,7 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], - "timestamp": "2026-07-27T11:45:10.811937172", + "timestamp": "2026-07-28T11:09:24.032044733", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -831,12 +831,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -1027,7 +1027,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T11:44:05.461520368", + "timestamp": "2026-07-28T11:06:33.397663055", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/alignment_from_everything.nf.test.snap b/tests/alignment_from_everything.nf.test.snap index 0e37ebd638..71188a93a6 100644 --- a/tests/alignment_from_everything.nf.test.snap +++ b/tests/alignment_from_everything.nf.test.snap @@ -73,12 +73,12 @@ "spring": "1.1.1" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/alignment_to_fastq.nf.test.snap b/tests/alignment_to_fastq.nf.test.snap index a2a82b769a..f2698746b9 100644 --- a/tests/alignment_to_fastq.nf.test.snap +++ b/tests/alignment_to_fastq.nf.test.snap @@ -64,12 +64,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/annotation_merge.nf.test.snap b/tests/annotation_merge.nf.test.snap index 1c23b195ce..fe4b81e087 100644 --- a/tests/annotation_merge.nf.test.snap +++ b/tests/annotation_merge.nf.test.snap @@ -8,13 +8,13 @@ "perl-math-cdf": "0.1", "tabix": "1.23.1" }, + "HTSLIB_BGZIPTABIX": { + "htslib": "1.24", + "xz": "5.8.3" + }, "SNPEFF_SNPEFF": { "snpeff": "5.4c" }, - "TABIX_BGZIPTABIX": { - "bgzip": "1.21", - "tabix": "1.21" - }, "VCF_ANNOTATE_MERGE": { "ensemblvep": "116.0", "perl-math-cdf": "0.1", @@ -109,16 +109,20 @@ ], "No warnings" ], - "timestamp": "2026-07-08T10:14:04.788318141", + "timestamp": "2026-07-28T14:26:31.042408461", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.4" + "nextflow": "25.10.4" } }, "-profile test --tools merge,snpsift": { "content": [ 6, { + "HTSLIB_BGZIPTABIX": { + "htslib": "1.24", + "xz": "5.8.3" + }, "SNPEFF_SNPEFF": { "snpeff": "5.4c" }, @@ -128,10 +132,6 @@ "SNPSIFT_ANNMEMCREATE": { "snpsift": "5.4a" }, - "TABIX_BGZIPTABIX": { - "bgzip": "1.21", - "tabix": "1.21" - }, "VCF_ANNOTATE_MERGE": { "ensemblvep": "116.0", "perl-math-cdf": "0.1", @@ -220,23 +220,23 @@ ], "No warnings" ], - "timestamp": "2026-07-08T10:15:44.567611717", + "timestamp": "2026-07-28T14:26:19.448342505", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.4" + "nextflow": "25.10.4" } }, "-profile test --tools merge": { "content": [ 4, { + "HTSLIB_BGZIPTABIX": { + "htslib": "1.24", + "xz": "5.8.3" + }, "SNPEFF_SNPEFF": { "snpeff": "5.4c" }, - "TABIX_BGZIPTABIX": { - "bgzip": "1.21", - "tabix": "1.21" - }, "VCF_ANNOTATE_MERGE": { "ensemblvep": "116.0", "perl-math-cdf": "0.1", @@ -320,10 +320,10 @@ ], "No warnings" ], - "timestamp": "2026-07-08T10:12:53.660022078", + "timestamp": "2026-07-28T14:26:11.026803304", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.4" + "nextflow": "25.10.4" } } } \ No newline at end of file diff --git a/tests/bbsplit.nf.test.snap b/tests/bbsplit.nf.test.snap index f214e1b69d..c217a19737 100644 --- a/tests/bbsplit.nf.test.snap +++ b/tests/bbsplit.nf.test.snap @@ -52,12 +52,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -422,12 +422,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -647,12 +647,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -838,7 +838,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T10:25:04.052795149", + "timestamp": "2026-07-28T11:03:09.688943886", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index ab53f6469e..7fb6423efc 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -46,12 +46,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -379,12 +379,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/fastp.nf.test.snap b/tests/fastp.nf.test.snap index 9d642ce582..3e32ebea29 100644 --- a/tests/fastp.nf.test.snap +++ b/tests/fastp.nf.test.snap @@ -43,12 +43,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -407,12 +407,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -795,12 +795,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/intervals.nf.test.snap b/tests/intervals.nf.test.snap index 132408824a..96b94ed7c0 100644 --- a/tests/intervals.nf.test.snap +++ b/tests/intervals.nf.test.snap @@ -26,12 +26,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -77,10 +77,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2025-12-15T19:53:53.927423365", + "timestamp": "2026-07-28T14:27:36.729918989", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --intervals genome.multi_intervals.bed --tools null --skip_tools baserecalibrator,fastqc,markduplicates,mosdepth,multiqc,samtools": { @@ -107,12 +107,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -139,10 +139,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2025-12-15T19:51:26.151477364", + "timestamp": "2026-07-28T14:27:26.457705565", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --no_intervals --tools null --skip_tools baserecalibrator,fastqc,markduplicates,mosdepth,multiqc,samtools": { @@ -166,8 +166,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -197,10 +197,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2025-12-15T19:52:40.407831822", + "timestamp": "2026-07-28T14:27:48.805959532", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nf-test": "0.9.5", + "nextflow": "25.10.4" } }, "-profile test --no_intervals --tools null --skip_tools baserecalibrator,fastqc,markduplicates,mosdepth,multiqc,samtools -stub": { @@ -224,8 +224,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -280,12 +280,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -340,12 +340,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/joint_calling_haplotypecaller.nf.test.snap b/tests/joint_calling_haplotypecaller.nf.test.snap index d6cf847b4b..df9ffd5934 100644 --- a/tests/joint_calling_haplotypecaller.nf.test.snap +++ b/tests/joint_calling_haplotypecaller.nf.test.snap @@ -35,12 +35,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -288,12 +288,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/joint_calling_mutect2.nf.test.snap b/tests/joint_calling_mutect2.nf.test.snap index 88da7e4892..fc9d9ef0df 100644 --- a/tests/joint_calling_mutect2.nf.test.snap +++ b/tests/joint_calling_mutect2.nf.test.snap @@ -26,12 +26,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -231,7 +231,7 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], - "timestamp": "2026-07-27T10:33:51.065452986", + "timestamp": "2026-07-28T11:15:22.037134015", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -267,12 +267,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/lane_integer.nf.test.snap b/tests/lane_integer.nf.test.snap index b2462b19ff..0985055691 100644 --- a/tests/lane_integer.nf.test.snap +++ b/tests/lane_integer.nf.test.snap @@ -26,12 +26,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -58,10 +58,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T11:00:59.301728305", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T20:43:47.875976457" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/multi_lane.nf.test.snap b/tests/multi_lane.nf.test.snap index 4a53664d79..b1884c7ebc 100644 --- a/tests/multi_lane.nf.test.snap +++ b/tests/multi_lane.nf.test.snap @@ -39,12 +39,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -108,11 +108,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T14:38:33.629293529", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-03-06T18:03:04.332516" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/fastq_umi_multi_lane.csv --umi_read_structure '+T 7M1S+T' --skip_tools baserecalibrator,fastqc,markduplicates,mosdepth,multiqc,samtools --tools null": { "content": [ @@ -178,12 +178,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -223,7 +223,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_umi_cleanname_1.fastq.gz): Cannot extract flowcell ID from @922332" ] ], - "timestamp": "2026-07-27T10:26:26.437520414", + "timestamp": "2026-07-28T11:04:32.774305241", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/postprocess_concatenation.nf.test.snap b/tests/postprocess_concatenation.nf.test.snap index 6874962f23..2061b3f3e3 100644 --- a/tests/postprocess_concatenation.nf.test.snap +++ b/tests/postprocess_concatenation.nf.test.snap @@ -38,22 +38,24 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_EXT_VCF": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" diff --git a/tests/postprocess_concatenation_normalization.nf.test.snap b/tests/postprocess_concatenation_normalization.nf.test.snap index fe3dcb3881..ef58b88808 100644 --- a/tests/postprocess_concatenation_normalization.nf.test.snap +++ b/tests/postprocess_concatenation_normalization.nf.test.snap @@ -41,22 +41,24 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_EXT_VCF": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" @@ -376,22 +378,24 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_EXT_VCF": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" diff --git a/tests/postprocess_consensus.nf.test.snap b/tests/postprocess_consensus.nf.test.snap index dc5a270f5d..0008465822 100644 --- a/tests/postprocess_consensus.nf.test.snap +++ b/tests/postprocess_consensus.nf.test.snap @@ -51,16 +51,16 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_EXT_VCF": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFS_NORM": { "bcftools": "1.23.1" @@ -421,16 +421,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_EXT_VCF": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFS_NORM": { "bcftools": "1.23.1" @@ -757,16 +757,16 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_EXT_VCF": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFS_NORM": { "bcftools": "1.23.1" diff --git a/tests/postprocess_filtering.nf.test.snap b/tests/postprocess_filtering.nf.test.snap index 31b423c532..ada723fa21 100644 --- a/tests/postprocess_filtering.nf.test.snap +++ b/tests/postprocess_filtering.nf.test.snap @@ -32,18 +32,20 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" diff --git a/tests/postprocess_normalization.nf.test.snap b/tests/postprocess_normalization.nf.test.snap index 42f044a65a..9ddd469218 100644 --- a/tests/postprocess_normalization.nf.test.snap +++ b/tests/postprocess_normalization.nf.test.snap @@ -32,22 +32,24 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_EXT_VCF": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" diff --git a/tests/postprocess_varlociraptor.nf.test.snap b/tests/postprocess_varlociraptor.nf.test.snap index 1d9259b618..c3cc403a8b 100644 --- a/tests/postprocess_varlociraptor.nf.test.snap +++ b/tests/postprocess_varlociraptor.nf.test.snap @@ -71,18 +71,20 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_GERMLINE": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_SOMATIC": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VARLOCIRAPTOR_CALLVARIANTS": { "varlociraptor": "8.9.5" @@ -389,12 +391,12 @@ "bcftools": "1.23.1" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VARLOCIRAPTOR_CALLVARIANTS": { "varlociraptor": "8.9.5" @@ -590,7 +592,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:38:20.44515837", + "timestamp": "2026-07-28T11:20:47.323833718", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -641,15 +643,16 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_GERMLINE": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VARLOCIRAPTOR_CALLVARIANTS": { "varlociraptor": "8.9.5" diff --git a/tests/qc_ngscheckmate.nf.test.snap b/tests/qc_ngscheckmate.nf.test.snap index 44d732ff4b..e780d6e183 100644 --- a/tests/qc_ngscheckmate.nf.test.snap +++ b/tests/qc_ngscheckmate.nf.test.snap @@ -19,12 +19,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -143,12 +143,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/save_mapped.nf.test.snap b/tests/save_mapped.nf.test.snap index 8467fabb4a..1c750f618f 100644 --- a/tests/save_mapped.nf.test.snap +++ b/tests/save_mapped.nf.test.snap @@ -26,12 +26,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -58,10 +58,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T14:34:29.034973351", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T21:27:11.108509" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/save_output_as_bam.nf.test.snap b/tests/save_output_as_bam.nf.test.snap index 491d13b64b..941145c26d 100644 --- a/tests/save_output_as_bam.nf.test.snap +++ b/tests/save_output_as_bam.nf.test.snap @@ -14,22 +14,23 @@ "samtools": "1.22.1" }, "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CREATE_INTERVALS_BED": { "gawk": "5.3.0" @@ -64,12 +65,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -373,7 +374,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T10:27:46.994496963", + "timestamp": "2026-07-28T14:39:40.512178305", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -403,12 +404,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -435,11 +436,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T14:39:25.431547577", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-03-13T09:02:14.635985" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --save_output_as_bam --tools sentieon_dedup": { "content": [ @@ -455,12 +456,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -490,10 +491,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-28T10:59:38.19303281", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-09T14:40:13.000000" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/sentieon.nf.test.snap b/tests/sentieon.nf.test.snap index a14708ec3f..1624728967 100644 --- a/tests/sentieon.nf.test.snap +++ b/tests/sentieon.nf.test.snap @@ -39,12 +39,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/sentieon_aligner_bwamem.nf.test.snap b/tests/sentieon_aligner_bwamem.nf.test.snap index 516178e64a..fe7d2886ca 100644 --- a/tests/sentieon_aligner_bwamem.nf.test.snap +++ b/tests/sentieon_aligner_bwamem.nf.test.snap @@ -26,12 +26,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -79,11 +79,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T11:00:26.802531111", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T10:32:56.848655102" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input fastq_umi.csv --aligner sentieon-bwamem --umi_location read2 --umi_length 7 --umi_base_skip 1 --tools sentieon_dedup": { "content": [ @@ -112,12 +112,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -156,11 +156,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_umi_cleanname_1.fastq.gz): Cannot extract flowcell ID from @922332" ] ], + "timestamp": "2026-07-28T14:28:02.089129479", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-08-18T06:00:05.261761108" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --aligner sentieon-bwamem --save_reference --build_only_index": { "content": [ @@ -176,12 +176,12 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -219,10 +219,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-28T10:59:35.355041067", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-06-21T10:38:04.521781501" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/sentieon_dedup.nf.test.snap b/tests/sentieon_dedup.nf.test.snap index 4c73072939..8a51af98de 100644 --- a/tests/sentieon_dedup.nf.test.snap +++ b/tests/sentieon_dedup.nf.test.snap @@ -29,12 +29,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -186,7 +186,7 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-07-27T11:35:39.37304294", + "timestamp": "2026-07-28T10:57:26.744377427", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -222,12 +222,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -379,7 +379,7 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-07-27T11:37:42.701914376", + "timestamp": "2026-07-28T11:00:34.291406145", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -415,12 +415,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -572,7 +572,7 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-07-27T11:34:59.34095366", + "timestamp": "2026-07-28T11:01:09.715185863", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -611,12 +611,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -768,7 +768,7 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-07-27T11:36:17.840418937", + "timestamp": "2026-07-28T10:58:09.138069802", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -807,12 +807,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/spark.nf.test.snap b/tests/spark.nf.test.snap index 3c1cb4afba..01afd1e775 100644 --- a/tests/spark.nf.test.snap +++ b/tests/spark.nf.test.snap @@ -45,12 +45,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -282,12 +282,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -324,10 +324,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998513#1/1" ] ], + "timestamp": "2026-07-28T14:32:00.112214223", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2025-12-15T21:33:59.148271232" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/start_from_markduplicates.nf.test.snap b/tests/start_from_markduplicates.nf.test.snap index 6147c20e10..6d87c3fd7a 100644 --- a/tests/start_from_markduplicates.nf.test.snap +++ b/tests/start_from_markduplicates.nf.test.snap @@ -30,12 +30,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -218,12 +218,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -369,7 +369,7 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-07-27T10:40:21.440602423", + "timestamp": "2026-07-28T11:25:22.044646175", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -402,12 +402,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -560,12 +560,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/start_from_preparerecalibration.nf.test.snap b/tests/start_from_preparerecalibration.nf.test.snap index e6c65e20ee..4f3cbd0fd8 100644 --- a/tests/start_from_preparerecalibration.nf.test.snap +++ b/tests/start_from_preparerecalibration.nf.test.snap @@ -26,12 +26,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -164,12 +164,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -275,11 +275,11 @@ ], "No warnings" ], + "timestamp": "2026-07-28T14:40:17.581153664", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:51:32.157567526" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_bam.csv --step prepare_recalibration --skip_tools baserecalibrator --tools strelka": { "content": [ @@ -298,12 +298,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -409,11 +409,11 @@ ], "No warnings" ], + "timestamp": "2026-07-28T11:02:21.993365701", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:50:33.221939876" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_cram.csv --step prepare_recalibration --tools null": { "content": [ @@ -442,12 +442,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -557,7 +557,7 @@ "No VCF files", "No warnings" ], - "timestamp": "2026-07-27T10:27:50.357982281", + "timestamp": "2026-07-28T11:06:00.25230405", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/start_from_recalibration.nf.test.snap b/tests/start_from_recalibration.nf.test.snap index 3c4d4773b6..5c101af370 100644 --- a/tests/start_from_recalibration.nf.test.snap +++ b/tests/start_from_recalibration.nf.test.snap @@ -23,12 +23,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -144,12 +144,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -255,11 +255,11 @@ ], "No warnings" ], + "timestamp": "2026-07-28T14:35:23.521371406", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:55:41.4762897" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_bam.csv --step recalibrate --skip_tools baserecalibrator --tools strelka": { "content": [ @@ -278,12 +278,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -389,11 +389,11 @@ ], "No warnings" ], + "timestamp": "2026-07-28T14:35:07.543185264", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T21:54:41.033469111" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input tests/csv/3.0/mapped_single_cram.csv --step recalibrate --tools null": { "content": [ @@ -419,12 +419,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/tumor-normal-pair.nf.test.snap b/tests/tumor-normal-pair.nf.test.snap index 6c664c0a80..7d875b89ac 100644 --- a/tests/tumor-normal-pair.nf.test.snap +++ b/tests/tumor-normal-pair.nf.test.snap @@ -49,12 +49,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/umi_fastp.nf.test.snap b/tests/umi_fastp.nf.test.snap index e15a93581a..ce96888e5a 100644 --- a/tests/umi_fastp.nf.test.snap +++ b/tests/umi_fastp.nf.test.snap @@ -46,12 +46,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/umi_fgbio.nf.test.snap b/tests/umi_fgbio.nf.test.snap index 62a63cbb95..ee15bad18b 100644 --- a/tests/umi_fgbio.nf.test.snap +++ b/tests/umi_fgbio.nf.test.snap @@ -97,12 +97,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/umi_in_read_names.nf.test.snap b/tests/umi_in_read_names.nf.test.snap index 3b94ff9558..8db79c2974 100644 --- a/tests/umi_in_read_names.nf.test.snap +++ b/tests/umi_in_read_names.nf.test.snap @@ -39,12 +39,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -342,12 +342,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -635,7 +635,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:42:25.348630085", + "timestamp": "2026-07-28T11:27:38.221141795", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/variant_calling_all.nf.test.snap b/tests/variant_calling_all.nf.test.snap index 6402ccd10b..e1f3c758c8 100644 --- a/tests/variant_calling_all.nf.test.snap +++ b/tests/variant_calling_all.nf.test.snap @@ -20,22 +20,23 @@ "samtools": "1.22.1" }, "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -92,22 +93,24 @@ "svdb": "2.8.4" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIP_TIDDIT_SV": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TIDDIT_SV": { "tiddit": "3.9.5" @@ -590,7 +593,7 @@ "test.targetcoverage.cnn:md5,0e0416a5dc409a9c311232092a058aec", "genome.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "genome.target.bed:md5,d7fcdfe7dc055924fe7cc3fb990f5633", - "reference.cnn:md5,6542568cd3859ba3789c543c27d64b20", + "reference.cnn:md5,2a397362f7f209c4bae39bb18b74e57f", "test.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", "test.targetcoverage.cnn:md5,bc82e785b5930b589c216516d1543985", "test2.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", @@ -641,7 +644,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T10:30:48.429722692", + "timestamp": "2026-07-28T14:46:50.973045461", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -668,22 +671,23 @@ "samtools": "1.22.1" }, "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -727,22 +731,24 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIP_TIDDIT_SV": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TIDDIT_SV": { "tiddit": "3.9.5" @@ -1142,7 +1148,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T10:32:11.483735223", + "timestamp": "2026-07-28T11:10:08.379344895", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -1172,13 +1178,14 @@ "gatk4": "4.6.2.0" }, "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -1228,22 +1235,24 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIP_TIDDIT_SV": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TIDDIT_SV": { "tiddit": "3.9.5" @@ -1607,7 +1616,7 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], - "timestamp": "2026-07-27T10:27:19.8576204", + "timestamp": "2026-07-28T11:06:54.492117039", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/variant_calling_ascat.nf.test.snap b/tests/variant_calling_ascat.nf.test.snap index ac5d21fc53..74c6dfac4c 100644 --- a/tests/variant_calling_ascat.nf.test.snap +++ b/tests/variant_calling_ascat.nf.test.snap @@ -14,8 +14,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -109,8 +109,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -205,8 +205,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -357,8 +357,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ diff --git a/tests/variant_calling_cnvkit.nf.test.snap b/tests/variant_calling_cnvkit.nf.test.snap index c52d3d2793..6655c5a6bd 100644 --- a/tests/variant_calling_cnvkit.nf.test.snap +++ b/tests/variant_calling_cnvkit.nf.test.snap @@ -4,22 +4,23 @@ 20, { "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -35,12 +36,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -179,7 +180,7 @@ "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,4153756b30abc934f10717c023bd262f", "multi_intervals.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "multi_intervals.target.bed:md5,f9e727147a7cbca46c2b9b2de3ecae91", - "reference.cnn:md5,e0aefc1c8a40e6919dc9cfb686e51f7c", + "reference.cnn:md5,dfc49a037a468bef43a33b5dd4a2bc05", "test.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,826087b08d380135a271e2774c94084c", "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", @@ -199,7 +200,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:30:55.546225902", + "timestamp": "2026-07-28T14:42:57.173889218", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -210,22 +211,23 @@ 30, { "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -241,12 +243,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -435,7 +437,7 @@ "test2.paired_end.recalibrated.sorted.tumor_only.call.cns:md5,70a308c6db7acf1a5fd623936cac6412", "multi_intervals.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "multi_intervals.target.bed:md5,f9e727147a7cbca46c2b9b2de3ecae91", - "reference.cnn:md5,e0aefc1c8a40e6919dc9cfb686e51f7c", + "reference.cnn:md5,dfc49a037a468bef43a33b5dd4a2bc05", "test.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,826087b08d380135a271e2774c94084c", "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", @@ -456,7 +458,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:28:58.93483756", + "timestamp": "2026-07-28T14:41:59.048184914", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -467,22 +469,23 @@ 13, { "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -498,12 +501,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -629,22 +632,23 @@ 13, { "CNVKIT_ANTITARGET": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_REFERENCE": { - "cnvkit": "0.9.11" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -660,12 +664,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -799,8 +803,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -899,16 +903,17 @@ 16, { "CNVKIT_BATCH": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12", + "samtools": "1.21" }, "CNVKIT_CALL": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_EXPORT": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CNVKIT_GENEMETRICS": { - "cnvkit": "0.9.10" + "cnvkit": "0.9.12" }, "CRAM_TO_BAM": { "samtools": "1.24" @@ -921,8 +926,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -1068,7 +1073,7 @@ "genome.antitarget.bed:md5,d41d8cd98f00b204e9800998ecf8427e", "genome.bed:md5,9c6cc178da8c2c27364be9f25c9df96d", "genome.target.bed:md5,ee8081becc36524d35889e3b5f70961b", - "reference.cnn:md5,8c53491ff76a2a06b7a977714db862bb", + "reference.cnn:md5,b43c5b91bf2da9efe4dc9631cbb46c44", "test.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", "test.paired_end.recalibrated.sorted.targetcoverage.cnn:md5,0067cc3a0e479b23ab3bf056cead31b4", "test2.paired_end.recalibrated.sorted.antitargetcoverage.cnn:md5,203caf8cef6935bb50b4138097955cb8", @@ -1088,7 +1093,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:27:01.74112415", + "timestamp": "2026-07-28T14:38:02.484867231", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/variant_calling_controlfreec.nf.test.snap b/tests/variant_calling_controlfreec.nf.test.snap index e765355a00..a719e89661 100644 --- a/tests/variant_calling_controlfreec.nf.test.snap +++ b/tests/variant_calling_controlfreec.nf.test.snap @@ -29,8 +29,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "UNTAR_CHR_DIR": { "untar": "1.34" @@ -183,12 +183,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "UNTAR_CHR_DIR": { "untar": "1.34" @@ -359,8 +359,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "UNTAR_CHR_DIR": { "untar": "1.34" @@ -474,12 +474,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "UNTAR_CHR_DIR": { "untar": "1.34" diff --git a/tests/variant_calling_deepvariant.nf.test.snap b/tests/variant_calling_deepvariant.nf.test.snap index c04371b448..a1855d1a72 100644 --- a/tests/variant_calling_deepvariant.nf.test.snap +++ b/tests/variant_calling_deepvariant.nf.test.snap @@ -23,12 +23,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -185,7 +185,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:44:10.97242938", + "timestamp": "2026-07-28T11:29:42.272387988", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -214,12 +214,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -365,8 +365,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -516,8 +516,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_freebayes.nf.test.snap b/tests/variant_calling_freebayes.nf.test.snap index 1fdbe9b711..9ef3934a5a 100644 --- a/tests/variant_calling_freebayes.nf.test.snap +++ b/tests/variant_calling_freebayes.nf.test.snap @@ -29,15 +29,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" @@ -261,14 +262,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" @@ -685,15 +688,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" @@ -999,7 +1003,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T10:29:15.12436469", + "timestamp": "2026-07-28T11:08:49.193958384", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -1049,14 +1053,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" @@ -1387,14 +1393,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" @@ -1627,15 +1635,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_VC_FREEBAYES_FILT": { - "tabix": 1.21 + "htslib": "1.24", + "xz": "5.8.3" }, "VCFLIB_VCFFILTER": { "vcflib": "1.0.14" @@ -2005,7 +2014,7 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], - "timestamp": "2026-07-27T10:34:34.523815105", + "timestamp": "2026-07-28T11:12:34.424513234", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/variant_calling_haplotypecaller.nf.test.snap b/tests/variant_calling_haplotypecaller.nf.test.snap index 55281a9cb3..2632ec645a 100644 --- a/tests/variant_calling_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_haplotypecaller.nf.test.snap @@ -17,8 +17,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -207,12 +207,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -404,8 +404,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -603,12 +603,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_lofreq.nf.test.snap b/tests/variant_calling_lofreq.nf.test.snap index 74a9f15e41..a2287d7623 100644 --- a/tests/variant_calling_lofreq.nf.test.snap +++ b/tests/variant_calling_lofreq.nf.test.snap @@ -23,12 +23,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -212,8 +212,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_manta.nf.test.snap b/tests/variant_calling_manta.nf.test.snap index c9a50c3d9a..924dbbdc20 100644 --- a/tests/variant_calling_manta.nf.test.snap +++ b/tests/variant_calling_manta.nf.test.snap @@ -20,12 +20,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -153,7 +153,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:45:08.642654705", + "timestamp": "2026-07-28T11:30:49.321843773", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -177,8 +177,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -336,8 +336,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -531,12 +531,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -664,7 +664,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:35:30.836798406", + "timestamp": "2026-07-28T11:13:30.894533486", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -697,12 +697,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -935,12 +935,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -1104,7 +1104,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:30:18.506893012", + "timestamp": "2026-07-28T11:09:53.563178736", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -1128,8 +1128,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_mpileup.nf.test.snap b/tests/variant_calling_mpileup.nf.test.snap index cd66e0b5f8..eb9e8f22e5 100644 --- a/tests/variant_calling_mpileup.nf.test.snap +++ b/tests/variant_calling_mpileup.nf.test.snap @@ -20,12 +20,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -207,8 +207,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -393,8 +393,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -582,12 +582,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_msisensor2.nf.test.snap b/tests/variant_calling_msisensor2.nf.test.snap index 570a51c0f9..4ef1079ca2 100644 --- a/tests/variant_calling_msisensor2.nf.test.snap +++ b/tests/variant_calling_msisensor2.nf.test.snap @@ -7,8 +7,8 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "UNTAR_MSISENSOR2_MODELS": { "untar": "1.34" @@ -61,7 +61,7 @@ [ "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", "genome.dict:md5,de4ff13287d28c1679a11ae989a3a980", - "no_intervals.bed.gz:md5,f3dac01ea66b95fe477446fde2d31489", + "no_intervals.bed.gz:md5,d41d8cd98f00b204e9800998ecf8427e", "016a16e12aca2bdba3713a3be76f72cd:md5,26ddcb7b64f43835f254a13b29adf3fc", "02d42c2bda19aac304d6e86390c7f328:md5,15ab43fe84b8b7169979d62e267e2b5f", "1030c0aa35ca5c263daeae866ad18632:md5,41e6de8e7e35f66b691072d9839e128a", @@ -86,11 +86,11 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-28T14:39:49.554362689", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-10-13T12:34:18.918526" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --tools msisensor2 --build_only_index --input false -stub": { "content": [ @@ -100,8 +100,8 @@ "gatk4": "4.6.2.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "UNTAR_MSISENSOR2_MODELS": { "untar": "1.34" @@ -177,12 +177,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "UNTAR_MSISENSOR2_MODELS": { "untar": "1.34" diff --git a/tests/variant_calling_msisensorpro.nf.test.snap b/tests/variant_calling_msisensorpro.nf.test.snap index e5d36cb0d3..633a663f80 100644 --- a/tests/variant_calling_msisensorpro.nf.test.snap +++ b/tests/variant_calling_msisensorpro.nf.test.snap @@ -10,8 +10,8 @@ "msisensor-pro": "1.3.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -69,12 +69,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -206,8 +206,8 @@ "msisensor-pro": "1.3.0" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" } }, [ @@ -239,7 +239,7 @@ [ "multiqc_citations.txt:md5,4c806e63a283ec1b7e78cdae3a923d4f", "genome.dict:md5,de4ff13287d28c1679a11ae989a3a980", - "no_intervals.bed.gz:md5,f3dac01ea66b95fe477446fde2d31489", + "no_intervals.bed.gz:md5,d41d8cd98f00b204e9800998ecf8427e", "genome.msisensor_scan.list:md5,614754c7f1f44d5988dd80f8f21f69d1" ], "No BAM files", @@ -247,10 +247,10 @@ "No VCF files", "No warnings" ], + "timestamp": "2026-07-28T14:41:52.061061413", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.04.7" - }, - "timestamp": "2025-09-30T23:19:39.916442214" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_muse.nf.test.snap b/tests/variant_calling_muse.nf.test.snap index 68982cfc30..b03adbde8a 100644 --- a/tests/variant_calling_muse.nf.test.snap +++ b/tests/variant_calling_muse.nf.test.snap @@ -29,12 +29,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -210,12 +210,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_mutect2.nf.test.snap b/tests/variant_calling_mutect2.nf.test.snap index 0a33bc5519..ae1086a913 100644 --- a/tests/variant_calling_mutect2.nf.test.snap +++ b/tests/variant_calling_mutect2.nf.test.snap @@ -23,8 +23,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -220,12 +220,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -408,7 +408,7 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], - "timestamp": "2026-07-27T10:49:05.16697888", + "timestamp": "2026-07-28T11:35:37.049228309", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -438,8 +438,8 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -649,12 +649,12 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -820,7 +820,7 @@ "WARN: No Panel-of-normal was specified for Mutect2." ] ], - "timestamp": "2026-07-27T10:33:25.493676415", + "timestamp": "2026-07-28T11:12:58.603126898", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/variant_calling_sentieon_dnascope.nf.test.snap b/tests/variant_calling_sentieon_dnascope.nf.test.snap index 6aae5c5a95..0157cc0068 100644 --- a/tests/variant_calling_sentieon_dnascope.nf.test.snap +++ b/tests/variant_calling_sentieon_dnascope.nf.test.snap @@ -23,12 +23,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -186,7 +186,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T11:38:52.499416464", + "timestamp": "2026-07-28T11:00:49.396195515", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -219,12 +219,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -385,7 +385,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T11:34:52.637438538", + "timestamp": "2026-07-28T11:01:09.004361032", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -424,12 +424,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -593,7 +593,7 @@ "WARN: If GATK's Haplotypecaller, Sentieon's Dnascope and/or Sentieon's Haplotyper is specified, but without `--dbsnp`, `--known_snps`, `--known_indels` or the associated resource labels (ie `known_snps_vqsr`), no variant recalibration will be done. For recalibration you must provide all of these resources." ] ], - "timestamp": "2026-07-27T11:36:02.196958675", + "timestamp": "2026-07-28T11:01:41.929110424", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap index f861d9b5b2..016bbdb2bf 100644 --- a/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap +++ b/tests/variant_calling_sentieon_haplotypecaller.nf.test.snap @@ -44,12 +44,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -216,7 +216,7 @@ "WARN: If GATK's Haplotypecaller, Sentieon's Dnascope and/or Sentieon's Haplotyper is specified, but without `--dbsnp`, `--known_snps`, `--known_indels` or the associated resource labels (ie `known_snps_vqsr`), no variant recalibration will be done. For recalibration you must provide all of these resources." ] ], - "timestamp": "2026-07-27T11:36:08.094597613", + "timestamp": "2026-07-28T11:02:16.293619207", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -246,8 +246,8 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -441,12 +441,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -604,7 +604,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T11:36:30.915587402", + "timestamp": "2026-07-28T10:58:16.960328143", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -640,12 +640,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -806,7 +806,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T11:36:24.959312656", + "timestamp": "2026-07-28T11:01:47.702910053", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" diff --git a/tests/variant_calling_sentieon_tnscope.nf.test.snap b/tests/variant_calling_sentieon_tnscope.nf.test.snap index 924500df0d..e8dfa5b094 100644 --- a/tests/variant_calling_sentieon_tnscope.nf.test.snap +++ b/tests/variant_calling_sentieon_tnscope.nf.test.snap @@ -23,12 +23,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -86,11 +86,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998513#1/1" ] ], + "timestamp": "2026-07-28T10:59:00.525116855", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-07-03T13:19:32.295689002" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input fastq_triple_two_tumor.csv --tools sentieon_tnscope": { "content": [ @@ -116,12 +116,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -205,11 +205,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T11:02:18.439914438", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-07-03T19:24:18.564064846" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input fastq_pair.csv --tools sentieon_tnscope --no_intervals": { "content": [ @@ -229,8 +229,8 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -299,11 +299,11 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T14:29:54.161693908", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-07-03T13:12:22.769869621" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } }, "-profile test --input fastq_pair.csv --tools sentieon_tnscope": { "content": [ @@ -329,12 +329,12 @@ "sentieon": "202503.02" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -400,10 +400,10 @@ "WARN: FASTQ file(/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz): Cannot extract flowcell ID from @normal#21#998579#1/1" ] ], + "timestamp": "2026-07-28T11:01:53.081165903", "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.2" - }, - "timestamp": "2025-07-03T13:39:14.931074918" + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } } } diff --git a/tests/variant_calling_strelka.nf.test.snap b/tests/variant_calling_strelka.nf.test.snap index 5a8093d26e..bf17d619f2 100644 --- a/tests/variant_calling_strelka.nf.test.snap +++ b/tests/variant_calling_strelka.nf.test.snap @@ -23,12 +23,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -252,12 +252,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -444,12 +444,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -672,7 +672,7 @@ ], "No warnings" ], - "timestamp": "2026-07-27T10:37:04.502091857", + "timestamp": "2026-07-28T11:15:18.903995357", "meta": { "nf-test": "0.9.5", "nextflow": "25.10.4" @@ -696,8 +696,8 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -884,8 +884,8 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_strelka_bp.nf.test.snap b/tests/variant_calling_strelka_bp.nf.test.snap index 9ffbc319f1..67db423b2b 100644 --- a/tests/variant_calling_strelka_bp.nf.test.snap +++ b/tests/variant_calling_strelka_bp.nf.test.snap @@ -26,8 +26,8 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" @@ -302,12 +302,12 @@ "strelka": "2.9.10" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "VCFTOOLS_SUMMARY": { "vcftools": "0.1.17" diff --git a/tests/variant_calling_tiddit.nf.test.snap b/tests/variant_calling_tiddit.nf.test.snap index 09bb83af3f..96d018d114 100644 --- a/tests/variant_calling_tiddit.nf.test.snap +++ b/tests/variant_calling_tiddit.nf.test.snap @@ -17,16 +17,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIP_TIDDIT_SV": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TIDDIT_SV": { "tiddit": "3.9.5" @@ -182,16 +182,16 @@ "samtools": "1.24" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIP_TIDDIT_SV": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TIDDIT_SV": { "tiddit": "3.9.5" @@ -351,16 +351,16 @@ "svdb": "2.8.4" }, "TABIX_BGZIPTABIX_INTERVAL_COMBINED": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIPTABIX_INTERVAL_SPLIT": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TABIX_BGZIP_TIDDIT_SV": { - "bgzip": "1.21", - "tabix": "1.21" + "htslib": "1.24", + "xz": "5.8.3" }, "TIDDIT_SV": { "tiddit": "3.9.5" diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 5df7d648d1..18611e17ef 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -542,7 +542,6 @@ workflow SAREK { // Gather used variant calling softwares versions versions = versions.mix(BAM_VARIANT_CALLING_GERMLINE_ALL.out.versions) versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_ALL.out.versions) - versions = versions.mix(BAM_VARIANT_CALLING_TUMOR_ONLY_ALL.out.versions) versions = versions.mix(POST_VARIANTCALLING.out.versions) // ANNOTATE @@ -571,9 +570,6 @@ workflow SAREK { bcftools_header_lines, snpsift_db, ) - - // Gather used softwares versions - versions = versions.mix(VCF_ANNOTATE_ALL.out.versions) } } From 9f7ca0be040533aecc35be506d73b51699b61a9d Mon Sep 17 00:00:00 2001 From: Friederike Hanssen Date: Wed, 29 Jul 2026 12:23:56 +0200 Subject: [PATCH 20/27] chore(modules): migrate local modules to versions topic channel (#2244) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Migrates the local modules to the `versions` topic channel. **Stacked on #2243** (base: `topic/cnvkit`). ### Changes - Converts `add_info_to_vcf`, `create_intervals_bed` and `samtools/reindex_bam` from `versions.yml` to the versions topic channel, matching the `consensus_from_sites` pattern. - Removes the corresponding `.out.versions` wiring. No tool version changes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 1 + main.nf | 5 - modules/local/add_info_to_vcf/main.nf | 7 +- modules/local/add_info_to_vcf/meta.yml | 59 +++++++ modules/local/create_intervals_bed/main.nf | 22 +-- modules/local/create_intervals_bed/meta.yml | 57 +++++++ modules/local/samtools/reindex_bam/main.nf | 7 +- modules/local/samtools/reindex_bam/meta.yml | 89 +++++++++++ .../bam_variant_calling_germline_all/main.nf | 5 - .../bam_variant_calling_indexcov/main.nf | 5 - .../bam_variant_calling_somatic_all/main.nf | 5 - .../local/post_variantcalling/main.nf | 5 - .../post_variantcalling/tests/main.nf.test | 42 ++--- .../tests/main.nf.test.snap | 144 +----------------- subworkflows/local/prepare_intervals/main.nf | 7 - .../local/utils_nfcore_sarek_pipeline/main.nf | 3 - .../local/vcf_concatenate_germline/main.nf | 6 - subworkflows/local/vcf_normalization/main.nf | 6 - workflows/sarek.nf | 11 +- 19 files changed, 232 insertions(+), 254 deletions(-) create mode 100644 modules/local/add_info_to_vcf/meta.yml create mode 100644 modules/local/create_intervals_bed/meta.yml create mode 100644 modules/local/samtools/reindex_bam/meta.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index b815a4a08f..5e3f69d1b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#2241](https://github.com/nf-core/sarek/pull/2241) - Migrate `samtools/*` and `mosdepth` modules to the versions topic channel - [#2242](https://github.com/nf-core/sarek/pull/2242) - Migrate QC/coverage modules (`ascat`, `goleft`, `msisensor2`, `msisensorpro`) to the versions topic channel - [#2243](https://github.com/nf-core/sarek/pull/2243) - Migrate `cnvkit/*` modules to the versions topic channel, and replace the deprecated `tabix/tabix`/`tabix/bgziptabix` modules with `htslib/bgziptabix` +- [#2244](https://github.com/nf-core/sarek/pull/2244) - Migrate local modules (`add_info_to_vcf`, `create_intervals_bed`, `samtools/reindex_bam`) to the versions topic channel ### Fixed diff --git a/main.nf b/main.nf index dadcb67358..1ea13f281a 100755 --- a/main.nf +++ b/main.nf @@ -90,8 +90,6 @@ workflow NFCORE_SAREK { samplesheet main: - versions = channel.empty() - // build indexes if needed PREPARE_GENOME( params.ascat_alleles, @@ -165,8 +163,6 @@ workflow NFCORE_SAREK { else { cnvkit_reference = channel.value([]) } - // Gather used softwares versions - versions = versions.mix(PREPARE_INTERVALS.out.versions) // Fails when consensus calling is specified without normalization if (params.snv_consensus_calling && !params.normalize_vcfs) { @@ -337,7 +333,6 @@ workflow NFCORE_SAREK { params.vep_genome, params.vep_species, ch_snpsift_db, - versions, ) emit: diff --git a/modules/local/add_info_to_vcf/main.nf b/modules/local/add_info_to_vcf/main.nf index 466c33f15b..252dfb49ff 100644 --- a/modules/local/add_info_to_vcf/main.nf +++ b/modules/local/add_info_to_vcf/main.nf @@ -12,7 +12,7 @@ process ADD_INFO_TO_VCF { output: tuple val(meta), path("*.added_info.vcf"), emit: vcf - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gawk'), eval("awk --version | head -n1 | sed 's/GNU Awk //; s/, .*//'"), emit: versions_gawk, topic: versions when: task.ext.when == null || task.ext.when @@ -32,10 +32,5 @@ process ADD_INFO_TO_VCF { if grep -Ev "^#" \$input; then grep -Ev "^#" \$input | awk 'BEGIN{FS=OFS="\t"} { \$8=="." ? \$8="SOURCE=${vcf_gz}" : \$8=\$8";SOURCE=${vcf_gz}"; print }' >> \$output fi - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') - END_VERSIONS """ } diff --git a/modules/local/add_info_to_vcf/meta.yml b/modules/local/add_info_to_vcf/meta.yml new file mode 100644 index 0000000000..69e66eeb8a --- /dev/null +++ b/modules/local/add_info_to_vcf/meta.yml @@ -0,0 +1,59 @@ +name: "add_info_to_vcf" +description: Add a SOURCE INFO tag to every variant record in a VCF, naming the file it came from +keywords: + - vcf + - annotation + - info +tools: + - "gawk": + description: "GNU awk, a pattern scanning and processing language" + homepage: "https://www.gnu.org/software/gawk/" + documentation: "https://www.gnu.org/software/gawk/manual/gawk.html" + licence: ["GPL-3.0-or-later"] +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - vcf_gz: + type: file + description: Input VCF file, optionally gzipped + pattern: "*.{vcf,vcf.gz}" +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - "*.added_info.vcf": + type: file + description: VCF file with the SOURCE INFO tag added to every variant record + pattern: "*.added_info.vcf" + versions_gawk: + - - "${task.process}": + type: string + description: The name of the process + - gawk: + type: string + description: The name of the tool + - "awk --version | head -n1 | sed 's/GNU Awk //; s/, .*//'": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - "${task.process}": + type: string + description: The name of the process + - gawk: + type: string + description: The name of the tool + - "awk --version | head -n1 | sed 's/GNU Awk //; s/, .*//'": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@asp8200" +maintainers: + - "@FriederikeHanssen" + - "@maxulysse" diff --git a/modules/local/create_intervals_bed/main.nf b/modules/local/create_intervals_bed/main.nf index 3ffe9a7428..f7a70c1e6c 100644 --- a/modules/local/create_intervals_bed/main.nf +++ b/modules/local/create_intervals_bed/main.nf @@ -13,7 +13,7 @@ process CREATE_INTERVALS_BED { output: path ("*.bed"), emit: bed - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gawk'), eval("awk --version | head -n1 | sed 's/GNU Awk //; s/, .*//'"), emit: versions_gawk, topic: versions when: task.ext.when == null || task.ext.when @@ -41,11 +41,6 @@ process CREATE_INTERVALS_BED { chunk += t print \$0 > name }' ${intervals} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') - END_VERSIONS """ } else if (intervals.toString().toLowerCase().endsWith("interval_list")) { @@ -54,11 +49,6 @@ process CREATE_INTERVALS_BED { name = sprintf("%s_%d-%d", \$1, \$2, \$3); printf("%s\\t%d\\t%d\\n", \$1, \$2-1, \$3) > name ".bed" }' - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') - END_VERSIONS """ } else { @@ -67,11 +57,6 @@ process CREATE_INTERVALS_BED { name = sprintf("%s_%d-%d", \$1, \$2, \$3); printf("%s\\t%d\\t%d\\n", \$1, \$2-1, \$3) > name ".bed" }' ${intervals} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') - END_VERSIONS """ } @@ -79,10 +64,5 @@ process CREATE_INTERVALS_BED { def prefix = task.ext.prefix ?: "${intervals.baseName}" """ touch ${prefix}.stub.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gawk: \$(awk -Wversion | sed '1!d; s/.*Awk //; s/,.*//') - END_VERSIONS """ } diff --git a/modules/local/create_intervals_bed/meta.yml b/modules/local/create_intervals_bed/meta.yml new file mode 100644 index 0000000000..926e3f743b --- /dev/null +++ b/modules/local/create_intervals_bed/meta.yml @@ -0,0 +1,57 @@ +name: "create_intervals_bed" +description: Split an interval file (BED, GATK interval_list, or picard-style `chr:start-end` + list) into runtime-balanced BED chunks for parallelization +keywords: + - intervals + - bed + - parallelization +tools: + - "gawk": + description: "GNU awk, a pattern scanning and processing language" + homepage: "https://www.gnu.org/software/gawk/" + documentation: "https://www.gnu.org/software/gawk/manual/gawk.html" + licence: ["GPL-3.0-or-later"] +input: + - - intervals: + type: file + description: Interval file, either BED, GATK `.interval_list`, or a picard-style + `chr:start-end` list + pattern: "*.{bed,interval_list}" + - nucleotides_per_second: + type: integer + description: Estimated nucleotides processed per second, used to balance runtime + across chunks when the input has no runtime estimate column +output: + bed: + - "*.bed": + type: file + description: One or more BED files, each a runtime-balanced chunk of the input + intervals + pattern: "*.bed" + versions_gawk: + - - "${task.process}": + type: string + description: The name of the process + - gawk: + type: string + description: The name of the tool + - "awk --version | head -n1 | sed 's/GNU Awk //; s/, .*//'": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - "${task.process}": + type: string + description: The name of the process + - gawk: + type: string + description: The name of the tool + - "awk --version | head -n1 | sed 's/GNU Awk //; s/, .*//'": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@FriederikeHanssen" + - "@maxulysse" +maintainers: + - "@FriederikeHanssen" + - "@maxulysse" diff --git a/modules/local/samtools/reindex_bam/main.nf b/modules/local/samtools/reindex_bam/main.nf index 153f9093d6..d4503cb1a6 100644 --- a/modules/local/samtools/reindex_bam/main.nf +++ b/modules/local/samtools/reindex_bam/main.nf @@ -18,7 +18,7 @@ process SAMTOOLS_REINDEX_BAM { output: tuple val(meta), path("${meta.id}.reindex.bam"), path("${meta.id}.reindex.bam.bai"),emit: output - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools --version | head -n1 | sed 's/samtools //'"), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when @@ -48,10 +48,5 @@ process SAMTOOLS_REINDEX_BAM { ${reference} \\ ${args} \\ ${input} - - 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/samtools/reindex_bam/meta.yml b/modules/local/samtools/reindex_bam/meta.yml new file mode 100644 index 0000000000..c8ff7973c0 --- /dev/null +++ b/modules/local/samtools/reindex_bam/meta.yml @@ -0,0 +1,89 @@ +name: "samtools_reindex_bam" +description: Re-index a BAM/CRAM after dropping duplicate, supplementary, and unmapped + reads, producing a header-only BAM and a matching index for goleft/indexcov +keywords: + - samtools + - bam + - index + - indexcov +tools: + - "samtools": + description: "Tools for dealing with SAM, BAM and CRAM files" + 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"] +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - input: + type: file + description: BAM/CRAM file + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAM/CRAM index + pattern: "*.{bai,crai}" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference genome FASTA file, required when the input is CRAM + pattern: "*.{fa,fasta}" + - - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fai: + type: file + description: Reference genome FASTA index, required when the input is CRAM + pattern: "*.fai" +output: + output: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'sample1' ] + - "${meta.id}.reindex.bam": + type: file + description: Header-only BAM with duplicate/supplementary/unmapped reads removed + pattern: "*.reindex.bam" + - "${meta.id}.reindex.bam.bai": + type: file + description: BAM index matching the reindexed BAM + pattern: "*.reindex.bam.bai" + versions_samtools: + - - "${task.process}": + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - "samtools --version | head -n1 | sed 's/samtools //'": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - "${task.process}": + type: string + description: The name of the process + - samtools: + type: string + description: The name of the tool + - "samtools --version | head -n1 | sed 's/samtools //'": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@lindenb" +maintainers: + - "@FriederikeHanssen" + - "@maxulysse" diff --git a/subworkflows/local/bam_variant_calling_germline_all/main.nf b/subworkflows/local/bam_variant_calling_germline_all/main.nf index abea346137..f8278a506d 100644 --- a/subworkflows/local/bam_variant_calling_germline_all/main.nf +++ b/subworkflows/local/bam_variant_calling_germline_all/main.nf @@ -52,8 +52,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { sentieon_dnascope_model // channel: [mandatory] value channel with string main: - versions = channel.empty() - //TODO: Temporary until the if's can be removed and printing to terminal is prevented with "when" in the modules.config gvcf_sentieon_dnascope = channel.empty() gvcf_sentieon_haplotyper = channel.empty() @@ -211,7 +209,6 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { ) out_indexcov = BAM_VARIANT_CALLING_INDEXCOV.out.out_indexcov - versions = versions.mix(BAM_VARIANT_CALLING_INDEXCOV.out.versions) } // SENTIEON DNASCOPE @@ -407,6 +404,4 @@ workflow BAM_VARIANT_CALLING_GERMLINE_ALL { tbi_sentieon_haplotyper tbi_strelka tbi_tiddit - - versions } diff --git a/subworkflows/local/bam_variant_calling_indexcov/main.nf b/subworkflows/local/bam_variant_calling_indexcov/main.nf index 59c261d10c..3b65b1ec70 100644 --- a/subworkflows/local/bam_variant_calling_indexcov/main.nf +++ b/subworkflows/local/bam_variant_calling_indexcov/main.nf @@ -15,8 +15,6 @@ workflow BAM_VARIANT_CALLING_INDEXCOV { fasta_fai // channel: [mandatory] [ meta, fasta_fai ] main: - versions = channel.empty() - // generate a cleaner bam index without duplicate, supplementary, etc. (Small workload because the bam itself is not re-generated) reindex_ch = SAMTOOLS_REINDEX_BAM( cram, @@ -24,8 +22,6 @@ workflow BAM_VARIANT_CALLING_INDEXCOV { fasta_fai ) - versions = versions.mix(reindex_ch.versions) - // create [ [id:directory], bams, bais ] indexcov_input_ch = reindex_ch.output.map{ _meta, bam, bai -> [[id:"indexcov"], bam, bai]}.groupTuple() @@ -37,5 +33,4 @@ workflow BAM_VARIANT_CALLING_INDEXCOV { emit: out_indexcov = goleft_ch.output - versions } diff --git a/subworkflows/local/bam_variant_calling_somatic_all/main.nf b/subworkflows/local/bam_variant_calling_somatic_all/main.nf index 5d9a0210f7..4eec1ef6dd 100644 --- a/subworkflows/local/bam_variant_calling_somatic_all/main.nf +++ b/subworkflows/local/bam_variant_calling_somatic_all/main.nf @@ -51,9 +51,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { main: // channels are often remapped to match module/subworkflow - // Gather all versions - versions = channel.empty() - //TODO: Temporary until the if's can be removed and printing to terminal is prevented with "when" in the modules.config out_indexcov = channel.empty() out_msisensorpro = channel.empty() @@ -171,7 +168,6 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { ) out_indexcov = BAM_VARIANT_CALLING_INDEXCOV.out.out_indexcov - versions = versions.mix(BAM_VARIANT_CALLING_INDEXCOV.out.versions) } // STRELKA @@ -316,5 +312,4 @@ workflow BAM_VARIANT_CALLING_SOMATIC_ALL { tbi_strelka tbi_tiddit tbi_tnscope - versions } diff --git a/subworkflows/local/post_variantcalling/main.nf b/subworkflows/local/post_variantcalling/main.nf index 1dbfd3059c..3dc33dde0c 100644 --- a/subworkflows/local/post_variantcalling/main.nf +++ b/subworkflows/local/post_variantcalling/main.nf @@ -37,7 +37,6 @@ workflow POST_VARIANTCALLING { varlociraptor_scenario_tumor_only main: - versions = channel.empty() vcfs = channel.empty() tbis = channel.empty() @@ -124,7 +123,6 @@ workflow POST_VARIANTCALLING { small_variant_vcfs = NORMALIZE_VCFS.out.vcfs // [meta, vcf] small_variant_tbis = NORMALIZE_VCFS.out.tbis // [meta, tbi] - versions = versions.mix(NORMALIZE_VCFS.out.versions) } if (normalize_vcfs && snv_consensus_calling){ @@ -156,8 +154,6 @@ workflow POST_VARIANTCALLING { vcfs = vcfs.mix(CONCATENATE_GERMLINE_VCFS.out.vcfs) tbis = tbis.mix(CONCATENATE_GERMLINE_VCFS.out.tbis) - - versions = versions.mix(CONCATENATE_GERMLINE_VCFS.out.versions) } @@ -169,5 +165,4 @@ workflow POST_VARIANTCALLING { emit: vcfs // post processed vcfs [meta, vcf] tbis // post processed tbis [meta, tbi] - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/post_variantcalling/tests/main.nf.test b/subworkflows/local/post_variantcalling/tests/main.nf.test index 934420065d..67136e3530 100644 --- a/subworkflows/local/post_variantcalling/tests/main.nf.test +++ b/subworkflows/local/post_variantcalling/tests/main.nf.test @@ -69,8 +69,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -136,8 +135,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -203,8 +201,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -334,8 +331,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -402,8 +398,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -474,8 +469,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -545,8 +539,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -617,8 +610,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -687,8 +679,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -767,8 +758,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -845,8 +835,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -918,8 +907,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -991,8 +979,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } @@ -1066,8 +1053,7 @@ nextflow_workflow { { assert workflow.success }, { assert snapshot( workflow.out.vcfs, - workflow.out.tbis, - workflow.out.versions + workflow.out.tbis ).match() } ) } diff --git a/subworkflows/local/post_variantcalling/tests/main.nf.test.snap b/subworkflows/local/post_variantcalling/tests/main.nf.test.snap index fefd5b66a9..17cbb5c205 100644 --- a/subworkflows/local/post_variantcalling/tests/main.nf.test.snap +++ b/subworkflows/local/post_variantcalling/tests/main.nf.test.snap @@ -32,18 +32,6 @@ }, "test_sample.germline.vcf.gz.tbi:md5,eda316880fe501671a66e26aefa7abf6" ] - ], - [ - "versions.yml:md5,047305afd4d6a35ccc6c8cae2d0de0cb", - "versions.yml:md5,047305afd4d6a35ccc6c8cae2d0de0cb", - "versions.yml:md5,594bb4ec971ba178d11d6f4c32fa5398", - "versions.yml:md5,594bb4ec971ba178d11d6f4c32fa5398", - "versions.yml:md5,b5b952ec9c95cc575f4305901a4af77c", - "versions.yml:md5,b5b952ec9c95cc575f4305901a4af77c", - "versions.yml:md5,eeffdab3a5d087ebcc8fe19bd27c900f", - "versions.yml:md5,eeffdab3a5d087ebcc8fe19bd27c900f", - "versions.yml:md5,f9826bc6c76002549649f51bda91a223", - "versions.yml:md5,f9826bc6c76002549649f51bda91a223" ] ], "meta": { @@ -99,25 +87,6 @@ }, "test_sample.germline.vcf.gz.tbi:md5,eda316880fe501671a66e26aefa7abf6" ] - ], - [ - "versions.yml:md5,047305afd4d6a35ccc6c8cae2d0de0cb", - "versions.yml:md5,047305afd4d6a35ccc6c8cae2d0de0cb", - "versions.yml:md5,594bb4ec971ba178d11d6f4c32fa5398", - "versions.yml:md5,594bb4ec971ba178d11d6f4c32fa5398", - "versions.yml:md5,6ea9087108ce40c482f810d350240e2e", - "versions.yml:md5,8e5af507f2006539314960cc13610d2c", - "versions.yml:md5,af9213a1434d504b9b19d0236f508046", - "versions.yml:md5,af9213a1434d504b9b19d0236f508046", - "versions.yml:md5,b5b952ec9c95cc575f4305901a4af77c", - "versions.yml:md5,b5b952ec9c95cc575f4305901a4af77c", - "versions.yml:md5,dee58c88dd03c46f90d7b83578b4ae82", - "versions.yml:md5,dee58c88dd03c46f90d7b83578b4ae82", - "versions.yml:md5,e79c4d48ba8ecd05bbd54969fa63fd0a", - "versions.yml:md5,eeffdab3a5d087ebcc8fe19bd27c900f", - "versions.yml:md5,eeffdab3a5d087ebcc8fe19bd27c900f", - "versions.yml:md5,f9826bc6c76002549649f51bda91a223", - "versions.yml:md5,f9826bc6c76002549649f51bda91a223" ] ], "meta": { @@ -143,13 +112,6 @@ }, "test_sample.germline.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - [ - "versions.yml:md5,047305afd4d6a35ccc6c8cae2d0de0cb", - "versions.yml:md5,594bb4ec971ba178d11d6f4c32fa5398", - "versions.yml:md5,b5b952ec9c95cc575f4305901a4af77c", - "versions.yml:md5,eeffdab3a5d087ebcc8fe19bd27c900f", - "versions.yml:md5,f9826bc6c76002549649f51bda91a223" ] ], "meta": { @@ -191,14 +153,6 @@ }, "tumor_sample.strelka.tumor_only.varlociraptor.vcf.gz.tbi:md5,6f17310cd152968349269107e53371c2" ] - ], - [ - "versions.yml:md5,2944a0f9af0e3918bb9833c87df1ebb6", - "versions.yml:md5,29f73f6b28ae158785ebea38843af786", - "versions.yml:md5,5d2a1f6080254676bff1ef3b27ab641f", - "versions.yml:md5,c35cd6c1892a24d29169bc79e7623bd9", - "versions.yml:md5,dc55a53ff7729dc648ac35db31ec5656", - "versions.yml:md5,faeabb0df6266c84e0fcd7f39d60b759" ] ], "meta": { @@ -242,20 +196,6 @@ }, "tumor_sample.strelka.somatic.varlociraptor.vcf.gz.tbi:md5,25d0445f304a4e9db421b880f866cc2c" ] - ], - [ - "versions.yml:md5,106dcb110a6d3d094298500f4030ef8f", - "versions.yml:md5,1b666f0fbac8556cef352a3a4fa60dbe", - "versions.yml:md5,1bca8763ec1f55aa5987e4f4301ed8cf", - "versions.yml:md5,26d247da3c326a0b09dff1bea9c55c52", - "versions.yml:md5,31e8ad0d1040730aceafc75e5c9fedac", - "versions.yml:md5,3aa2ccd7a5a2d5ecf2afff04a39e0f55", - "versions.yml:md5,641cf79d74888d2838e17449cfb5a98c", - "versions.yml:md5,65c36101acc269f90fcc762f4c515073", - "versions.yml:md5,6b1c3a74fcd23a4a7f78ddf4ef6c6f99", - "versions.yml:md5,ae66ca7ac06bbe30c3534b20ade99b48", - "versions.yml:md5,d28b191a8b7e7f1db9f269fc372d950e", - "versions.yml:md5,e75820d6c821e7da2cd08f5e42c9139e" ] ], "meta": { @@ -281,17 +221,6 @@ }, "test_tumor.null.norm.vcf.gz.tbi:md5,4331f1e4e2ba3cd35241c62e6a3e3a69" ] - ], - [ - "versions.yml:md5,6ea9087108ce40c482f810d350240e2e", - "versions.yml:md5,8e5af507f2006539314960cc13610d2c", - "versions.yml:md5,af9213a1434d504b9b19d0236f508046", - "versions.yml:md5,af9213a1434d504b9b19d0236f508046", - "versions.yml:md5,af9213a1434d504b9b19d0236f508046", - "versions.yml:md5,dee58c88dd03c46f90d7b83578b4ae82", - "versions.yml:md5,dee58c88dd03c46f90d7b83578b4ae82", - "versions.yml:md5,dee58c88dd03c46f90d7b83578b4ae82", - "versions.yml:md5,e79c4d48ba8ecd05bbd54969fa63fd0a" ] ], "meta": { @@ -302,21 +231,8 @@ }, "POST_VARIANTCALLING - varlociraptor germline - stub": { "content": [ - [ - - ], - [ - - ], - [ - "versions.yml:md5,1bca8763ec1f55aa5987e4f4301ed8cf", - "versions.yml:md5,25260e5ecf0e3f964c7e68c7eaa01d52", - "versions.yml:md5,45997f1ffe1a1c5fceda0f00b670faa8", - "versions.yml:md5,5a1892540eb326a685a22f9bc6f6a6b6", - "versions.yml:md5,9185ef5a5fa1849e93823a668c488c5c", - "versions.yml:md5,97327c4f942c0205e15b8cb4e363825b", - "versions.yml:md5,d28b191a8b7e7f1db9f269fc372d950e" - ] + [], + [] ], "meta": { "nf-test": "0.9.2", @@ -326,26 +242,8 @@ }, "POST_VARIANTCALLING - varlociraptor somatic - stub": { "content": [ - [ - - ], - [ - - ], - [ - "versions.yml:md5,106dcb110a6d3d094298500f4030ef8f", - "versions.yml:md5,1b666f0fbac8556cef352a3a4fa60dbe", - "versions.yml:md5,1bca8763ec1f55aa5987e4f4301ed8cf", - "versions.yml:md5,26d247da3c326a0b09dff1bea9c55c52", - "versions.yml:md5,31e8ad0d1040730aceafc75e5c9fedac", - "versions.yml:md5,3aa2ccd7a5a2d5ecf2afff04a39e0f55", - "versions.yml:md5,641cf79d74888d2838e17449cfb5a98c", - "versions.yml:md5,65c36101acc269f90fcc762f4c515073", - "versions.yml:md5,6b1c3a74fcd23a4a7f78ddf4ef6c6f99", - "versions.yml:md5,ae66ca7ac06bbe30c3534b20ade99b48", - "versions.yml:md5,d28b191a8b7e7f1db9f269fc372d950e", - "versions.yml:md5,e75820d6c821e7da2cd08f5e42c9139e" - ] + [], + [] ], "meta": { "nf-test": "0.9.2", @@ -384,15 +282,6 @@ }, "test_sample.strelka.germline.varlociraptor.vcf.gz.tbi:md5,9e063f81e588cb3f7ad883463c230153" ] - ], - [ - "versions.yml:md5,1bca8763ec1f55aa5987e4f4301ed8cf", - "versions.yml:md5,25260e5ecf0e3f964c7e68c7eaa01d52", - "versions.yml:md5,45997f1ffe1a1c5fceda0f00b670faa8", - "versions.yml:md5,5a1892540eb326a685a22f9bc6f6a6b6", - "versions.yml:md5,9185ef5a5fa1849e93823a668c488c5c", - "versions.yml:md5,97327c4f942c0205e15b8cb4e363825b", - "versions.yml:md5,d28b191a8b7e7f1db9f269fc372d950e" ] ], "meta": { @@ -418,13 +307,6 @@ }, "test_sample.null.norm.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" ] - ], - [ - "versions.yml:md5,6ea9087108ce40c482f810d350240e2e", - "versions.yml:md5,8e5af507f2006539314960cc13610d2c", - "versions.yml:md5,af9213a1434d504b9b19d0236f508046", - "versions.yml:md5,dee58c88dd03c46f90d7b83578b4ae82", - "versions.yml:md5,e79c4d48ba8ecd05bbd54969fa63fd0a" ] ], "meta": { @@ -435,20 +317,8 @@ }, "POST_VARIANTCALLING - varlociraptor tumor-only - stub": { "content": [ - [ - - ], - [ - - ], - [ - "versions.yml:md5,2944a0f9af0e3918bb9833c87df1ebb6", - "versions.yml:md5,29f73f6b28ae158785ebea38843af786", - "versions.yml:md5,5d2a1f6080254676bff1ef3b27ab641f", - "versions.yml:md5,c35cd6c1892a24d29169bc79e7623bd9", - "versions.yml:md5,dc55a53ff7729dc648ac35db31ec5656", - "versions.yml:md5,faeabb0df6266c84e0fcd7f39d60b759" - ] + [], + [] ], "meta": { "nf-test": "0.9.2", @@ -456,4 +326,4 @@ }, "timestamp": "2025-11-03T16:51:00.574162" } -} \ No newline at end of file +} diff --git a/subworkflows/local/prepare_intervals/main.nf b/subworkflows/local/prepare_intervals/main.nf index d51d2b2728..52553eb5c0 100644 --- a/subworkflows/local/prepare_intervals/main.nf +++ b/subworkflows/local/prepare_intervals/main.nf @@ -22,8 +22,6 @@ workflow PREPARE_INTERVALS { step main: - versions = channel.empty() - intervals_bed = channel.empty() // List of [ bed, num_intervals ], one for each region intervals_bed_gz_tbi = channel.empty() // List of [ bed.gz, bed,gz.tbi, num_intervals ], one for each region intervals_combined = channel.empty() // Single bed file containing all intervals @@ -47,15 +45,12 @@ workflow PREPARE_INTERVALS { intervals_bed = CREATE_INTERVALS_BED.out.bed - versions = versions.mix(CREATE_INTERVALS_BED.out.versions) } else { intervals_combined = channel.fromPath(file(intervals)).map{bed -> [ [ id:bed.baseName ], bed ] } CREATE_INTERVALS_BED(file(intervals), nucleotides_per_second) intervals_bed = CREATE_INTERVALS_BED.out.bed - versions = versions.mix(CREATE_INTERVALS_BED.out.versions) - // If interval file is not provided as .bed, but e.g. as .interval_list then convert to BED format if (intervals.endsWith(".interval_list")) { GATK4_INTERVALLISTTOBED(intervals_combined) @@ -108,6 +103,4 @@ workflow PREPARE_INTERVALS { // All intervals in one file intervals_bed_combined // [ intervals.bed ] intervals_bed_gz_tbi_combined // [ intervals.bed.gz, intervals.bed.gz.tbi] - - versions // [ versions.yml ] } diff --git a/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf b/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf index 0142d6e3bd..cd2d52bdcc 100644 --- a/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_sarek_pipeline/main.nf @@ -35,8 +35,6 @@ workflow PIPELINE_INITIALISATION { main: - versions = channel.empty() - // Print version and exit if required and dump pipeline parameters to JSON file UTILS_NEXTFLOW_PIPELINE( version, @@ -190,7 +188,6 @@ workflow PIPELINE_INITIALISATION { emit: samplesheet = SAMPLESHEET_TO_CHANNEL.out.input_sample - versions } /* diff --git a/subworkflows/local/vcf_concatenate_germline/main.nf b/subworkflows/local/vcf_concatenate_germline/main.nf index db649fdaab..bc517910cb 100644 --- a/subworkflows/local/vcf_concatenate_germline/main.nf +++ b/subworkflows/local/vcf_concatenate_germline/main.nf @@ -13,8 +13,6 @@ workflow CONCATENATE_GERMLINE_VCFS { vcfs main: - versions = channel.empty() - // Concatenate vcf-files ADD_INFO_TO_VCF(vcfs) TABIX_EXT_VCF(ADD_INFO_TO_VCF.out.vcf.map{ meta, vcf -> [ meta, vcf, [], [] ] }, 'compress', true, 'vcf') @@ -25,11 +23,7 @@ workflow CONCATENATE_GERMLINE_VCFS { GERMLINE_VCFS_CONCAT(germline_vcfs_with_tbis) GERMLINE_VCFS_CONCAT_SORT(GERMLINE_VCFS_CONCAT.out.vcf) - // Gather versions of all tools used - versions = versions.mix(ADD_INFO_TO_VCF.out.versions) - emit: vcfs = GERMLINE_VCFS_CONCAT_SORT.out.vcf // concatenated vcfs tbis = GERMLINE_VCFS_CONCAT_SORT.out.index // matching tbis - versions // channel: [ versions.yml ] } diff --git a/subworkflows/local/vcf_normalization/main.nf b/subworkflows/local/vcf_normalization/main.nf index 4c17cbe412..5b540d5958 100644 --- a/subworkflows/local/vcf_normalization/main.nf +++ b/subworkflows/local/vcf_normalization/main.nf @@ -13,8 +13,6 @@ workflow NORMALIZE_VCFS { fasta main: - versions = channel.empty() - // Add additional information to VCF files ADD_INFO_TO_VCF(vcfs) @@ -27,11 +25,7 @@ workflow NORMALIZE_VCFS { // Sort the normalized VCF files VCFS_NORM_SORT(VCFS_NORM.out.vcf) - // Gather versions of all tools used - versions = versions.mix(ADD_INFO_TO_VCF.out.versions) - emit: vcfs = VCFS_NORM_SORT.out.vcf // normalized vcfs tbis = VCFS_NORM_SORT.out.index // matching tbis - versions // Channel: [versions.yml] } diff --git a/workflows/sarek.nf b/workflows/sarek.nf index 18611e17ef..353a63d0c8 100644 --- a/workflows/sarek.nf +++ b/workflows/sarek.nf @@ -124,7 +124,6 @@ workflow SAREK { vep_genome vep_species snpsift_db // channel: [[databases], [tbis], [vardbs], [fields], [prefixes]] - versions main: // To gather all QC reports for MultiQC @@ -223,7 +222,7 @@ workflow SAREK { cram_variant_calling = channel.empty() cram_variant_calling = cram_variant_calling.mix(FASTQ_PREPROCESS_PARABRICKS.out.cram) - // Gather used softwares versions + // Gather QC reports reports = reports.mix(FASTQ_PREPROCESS_PARABRICKS.out.reports) } else { @@ -539,11 +538,6 @@ workflow SAREK { CHANNEL_VARIANT_CALLING_CREATE_CSV(vcf_to_annotate, params.outdir) - // Gather used variant calling softwares versions - versions = versions.mix(BAM_VARIANT_CALLING_GERMLINE_ALL.out.versions) - versions = versions.mix(BAM_VARIANT_CALLING_SOMATIC_ALL.out.versions) - versions = versions.mix(POST_VARIANTCALLING.out.versions) - // ANNOTATE if (step == 'annotate') { vcf_to_annotate = input_sample @@ -579,7 +573,7 @@ workflow SAREK { def collated_versions = channel.empty() if (!(skip_tools.split(',').contains('versions'))) { collated_versions = softwareVersionsToYAML( - softwareVersions: versions.mix(channel.topic("versions")), + softwareVersions: channel.topic("versions"), nextflowVersion: workflow.nextflow.version, ).collectFile( storeDir: "${params.outdir}/pipeline_info", @@ -628,7 +622,6 @@ workflow SAREK { emit: multiqc_report = MULTIQC.out.report.map { _meta, report -> [report] }.toList() // channel: /path/to/multiqc_report.html multiqc_publish = MULTIQC.out.data.mix(MULTIQC.out.plots, MULTIQC.out.report) - versions // channel: [ path(versions.yml) ] } /* From b18bf7b123682fe3e8078ea6e033d4dbec176ac8 Mon Sep 17 00:00:00 2001 From: Gary Burnett <33267967+gburnett-nvidia@users.noreply.github.com> Date: Wed, 29 Jul 2026 08:23:18 -0400 Subject: [PATCH 21/27] Add Parabricks (GPU-based) Haplotypecaller (#2176) This PR adds the Parabricks Haplotypecaller as an option for variant calling. ## PR checklist - [x] This comment contains a description of changes (with reason). - [x] If you've fixed a bug or added code that should be tested, add tests! - [x] Make sure your code lints (`nf-core pipelines lint`). - [x] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [x] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [x] Usage Documentation in `docs/usage.md` is updated. - [x] Output Documentation in `docs/output.md` is updated. - [x] `CHANGELOG.md` is updated. - [x] `README.md` is updated (including new tool citations and authors/contributors). --------- Co-authored-by: Claude Sonnet 4.6 Co-authored-by: Maxime U Garcia Co-authored-by: nf-core-bot Co-authored-by: Friederike Hanssen --- CHANGELOG.md | 1 + README.md | 1 + .../modules/parabricks_haplotypecaller.config | 35 ++ conf/test.config | 8 + docs/images/sarek_subway.png | Bin 1688402 -> 1413771 bytes docs/images/sarek_subway.svg | 2 +- docs/images/sarek_subway_animated.svg | 2 +- docs/output.md | 15 + docs/usage.md | 11 + modules.json | 5 + .../parabricks/haplotypecaller/main.nf | 64 ++ .../parabricks/haplotypecaller/meta.yml | 102 ++++ nextflow.config | 1 + nextflow_schema.json | 4 +- .../bam_variant_calling_germline_all/main.nf | 67 ++- .../main.nf | 40 ++ .../local/post_variantcalling/main.nf | 4 +- .../local/samplesheet_to_channel/main.nf | 4 +- tests/nextflow.config | 9 + ...calling_parabricks_haplotypecaller.nf.test | 63 ++ ...ng_parabricks_haplotypecaller.nf.test.snap | 557 ++++++++++++++++++ 21 files changed, 963 insertions(+), 32 deletions(-) create mode 100644 conf/modules/parabricks_haplotypecaller.config create mode 100644 modules/nf-core/parabricks/haplotypecaller/main.nf create mode 100644 modules/nf-core/parabricks/haplotypecaller/meta.yml create mode 100644 subworkflows/local/bam_variant_calling_parabricks_haplotypecaller/main.nf create mode 100644 tests/variant_calling_parabricks_haplotypecaller.nf.test create mode 100644 tests/variant_calling_parabricks_haplotypecaller.nf.test.snap diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e3f69d1b1..115879afa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,7 @@ Sarvesjåhkå is the biggest stream from Sarvesvágge to flow in Rapaätno. ### Added - [#2087](https://github.com/nf-core/sarek/pull/2087) - Add `bam` as output format for parabricks/fq2bam, add multi lane support +- [#2176](https://github.com/nf-core/sarek/pull/2176) - Add Parabricks HaplotypeCaller as GPU-accelerated germline variant caller (`--tools parabricks_haplotypecaller`) - [#2194](https://github.com/nf-core/sarek/pull/2194) - Add `--vep_cache_preflight_check` parameter to force preflight check for local VEP cache download - [#2199](https://github.com/nf-core/sarek/pull/2199) - Add animated metro map (`docs/images/sarek_subway_animated.svg`) with dots flowing through the workflow diff --git a/README.md b/README.md index f73c761058..d5deca451c 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ Depending on the options and samples provided, the pipeline can currently perfor - `freebayes` - `GATK HaplotypeCaller` - `GATK Mutect2` + - _Experimental Feature_: `Parabricks HaplotypeCaller` (GPU-accelerated germline calling, `--tools parabricks_haplotypecaller`) - `indexcov` - `Lofreq` - `Manta` diff --git a/conf/modules/parabricks_haplotypecaller.config b/conf/modules/parabricks_haplotypecaller.config new file mode 100644 index 0000000000..ea49e83f06 --- /dev/null +++ b/conf/modules/parabricks_haplotypecaller.config @@ -0,0 +1,35 @@ +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Config file for defining DSL2 per module options and publishing paths +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. + ext.when = When to run the module. +---------------------------------------------------------------------------------------- +*/ + +// PARABRICKS HAPLOTYPECALLER + +process { + + withName: 'PARABRICKS_HAPLOTYPECALLER' { + ext.args = { params.joint_germline ? "--gvcf" : "" } + ext.prefix = { params.joint_germline ? "${meta.id}.parabricks_haplotypecaller.g" : "${meta.id}.parabricks_haplotypecaller" } + publishDir = [ + enabled: false + ] + } + + withName: 'NFCORE_SAREK:SAREK:BAM_VARIANT_CALLING_GERMLINE_ALL:BAM_VARIANT_CALLING_PARABRICKS_HAPLOTYPECALLER:TABIX_BGZIPTABIX' { + ext.prefix = { params.joint_germline ? "${meta.id}.parabricks_haplotypecaller.g" : "${meta.id}.parabricks_haplotypecaller" } + publishDir = [ + mode: params.publish_dir_mode, + path: { "${params.outdir}/variant_calling/parabricks_haplotypecaller/${meta.id}/" }, + pattern: "*{vcf.gz,vcf.gz.tbi}" + ] + } + +} diff --git a/conf/test.config b/conf/test.config index beffbc64bc..9d0d070105 100644 --- a/conf/test.config +++ b/conf/test.config @@ -89,4 +89,12 @@ process { "--low-memory", ].join(' ').trim() } } + + withName: '.*:PARABRICKS_HAPLOTYPECALLER' { + // GPU OOM on the g4dn.xlarge CI runners (Tesla T4, 15 GiB VRAM) without this flag + ext.args = { [ + params.joint_germline ? "--gvcf" : "", + "--htvc-low-memory", + ].join(' ').trim() } + } } diff --git a/docs/images/sarek_subway.png b/docs/images/sarek_subway.png index a743478a591c577df5be82ad92565e43167bf292..8dcdfe7bb37497f5d21ccc989c89badebb65b79a 100644 GIT binary patch literal 1413771 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%0D2O?HrxVaYX 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 z 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®miEcvs>dJXVG3!Xm>o-5BP^Z=7sQWGs3-6>nJ{{?;7)c zGJxL#05&Gn&oeG#3=;e>NZJSi+8$y!y7$Z#;C77W2HKuziO>@=ercfsGV<8oor=&C zkAatkibg41C!^S{zq+n(e6Y>jMp^4*rxKS5g9wY0=f!03;sgwU;B^Ui05byEV)GLk zwv2BZ-Ee2b>qeM?GVp#-P|(LmHkFP&|-Kn43}8`PQj)#=1}UX!TEI zjd3jj#-C3Q`kP`<7_5>Cz9|Yr!X^#qJ(~>ZO%$_*TDl?{Zf*pKqaw%9?(pwJf2dC5 zZJYq-e(BOKMT7GmeWtbkVQCJ%;C-;wC955RDs-P!qTZ`RuZvI0eHyTPTp4QeZ=I^m+2?Z$C$N!;sLF5Yr=> zVS**%#sPNJn)LLVf%a+rZPXOQP>T{n9-C)C(!hWn^J+Ks^jHMW-;6ZQhnxXn=r5jm zgR|l5YmxSA`&iYd8}lsdqZS^X6fOUa+qvhbaIQG$19$WjbHoE=i;yg2h0DIE*y2h8s4Jp}hjADW<*m0tjoug%ZQjNz`b?w;>(zMK@)W zwOoeb4<0HNIXdm~uj!9oKw_Ri*91SnZ3QDjGmzLgJa#g+coD^3OfVq zPgT;?qW1_=vFMg1-wu4l45_U0Z>Cm1K2hx%AISX>xWOow{4rtu?z~#!7xK4p$@JPB z=u^wbz^Ne#%r7v7I#3&EV&$F{n5iGfFPSG6m|>7zJv~4u?M3Z<<6?F0J>?!wUJGUP^L?$(WMfpnf zsz(gtT0?HCsOzNY0%Y#9}#Rj(5t_|S=*3{Nw?v{m_`GU4ly0TTNhY9sKY#Z7!^G7rEK_<$Vf~jFe+1x#G(*E z2SYub@y0%X^(I^*uo*XS=d^r~CS|fs#Nbo{*p)%h_;;5-E$@LJq{H6{{cwNQY4lY= zO)7Ju#w5u4$_oNfgmnjG#9%w6?^B$w*4j-1wX)3m zk#e%f@AmZ5qjwDPm5Oqv%)5j0jJ*w>!d$0G+PtG-xOSwEwoaKr?j*P3Z_q}J# zZik=(?Ew5Z=?WMLKPx?bqbsl)3)vfHdwmZ52Lxrc^erNt^U|2s2OV)BN8FnX?|Z+L z=V{X)kR-E7c`CC|-uOJ~=-08Hra{d0%k?P4nZi9s^+dA=K^*x}G68H?(WSCyzREG&AG4lECwF5jb zc~zfPAj9DtpoNwwdB+a@U;qu7gaOs?K%Uz<3%0-L%%0YcF07uR>fV0V!1?I#yJyyG zvH*(*dwHb)UvxkOKFD3X00d9FJQh)jvE2R|jig7K38pc~GiRZn7dVV!iHpluAS4x5 z+Sqz7A4QlY;f`peJ3Lk3HYmDAWjf77eRi%5p%
    ~dBqN*T6}+OA2);q9*2tdiToC^2S+JLHK37! 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%0Dki1NoczWc+3kaDb1TVZ#fJyot}HGJ8K^y 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 z%0D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ⅇ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∾}U%$t}>*357e*Bp1mTQZ} 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%0A00E2gHe>tR%#~@%@n(|=4LlQfrQ88 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

    1o8+>8Yr#|dogfVy;K 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