From 454e3fd2602ae047be9c95007640434aa1f031b4 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Wed, 27 May 2026 15:44:17 +0200 Subject: [PATCH 01/62] drop plugin config (#173) --- .nf-core.yml | 2 +- CHANGELOG.md | 6 +++++- assets/multiqc_config.yml | 2 +- nextflow.config | 18 +----------------- ro-crate-metadata.json | 21 ++++++++++++--------- 5 files changed, 20 insertions(+), 29 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 4aaaf730..28d8bd53 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -39,4 +39,4 @@ template: org: nf-cmgg outdir: . skip_features: ["fastqc"] - version: 3.0.1 + version: 3.0.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd8426d..3a589fd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## 3.0.1dev +## 3.0.2 + +- remove common plugins in favor of defining them in the nf-cmgg/configs, which will be used across all nf-cmgg pipelines. This allows for better version control and consistency across pipelines, as well as reducing the maintenance burden of keeping plugins up to date in multiple repositories. + +## 3.0.1 - Add parameter typing to make strict syntax runs work more properly - Bumped minimal Nextflow version to 26.04.0 to allow for strict syntax and other improvements diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 7daf70f9..349aabe1 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,5 +1,5 @@ report_comment: > - This report has been generated by the nf-cmgg/preprocessing analysis pipeline. + This report has been generated by the nf-cmgg/preprocessing analysis pipeline. report_section_order: "nf-cmgg-preprocessing-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 87dc61c4..20e156f9 100644 --- a/nextflow.config +++ b/nextflow.config @@ -197,16 +197,13 @@ manifest { mainScript = 'main.nf' defaultBranch = 'main' nextflowVersion = '!>=26.04.0' - version = '3.0.1' + version = '3.0.2' doi = '' } // Nextflow plugins plugins { - id 'nf-cgroup-metrics@1.0.1' - id 'nf-cmgg@0.2.1' id 'nf-schema@2.7.2' - id 'nf-teams@0.1.1' } validation { @@ -214,19 +211,6 @@ validation { monochromeLogs = params.monochrome_logs.toBoolean() } -// TODO remove this once minimal nf-version is 26.0X with strict syntax. -cmgg { - samplesheets.enabled = true - done.enabled = true -} -teams { - enabled = true - webHook { - url = params.hook_url ? params.hook_url : System.getenv('TEAMS_WEBHOOK_URL') - } - onComplete.enabled = true -} - // Load modules.config for DSL2 module specific options includeConfig 'conf/modules.config' diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index 3edf3ff6..e66cfe12 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -22,7 +22,7 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2026-05-19T19:42:24+00:00", + "datePublished": "2026-05-27T13:33:39+00:00", "description": "# nf-cmgg/preprocessing\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-cmgg/preprocessing)\n[![GitHub Actions CI Status](https://github.com/nf-cmgg/preprocessing/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-cmgg/preprocessing/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-cmgg/preprocessing/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-cmgg/preprocessing/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A526.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with 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-cmgg/preprocessing)\n\n## Introduction\n\n**nf-cmgg/preprocessing** is a bioinformatics pipeline that demultiplexes and aligns raw sequencing data.\nIt also performs basic QC and coverage analysis.\n\nThe pipeline is built using Nextflow, a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible.\n\nSteps include:\n\n- Demultiplexing using [`BCLconvert`](https://emea.support.illumina.com/sequencing/sequencing_software/bcl-convert.html)\n- Run QC using [`MultiQC SAV`](https://github.com/MultiQC/MultiQC_SAV)\n- Read QC and trimming using [`fastp`](https://github.com/OpenGene/fastp) or [`falco`](https://github.com/smithlabcode/falco)\n- Alignment using either [`bwa`](https://github.com/lh3/bwa), [`bwa-mem2`](https://github.com/bwa-mem2/bwa-mem2), [`bowtie2`](https://github.com/BenLangmead/bowtie2), [`dragmap`](https://github.com/Illumina/DRAGMAP), [`snap`](https://github.com/amplab/snap) or [`strobe`](https://github.com/ksahlin/strobealign) for DNA-seq and [`STAR`](https://github.com/alexdobin/STAR) for RNA-seq\n- Duplicate marking using [`bamsormadup`](https://gitlab.com/german.tischler/biobambam2) or [`samtools markdup`](http://www.htslib.org/doc/samtools-markdup.html)\n- Coverage analysis using [`mosdepth`](https://github.com/brentp/mosdepth) and [`samtools coverage`](http://www.htslib.org/doc/samtools-coverage.html)\n- Alignment QC using [`samtools flagstat`](http://www.htslib.org/doc/samtools-flagstat.html), [`samtools stats`](http://www.htslib.org/doc/samtools-stats.html), [`samtools idxstats`](http://www.htslib.org/doc/samtools-idxstats.html) and [`picard CollectHsMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectHsMetrics), [`picard CollectWgsMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectWgsMetrics), [`picard CollectMultipleMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectMultipleMetrics)\n- QC aggregation using [`multiqc`](https://multiqc.info/)\n\n\n\n \n \n \"Fallback\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\nThe full documentation can be found [here](docs/README.md)\n\nFirst, prepare a samplesheet with your input data. Check the [usage docs](docs/usage.md) for details on the required format and example files.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-cmgg/preprocessing \\\n -profile \\\n --igenomes_base /path/to/genomes \\\n --input samplesheet. \\\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**_;\n> see [docs](https://nf-co.re/usage/configuration#custom-configuration-files).\n\n## Development environment\n\nA [pixi](https://pixi.prefix.dev/latest/) development environment is available for this pipeline. Run the following command to install the environment:\n\n```\npixi install\n```\n\nThen run `pixi shell` to enter the environment and start developing.\n\n## Credits\n\nnf-cmgg/preprocessing was originally written by the CMGG ICT team.\n\n## Support\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/master/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { @@ -102,7 +102,7 @@ }, "mentions": [ { - "@id": "#5cac7e80-de46-45b1-a79f-4bce656b0d47" + "@id": "#cb12ae76-cc32-4dd8-b67d-d06d643513d2" } ], "name": "nf-cmgg/preprocessing" @@ -134,8 +134,11 @@ "@id": "https://orcid.org/0000-0003-2555-3114" } ], - "dateCreated": "", - "dateModified": "2026-05-19T21:42:24Z", + "dateCreated": [ + "", + "2026-05-20T09:02:37Z" + ], + "dateModified": "2026-05-27T15:33:39Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -163,10 +166,10 @@ }, "url": [ "https://github.com/nf-cmgg/preprocessing", - "https://nf-co.re/nf-cmgg/preprocessing/3.0.1/" + "https://nf-co.re/nf-cmgg/preprocessing/3.0.2/" ], "version": [ - "3.0.1" + "3.0.2" ] }, { @@ -182,11 +185,11 @@ "version": "!>=26.04.0" }, { - "@id": "#5cac7e80-de46-45b1-a79f-4bce656b0d47", + "@id": "#cb12ae76-cc32-4dd8-b67d-d06d643513d2", "@type": "TestSuite", "instance": [ { - "@id": "#fc81fe8f-371d-4a82-b52b-8b2262a9f3ca" + "@id": "#f36a54e6-3b86-47eb-8f1d-f94369a34a5c" } ], "mainEntity": { @@ -195,7 +198,7 @@ "name": "Test suite for nf-cmgg/preprocessing" }, { - "@id": "#fc81fe8f-371d-4a82-b52b-8b2262a9f3ca", + "@id": "#f36a54e6-3b86-47eb-8f1d-f94369a34a5c", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-cmgg/preprocessing", "resource": "repos/nf-cmgg/preprocessing/actions/workflows/nf-test.yml", From a6d22e33ac323e9b862b66974df075cc955948d9 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Sun, 14 Jun 2026 07:46:57 +0200 Subject: [PATCH 02/62] enable apple containers --- nextflow.config | 109 ++++++++++++++++++++++++++++-------------------- 1 file changed, 63 insertions(+), 46 deletions(-) diff --git a/nextflow.config b/nextflow.config index 20e156f9..5b2dff0c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -34,14 +34,15 @@ profiles { nextflow.enable.configProcessNamesValidation = true } docker { - docker.enabled = true - conda.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false - docker.runOptions = '-u $(id -u):$(id -g)' + appleContainer.enabled = false + apptainer.enabled = false + charliecloud.enabled = false + conda.enabled = false + docker.enabled = true + docker.runOptions = '-u $(id -u):$(id -g)' + podman.enabled = false + shifter.enabled = false + singularity.enabled = false } arm64 { process.arch = 'arm64' @@ -54,62 +55,78 @@ profiles { wave.freeze = true wave.strategy = ["conda", "container"] } + apple { + appleContainer.enabled = true + apptainer.enabled = false + charliecloud.enabled = false + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = false + singularity.enabled = false + } emulate_amd64 { - docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' + appleContainer.runOptions = '-u $(id -u):$(id -g) --arch amd64' + docker.runOptions = '-u $(id -u):$(id -g) --platform=linux/amd64' } singularity { - singularity.enabled = true - singularity.autoMounts = true + appleContainer.enabled = false + apptainer.enabled = false + charliecloud.enabled = false conda.enabled = false docker.enabled = false podman.enabled = false shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + singularity.autoMounts = true + singularity.enabled = true } podman { - podman.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - shifter.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + appleContainer.enabled = false + apptainer.enabled = false + charliecloud.enabled = false + conda.enabled = false + docker.enabled = false + podman.enabled = true + shifter.enabled = false + singularity.enabled = false } shifter { - shifter.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - charliecloud.enabled = false - apptainer.enabled = false + appleContainer.enabled = false + apptainer.enabled = false + charliecloud.enabled = false + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = true + singularity.enabled = false } charliecloud { - charliecloud.enabled = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - apptainer.enabled = false + appleContainer.enabled = false + apptainer.enabled = false + charliecloud.enabled = true + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = false + singularity.enabled = false } apptainer { - apptainer.enabled = true - apptainer.autoMounts = true - conda.enabled = false - docker.enabled = false - singularity.enabled = false - podman.enabled = false - shifter.enabled = false - charliecloud.enabled = false + appleContainer.enabled = false + apptainer.autoMounts = true + apptainer.enabled = true + charliecloud.enabled = false + conda.enabled = false + docker.enabled = false + podman.enabled = false + shifter.enabled = false + singularity.enabled = false } wave { - apptainer.ociAutoPull = true - singularity.ociAutoPull = true - wave.enabled = true - wave.freeze = true wave.strategy = ["conda", "container"] + wave.freeze = true + wave.enabled = true + singularity.ociAutoPull = true + apptainer.ociAutoPull = true } gpu { docker.runOptions = '-u $(id -u):$(id -g) --gpus all' From 02bbec79942dc49045f886a0b45cf9f70d67e425 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Fri, 5 Jun 2026 13:23:58 +0200 Subject: [PATCH 03/62] install/update modules --- conf/containers_conda_lock_files_amd64.config | 4 +- conf/containers_conda_lock_files_arm64.config | 4 +- conf/containers_docker_amd64.config | 4 +- conf/containers_docker_arm64.config | 4 +- .../containers_singularity_https_amd64.config | 4 +- .../containers_singularity_https_arm64.config | 4 +- conf/containers_singularity_oras_amd64.config | 4 +- conf/containers_singularity_oras_arm64.config | 4 +- modules.json | 9 +- .../linux_amd64-bd-c17fb751507e9dfc_1.txt | 1526 ++++++++++++++ .../linux_amd64-bd-db7c73dae76bc9e6_1.txt | 126 -- .../linux_arm64-bd-5c84a5000a226ab5_1.txt | 1476 +++++++++++++ .../linux_arm64-bd-d167b8012595a136_1.txt | 125 -- modules/nf-core/multiqc/environment.yml | 2 +- modules/nf-core/multiqc/main.nf | 4 +- modules/nf-core/multiqc/meta.yml | 28 +- .../nf-core/multiqc/tests/main.nf.test.snap | 10 +- .../linux_amd64-bd-644a84cef31cc4aa_1.txt | 131 -- .../linux_amd64-bd-9b10d606ce2f36b6_1.txt | 1837 +++++++++++++++++ .../linux_arm64-bd-039d1ec6b47ba325_1.txt | 130 -- .../linux_arm64-bd-077315907ed11315_1.txt | 1825 ++++++++++++++++ modules/nf-core/multiqcsav/environment.yml | 4 +- modules/nf-core/multiqcsav/main.nf | 4 +- modules/nf-core/multiqcsav/meta.yml | 28 +- .../multiqcsav/tests/main.nf.test.snap | 4 +- modules/nf-core/riker/multi/environment.yml | 7 + modules/nf-core/riker/multi/main.nf | 81 + modules/nf-core/riker/multi/meta.yml | 267 +++ .../nf-core/riker/multi/tests/main.nf.test | 344 +++ .../riker/multi/tests/main.nf.test.snap | 1244 +++++++++++ .../nf-core/riker/multi/tests/nextflow.config | 5 + 31 files changed, 8677 insertions(+), 572 deletions(-) create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt delete mode 100644 modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt create mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt delete mode 100644 modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt delete mode 100644 modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-644a84cef31cc4aa_1.txt create mode 100644 modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt delete mode 100644 modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-039d1ec6b47ba325_1.txt create mode 100644 modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt create mode 100644 modules/nf-core/riker/multi/environment.yml create mode 100644 modules/nf-core/riker/multi/main.nf create mode 100644 modules/nf-core/riker/multi/meta.yml create mode 100644 modules/nf-core/riker/multi/tests/main.nf.test create mode 100644 modules/nf-core/riker/multi/tests/main.nf.test.snap create mode 100644 modules/nf-core/riker/multi/tests/nextflow.config diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config index c8184a2d..1280a9e1 100644 --- a/conf/containers_conda_lock_files_amd64.config +++ b/conf/containers_conda_lock_files_amd64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt' } } -process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-644a84cef31cc4aa_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' } } +process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt' } } diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config index 2f7b575a..d08dd327 100644 --- a/conf/containers_conda_lock_files_arm64.config +++ b/conf/containers_conda_lock_files_arm64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt' } } -process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-039d1ec6b47ba325_1.txt' } } +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' } } +process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt' } } diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config index 78d2a3f2..00c5e960 100644 --- a/conf/containers_docker_amd64.config +++ b/conf/containers_docker_amd64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6' } } -process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:644a84cef31cc4aa' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc' } } +process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9b10d606ce2f36b6' } } diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config index cb309025..14270ce7 100644 --- a/conf/containers_docker_arm64.config +++ b/conf/containers_docker_arm64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.34--d167b8012595a136' } } -process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:039d1ec6b47ba325' } } +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5' } } +process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:077315907ed11315' } } diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config index a53b4e19..df7923dd 100644 --- a/conf/containers_singularity_https_amd64.config +++ b/conf/containers_singularity_https_amd64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' } } -process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/45/4590c19f294469392d1bd2689eb9d4a06f18d20f64c5dbc0bbc17473c9941b4e/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' } } +process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c1/c1311ac2bfb96d77487985fce321b25bbea85f574f9932b827ed6cafe7f75963/data' } } diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config index 06c0dd3f..e486ec26 100644 --- a/conf/containers_singularity_https_arm64.config +++ b/conf/containers_singularity_https_arm64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/data' } } -process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b047611068a4009d62d8352e8bb4ab27fa993708a82c029f115e6758b2e44bec/data' } } +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data' } } +process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/05/053f6d8c55b57e04b654070a3bd6eaa90685590158019d35c16092d301b80cb1/data' } } diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config index fe83b990..31457ab0 100644 --- a/conf/containers_singularity_oras_amd64.config +++ b/conf/containers_singularity_oras_amd64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--4fc8657c816047c0' } } -process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9ebe780f2738c655' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2' } } +process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:a26da1aa4e8d32a6' } } diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config index fffe6e07..bad6f0f2 100644 --- a/conf/containers_singularity_oras_arm64.config +++ b/conf/containers_singularity_oras_arm64.config @@ -1,2 +1,2 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.34--7fbd82d945c06726' } } -process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:fc57bb53140baade' } } +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81' } } +process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:d1ed21d66511158d' } } diff --git a/modules.json b/modules.json index 328d7a78..3d86c345 100644 --- a/modules.json +++ b/modules.json @@ -68,12 +68,12 @@ }, "multiqc": { "branch": "master", - "git_sha": "008f9d3e61209bf995edac3ba531f54e269e1215", + "git_sha": "98403d15b0e50edae1f3fec5eae5e24982f1fade", "installed_by": ["modules"] }, "multiqcsav": { "branch": "master", - "git_sha": "008f9d3e61209bf995edac3ba531f54e269e1215", + "git_sha": "98403d15b0e50edae1f3fec5eae5e24982f1fade", "installed_by": ["modules"] }, "picard/collecthsmetrics": { @@ -94,6 +94,11 @@ "installed_by": ["modules"], "patch": "modules/nf-core/picard/collectwgsmetrics/picard-collectwgsmetrics.diff" }, + "riker/multi": { + "branch": "master", + "git_sha": "b2523041e2b941afdfbd5b3b6bc099437495f70d", + "installed_by": ["modules"] + }, "samtools/convert": { "branch": "master", "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", diff --git a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt new file mode 100644 index 00000000..2a91c22d --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt @@ -0,0 +1,1526 @@ + +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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- 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.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.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.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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.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/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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.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.42.1-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/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +- 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_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.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.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 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +- 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.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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_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/yaml-0.2.5-h280c20c_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda +noarch: generic +sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe +md5: 1133126d840e75287d83947be3fc3e71 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7533 +timestamp: 1778594057496 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 +md5: 8910d2c46f7e7b519129f486e0fe927a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 hb03c661_1 +license: MIT +license_family: MIT +size: 367376 +timestamp: 1764017265553 +- 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.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f +depends: +- __unix +license: ISC +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: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 +depends: +- __unix +- 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 +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +noarch: generic +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +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.1 hecca717_0 +- libgcc >=14 +license: MIT +license_family: MIT +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 +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.18.0-h27c8c51_0.conda +sha256: e798086d8a65d55dc4c51f5746705639c9a5f2eeb0b8fc50e6152cfc0d69a4e8 +md5: 06965b2f9854d0b15e0443ee81fe83dc +depends: +- __glibc >=2.17,<3.0.a0 +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- libgcc >=14 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 280882 +timestamp: 1779421631622 +- 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/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- 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: 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 +size: 34766 +timestamp: 1779714582554 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +sha256: 7f243680ca03eba7457b7a48f93a9440ba8181a8eac20a3eb5ef165ab6c96664 +md5: b3723b235b0758abaae8c82ce4d80146 +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 62099926 +timestamp: 1615199463039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda +sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 +md5: f92f984b558e6e6204014b16d212b271 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.4.1,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 251086 +timestamp: 1778079286384 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c +md5: 18335a698559cdbcd86150a48bf54ba6 +depends: +- __glibc >=2.17,<3.0.a0 +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 728002 +timestamp: 1774197446916 +- 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/libblas-3.11.0-7_h4a7cf45_openblas.conda +build_number: 7 +sha256: 081c850f99bc355821fac9c6e3727d40b3f8ce3beb50a5437cf03726b611ff39 +md5: 955b44e8b00b7f7ef4ce0130cef12394 +depends: +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<1.0a0 +constrains: +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas +- liblapacke 3.11.0 7*_openblas +- mkl <2027 +license: BSD-3-Clause +license_family: BSD +size: 18716 +timestamp: 1778489854108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda +build_number: 7 +sha256: 956ae0bb1ec8b0c3663d75b151aceb0521b54e513bf97f621a035f9c87037970 +md5: 0675639dc24cb0032f199e7ff68e4633 +depends: +- libblas 3.11.0 7_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18675 +timestamp: 1778489861559 +- 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/libexpat-2.8.1-hecca717_0.conda +sha256: 363018b25fdb5534c79783d912bd4b685a3547f4fc5996357ad548899b0ee8e7 +md5: 93764a5ca80616e9c10106cdaec92f74 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- expat 2.8.1.* +license: MIT +license_family: MIT +size: 77294 +timestamp: 1779278686680 +- 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_19.conda +sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 +md5: 57736f29cc2b0ec0b6c2952d3f101b6a +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_19 +- libgomp 15.2.0 he0feb66_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1041084 +timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 +md5: 331ee9b72b9dff570d56b1302c5ab37d +depends: +- libgcc 15.2.0 he0feb66_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27694 +timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f +md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 +depends: +- libgfortran5 15.2.0 h68bc16d_19 +constrains: +- libgfortran-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27655 +timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 +md5: 85072b0ad177c966294f129b7c04a2d5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 2483673 +timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b +md5: faac990cb7aedc7f3a2224f2c9b0c26c +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 603817 +timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 +md5: 6178c6f2fb254558238ef4e6c56fb782 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 633831 +timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +build_number: 7 +sha256: 96962084921f197c9ad13fb7f8b324f2351d50ff3d8d962148751ad532f54a01 +md5: 6569b4f273740e25dc0dc7e3232c2a6c +depends: +- libblas 3.11.0 7_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +license: BSD-3-Clause +license_family: BSD +size: 18694 +timestamp: 1778489869038 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda +sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d +md5: b88d90cad08e6bc8ad540cb310a761fb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.3.* +license: 0BSD +size: 113478 +timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 +md5: 2c21e66f50753a083cbe6b80f38268fa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 92400 +timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 +md5: 2d3278b721e40468295ca755c3b84070 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.33,<0.3.34.0a0 +license: BSD-3-Clause +license_family: BSD +size: 5931919 +timestamp: 1776993658641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 +md5: eba48a68a1a2b9d3c0d9511548db85db +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: zlib-acknowledgement +size: 317729 +timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d +md5: 7dc38adcbf71e6b38748e919e16e0dce +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: blessing +size: 954962 +timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda +sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc +md5: 5794b3bdc38177caf969dabd3af08549 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_19 +constrains: +- libstdcxx-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5852044 +timestamp: 1778269036376 +- 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.42.1-h5347b49_0.conda +sha256: 3f0edf1280e2f6684a986f821eaa3e123d2694a00b31b96ca0d4a4c12c129231 +md5: 7d0a66598195ef00b6efc55aefc7453b +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 +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/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/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 69017 +timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf +md5: 9a17c4307d23318476d7fbf0fedc0cde +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27424 +timestamp: 1772445227915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +sha256: 02fef69bde69db264a12f21386612262f545b6e3e68d8f1ccec19f3eaae58edf +md5: 86e69bd82c2a2c6fd29f5ab7e02b3691 +license: Apache-2.0 +license_family: Apache +size: 22281629 +timestamp: 1662784498331 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- 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 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard >=4 +license: GPL-3.0-or-later +license_family: GPL3 +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 284323 +timestamp: 1778929680962 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda +sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 +md5: fc21868a1a5aacc937e7a18747acb8a5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: X11 AND BSD-3-Clause +size: 918956 +timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +sha256: e3664264bd936c357523b55c71ed5a30263c6ba278d726a75b1eb112e6fb0b64 +md5: e235d5566c9cc8970eb2798dd4ecf62f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 228588 +timestamp: 1762348634537 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +sha256: 44dd98ffeac859d84a6dcba79a2096193a42fc10b29b28a5115687a680dd6aea +md5: 567fbeed956c200c1db5782a424e58ee +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2057773 +timestamp: 1763485556350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda +sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 +md5: f49b5f950379e0b97c35ca97682f7c6a +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- liblapack >=3.9.0,<4.0a0 +- python_abi 3.14.* *_cp314 +- libblas >=3.9.0,<4.0a0 +- libcblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8928909 +timestamp: 1779169198391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d +md5: 11b3379b191f63139e29c0d19dee24cd +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 355400 +timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda +sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb +md5: da1b85b6a87e141f5140bb9924cecab0 +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3167099 +timestamp: 1775587756857 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda +sha256: 123d8a7c16c88658b4f29e9f115a047598c941708dade74fbaff373a32dbec5e +md5: 76c4757c0ec9d11f969e8eb44899307b +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libtiff >=4.7.1,<4.8.0a0 +- openjpeg >=2.5.4,<3.0a0 +- libxcb >=1.17.0,<2.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- python_abi 3.14.* *_cp314 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- lcms2 >=2.18,<3.0a0 +- tk >=8.6.13,<8.7.0a0 +license: HPND +size: 1082797 +timestamp: 1775060059882 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 +depends: +- polars-runtime-32 ==1.41.0 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 +license: MIT +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: 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 +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 +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/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- annotated-types >=0.6.0 +- pydantic-core ==2.46.4 +- python +license: MIT +license_family: MIT +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda +sha256: 802e216c39f1359aed60823b6e11d8ccd812b0ae1c81ae5ac1c81f99446409ab +md5: 0c96993dbeadf3a277cf757b9f1c9412 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1895020 +timestamp: 1778084229247 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 +depends: +- python >=3.10 +license: BSD-2-Clause +license_family: BSD +size: 893031 +timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda +build_number: 100 +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.8.0,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.3,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- openssl >=3.5.6,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +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 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff +depends: +- cpython 3.14.5.* +- python_abi * *_cp314 +license: Python-2.0 +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 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d +md5: 2035f68f96be30dc60a5dfd7452c7941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 202391 +timestamp: 1770223462836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 +md5: d7d95fc8287ea7bf33e0e7116d2b95ec +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 345073 +timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +sha256: c7a4aca4977c15c82d053b06cbc676460974c1b25757cfeea8a9a2497ac911f8 +md5: 9dd235b6ac69a0198080dac39f9891aa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 413611 +timestamp: 1778374155646 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 +depends: +- python >=3.10 +- certifi >=2023.5.7 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.26,<3 +- python +constrains: +- chardet >=3.0.2,<8 +license: Apache-2.0 +license_family: APACHE +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208577 +timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 +md5: c1c368b5437b0d1a68f372ccf01cb133 +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376121 +timestamp: 1764543122774 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda +sha256: d167fa92781bcdcd3b9aaa6bb1cd50c5b108f6190c170098a118b5cf5df2f881 +md5: 8e0b8654ead18e50af552e54b5a08a61 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite 3.53.1 h0c1763c_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 205399 +timestamp: 1777986477546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +sha256: 7e395d67fd249d901beb1ae269057763c0d8c3ee5f7a348694bdb16d158a37d9 +md5: d705f9d8a1185a2b01cced191177a028 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 939648 +timestamp: 1764028306357 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac +md5: cffd3bdd58090148f4cfcd831f4b26ab +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3301196 +timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae +depends: +- typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 38297 +timestamp: 1778779291237 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +- python +license: MIT +license_family: MIT +size: 20935 +timestamp: 1777105465795 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103560 +timestamp: 1778188657149 +- 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/yaml-0.2.5-h280c20c_3.conda +sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad +md5: a77f85f77be52ff59391544bfe73390a +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +size: 85189 +timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24190 +timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f +md5: 2aadb0d17215603a82a2a6b0afd9a4cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 122618 +timestamp: 1770167931827 +- 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/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt deleted file mode 100644 index a55a4d49..00000000 --- a/modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-db7c73dae76bc9e6_1.txt +++ /dev/null @@ -1,126 +0,0 @@ - -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: linux-64 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb -https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb -https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 -https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 -https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 -https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda#7de50d165039df32d38be74c1b34a910 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda#867127763fbe935bab59815b6e0b7b5c -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda#c1c368b5437b0d1a68f372ccf01cb133 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 -https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2#86e69bd82c2a2c6fd29f5ab7e02b3691 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda#e235d5566c9cc8970eb2798dd4ecf62f -https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda#567fbeed956c200c1db5782a424e58ee -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 -https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2#b3723b235b0758abaae8c82ce4d80146 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 -https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 -https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 -https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b -https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 -https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a -https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.0-py310hffdcd12_0.conda#8eacf9ff4d4e1ca1b52f8f3ba3e0c993 -https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 -https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.40.0-py310hbcd5346_0.conda#03a6899e17bb731c8e21b08212f1a64c -https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda#2035f68f96be30dc60a5dfd7452c7941 -https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda#1f3fd537f929b8d3236f9f0f0e7f7a32 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 -https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c -https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 -https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 -https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 -https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a -https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py314h5bd0f2a_0.conda#4ffb42385183c854564f1f9adcf80a63 -https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda#d705f9d8a1185a2b01cced191177a028 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 -https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b -https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f -https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda#f2c23a77b25efcad57d377b34bd84941 diff --git a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt new file mode 100644 index 00000000..3d5b93db --- /dev/null +++ b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt @@ -0,0 +1,1476 @@ + +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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- 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.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.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.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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.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/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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.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.42.1-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/libzlib-1.3.2-hdc9db2a_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +- 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_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.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.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 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +- 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.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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.5.9-py314h51f160d_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_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/yaml-0.2.5-h80f16a2_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda +noarch: generic +sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe +md5: 1133126d840e75287d83947be3fc3e71 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +size: 7533 +timestamp: 1778594057496 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda +sha256: 5a5b0cdcd7ed89c6a8fb830924967f6314a2b71944bc1ebc2c105781ba97aa75 +md5: a1b5c571a0923a205d663d8678df4792 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 he30d5cf_1 +license: MIT +license_family: MIT +size: 373193 +timestamp: 1764017486851 +- 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.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f +depends: +- __unix +license: ISC +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: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 +depends: +- __unix +- 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 +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +noarch: generic +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +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.1 hfae3067_0 +- libgcc >=14 +license: MIT +license_family: MIT +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 +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.18.0-hba86a56_0.conda +sha256: 1805f4ab3d9e1734a5a17abccc2cb0fdade51d4d5f29bdc410600ea0115ec050 +md5: b660d59a9d0fb3297327418624acaec3 +depends: +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- libgcc >=14 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +size: 293348 +timestamp: 1779421661332 +- 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/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 17397 +timestamp: 1737618427549 +- 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: 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 +size: 34766 +timestamp: 1779714582554 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +sha256: d3c7f4797566e6f983d16c2a87063a18e4b2d819a66230190a21584d70042755 +md5: 4f0d284f5d11e04277b552eb1c172c7f +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +size: 65750397 +timestamp: 1615199465742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda +sha256: 1e5f68e4b36a0e1a278c6dc026bc3d7775518a15832cbc9d7fc1c0e4c47784b1 +md5: b1f8bee3c53a6d2c103fb4a1ae44f5c4 +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.4.1,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +size: 296899 +timestamp: 1778079402392 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 +md5: a21644fc4a83da26452a718dc9468d5f +depends: +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-aarch64 2.45.1 +license: GPL-3.0-only +license_family: GPL +size: 875596 +timestamp: 1774197520746 +- 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/libblas-3.11.0-7_haddc8a3_openblas.conda +build_number: 7 +sha256: f27ba323c2f1e1731b5e880fe520f178f55047f25be94f77e649605b2343c066 +md5: e8d07b777f6ff1fab69665336561910b +depends: +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<1.0a0 +constrains: +- liblapack 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- mkl <2027 +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18696 +timestamp: 1778489796402 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-7_hd72aa62_openblas.conda +build_number: 7 +sha256: c8f0192362966df0828419f042d6f94c079e5df00ad6bd05b5e84c12b42f8cc7 +md5: 90ac57b82c055faa9be25031864b7d8f +depends: +- libblas 3.11.0 7_haddc8a3_openblas +constrains: +- liblapack 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18664 +timestamp: 1778489802790 +- 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/libexpat-2.8.1-hfae3067_0.conda +sha256: 1fc392b997c6ee2bd3226a7cd870d0edbcbb367e25f9f18dd4a7025fced6efc0 +md5: 513dd884361dfb8a554298ed69b58823 +depends: +- libgcc >=14 +constrains: +- expat 2.8.1.* +license: MIT +license_family: MIT +size: 77140 +timestamp: 1779278671302 +- 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_19.conda +sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 +md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a +depends: +- _openmp_mutex >=4.5 +constrains: +- libgomp 15.2.0 h8acb6b2_19 +- libgcc-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 622462 +timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +sha256: 1137f93f477f56199ded24117430045a0c02cbe8b10031beac3b9ad2138539d3 +md5: 770cf892e5530f43e63cadc673e85653 +depends: +- libgcc 15.2.0 h8acb6b2_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27738 +timestamp: 1778268759211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +sha256: e5ad94be72634233510b33ba792a3339921bd468f0b8bc6961ea05eded251d9b +md5: c7a5b5decf969ead5ecada83654164cf +depends: +- libgfortran5 15.2.0 h1b7bec0_19 +constrains: +- libgfortran-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 27728 +timestamp: 1778268784621 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +sha256: af8e9bdcaa77f133a8ee4c1ef57ef564d9c45aa262abf9f5ef9b50eb99d96407 +md5: 779dbb494de6d3d6477cab52eb34285a +depends: +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 1487244 +timestamp: 1778268767295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 +md5: c5e8a379c4a2ec2aea4ba22758c001d9 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 587387 +timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +sha256: e97ec2af5f09f8f6ea8ecd550055c95ae80fae22015fcfadaa94eafe025c9ccc +md5: a85ba48648f6868016f2741fd9170250 +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +size: 693143 +timestamp: 1775962625956 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +build_number: 7 +sha256: 20b38a0156200ac65f597bf0a93914c565435f2cc58b1042581854231a99ac35 +md5: 5899cbd743cc74fd655c1ed2af7120f3 +depends: +- libblas 3.11.0 7_haddc8a3_openblas +constrains: +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +size: 18685 +timestamp: 1778489809140 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda +sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c +md5: 76298a9e6d71ee6e832a8d0d7373b261 +depends: +- libgcc >=14 +constrains: +- xz 5.8.3.* +license: 0BSD +size: 126102 +timestamp: 1775828008518 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda +sha256: 57c0dd12d506e84541c4e877898bd2a59cca141df493d34036f18b2751e0a453 +md5: 7b9813e885482e3ccb1fa212b86d7fd0 +depends: +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +size: 114056 +timestamp: 1769482343003 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +sha256: b018ecfb05e75a8eea3f21f6b5c5c2a54b5178bdcf19e2e2df2735740214a8c8 +md5: 58a66cd95e9692f08abe89f55a6f3f12 +depends: +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.33,<0.3.34.0a0 +license: BSD-3-Clause +license_family: BSD +size: 5121336 +timestamp: 1776993423004 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +sha256: 483eaa53da40a6a3e558709d9f7b1ca388735364ae21a1ba58cf942514649c92 +md5: f51503ac45a4888bce71af9027a2ecc9 +depends: +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: zlib-acknowledgement +size: 341202 +timestamp: 1776315188425 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 +md5: 2ec1119217d8f0d086e9a62f3cb0e5ea +depends: +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: blessing +size: 955361 +timestamp: 1777986487553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda +sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e +md5: 543fbc8d71f2a0baf04cf88ce96cb8bb +depends: +- libgcc 15.2.0 h8acb6b2_19 +constrains: +- libstdcxx-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +size: 5546559 +timestamp: 1778268777463 +- 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.42.1-h1022ec0_0.conda +sha256: 1628839b062e98b2192857d4da8496ac9ac6b0dbb77aa040c34efc9192c440ee +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 +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/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/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +size: 69017 +timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda +sha256: 383c188496d13a55658c06e61e7d4cdff2c9f9d5a0648769fca8250bece7e0ef +md5: e5de3c36dd548b35ff2a8aa49208dcb3 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +size: 27913 +timestamp: 1772446407659 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +sha256: 8fd4c79d6eda3d4cba73783114305a53a154ada4d1e334d4e02cb3521429599b +md5: 7b08314a6867a9d5648a1c3265e9eb8e +license: Apache-2.0 +license_family: Apache +size: 22257008 +timestamp: 1662784555011 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- 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 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard >=4 +license: GPL-3.0-or-later +license_family: GPL3 +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 284323 +timestamp: 1778929680962 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda +sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca +md5: b2a43456aa56fe80c2477a5094899eff +depends: +- libgcc >=14 +license: X11 AND BSD-3-Clause +size: 960036 +timestamp: 1777422174534 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +sha256: 78a06e89285fef242e272998b292c1e621e3ee3dd4fba62ec014e503c7ec118f +md5: 6dd4f07147774bf720075a210f8026b9 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +size: 235140 +timestamp: 1762350120355 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +sha256: 48942696889367ffd448f8dccfc080fb7e130b9938a4a3b6b20ef8e6af856463 +md5: 4540f9570d12db2150f42ba036154552 +depends: +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +size: 2061869 +timestamp: 1763490303490 +- 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 +- libcblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +size: 8002900 +timestamp: 1779169206742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 +md5: cea962410e327262346d48d01f05936c +depends: +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +size: 392636 +timestamp: 1758489353577 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda +sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 +md5: 3b129669089e4d6a5c6871dbb4669b99 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +size: 3706406 +timestamp: 1775589602258 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda +sha256: 96b26c2657275ffe84ab510edf0865e21999d791485d12794edd4a71b837beb6 +md5: 87d58d103b47c4a8567b3d7666647684 +depends: +- python +- libgcc >=14 +- python 3.14.* *_cp314 +- openjpeg >=2.5.4,<3.0a0 +- libxcb >=1.17.0,<2.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- python_abi 3.14.* *_cp314 +- lcms2 >=2.18,<3.0a0 +- tk >=8.6.13,<8.7.0a0 +- libtiff >=4.7.1,<4.8.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +license: HPND +size: 1062080 +timestamp: 1775060067775 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 +depends: +- polars-runtime-32 ==1.41.0 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 +license: MIT +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: 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 +- libgcc >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +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 +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/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- annotated-types >=0.6.0 +- pydantic-core ==2.46.4 +- python +license: MIT +license_family: MIT +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py314h451b6cc_0.conda +sha256: 1a7c6b18e404c13c4d959888ecb48a9ed9de0e41be2872932b83a35278088df0 +md5: 9c3ace6aba6df14b943256095ac1281e +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- python 3.14.* *_cp314 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 1780773 +timestamp: 1778084251775 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 +depends: +- python >=3.10 +license: BSD-2-Clause +license_family: BSD +size: 893031 +timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.5-hfd9ac0a_100_cp314.conda +build_number: 100 +sha256: d37bad5447365346166c72950ea8f49689aa49cecc1b0623d00458427627b8df +md5: d956e09feb806f5974675ce92ad81d45 +depends: +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-aarch64 >=2.36.1 +- libexpat >=2.8.0,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.3,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- openssl >=3.5.6,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +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 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff +depends: +- cpython 3.14.5.* +- python_abi * *_cp314 +license: Python-2.0 +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 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda +sha256: 496b5e65dfdd0aaaaa5de0dcaaf3bceea00fcb4398acf152f89e567c82ec1046 +md5: 9ae2c92975118058bd720e9ba2bb7c58 +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +size: 195678 +timestamp: 1770223441816 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 +md5: 3d49cad61f829f4f0e0611547a9cda12 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +size: 357597 +timestamp: 1765815673644 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.5.9-py314h51f160d_0.conda +sha256: 05ef55f09f31eabd0a205f6b065e13fc746675f41924620977692ef0ffe5aad8 +md5: 34ed7bc9febeca70f55b757ca09c354d +depends: +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python >=3.14,<3.15.0a0 *_cp314 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +size: 409780 +timestamp: 1778374195988 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 +depends: +- python >=3.10 +- certifi >=2023.5.7 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.26,<3 +- python +constrains: +- chardet >=3.0.2,<8 +license: Apache-2.0 +license_family: APACHE +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +size: 208577 +timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda +sha256: a587240f16eac7c6a80f9585cef679cd1cb9a287b8dfcdd36dcef1f7e7db15dc +md5: e7f6ed9e60043bb5cbcc527764897f0d +depends: +- python +- libgcc >=14 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 376332 +timestamp: 1764543345455 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda +sha256: 27467e4bfb0681546f149718c33b806fec078185fbaa6a4d17d440bc8f56185c +md5: 46009bdca2315a99e0a3a7d0ba1af3b9 +depends: +- libgcc >=14 +- libsqlite 3.53.1 h022381a_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +size: 209964 +timestamp: 1777986493350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda +sha256: c1da41c79262b27efa168407cfecc47b20270e5fc071a8307f95a2c85fb94170 +md5: 55bf7b559202236157b14323b40f19e6 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +size: 914402 +timestamp: 1764030357702 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 +md5: 7fc6affb9b01e567d2ef1d05b84aa6ed +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +size: 3368666 +timestamp: 1769464148928 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae +depends: +- typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python +constrains: +- pytest >=7 +license: MIT +license_family: MIT +size: 38297 +timestamp: 1778779291237 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +- python +license: MIT +license_family: MIT +size: 20935 +timestamp: 1777105465795 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +size: 103560 +timestamp: 1778188657149 +- 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/yaml-0.2.5-h80f16a2_3.conda +sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 +md5: 032d8030e4a24fe1f72c74423a46fb88 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +size: 88088 +timestamp: 1753484092643 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +size: 24190 +timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +sha256: 638a3a41a4fbfed52d3c60c8ef5a3693b3f12a5b1a3f58fa29f5698d0a0702e2 +md5: f731af71c723065d91b4c01bb822641b +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +size: 121046 +timestamp: 1770167944449 +- 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/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt b/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt deleted file mode 100644 index f787dbe1..00000000 --- a/modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-d167b8012595a136_1.txt +++ /dev/null @@ -1,125 +0,0 @@ - -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: linux-aarch64 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda#4faa39bf919939602e594253bd673958 -https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda#468fd3bb9e1f671d36c2cbc677e56f1d -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda#552567ea2b61e3a3035759b2fdb3f9a6 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda#840d8fc0d7b3209be93080bc20e07f2d -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda#502006882cf5461adced436e410046d1 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda#c3655f82dcea2aa179b291e7099c1fcc -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda#a21644fc4a83da26452a718dc9468d5f -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda#05d1e0b30acd816a192c03dc6e164f4d -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda#2f364feefb6a7c00423e80dcb12db62a -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda#76298a9e6d71ee6e832a8d0d7373b261 -https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda#7b9813e885482e3ccb1fa212b86d7fd0 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.0-h022381a_0.conda#86db4036fd08bf34e991bf48a8af405d -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda#a0b5de740d01c390bdbb46d7503c9fab -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda#3b129669089e4d6a5c6871dbb4669b99 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda#3d49cad61f829f4f0e0611547a9cda12 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda#7fc6affb9b01e567d2ef1d05b84aa6ed -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda#3cfbe780f0f51cc8cba41db9f8a28bfe -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 -https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda#f56573d05e3b735cb03efeb64a15f388 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda#a1b5c571a0923a205d663d8678df4792 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 -https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda#574d88ce3348331e962cfa5ed451b247 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda#41f261f5e4e2e8cbd236c2f1f15dae1b -https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda#5d2ce5cf40443d055ec6d33840192265 -https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda#652bb20bb4618cacd11e17ae070f47ce -https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda#939e300b110db241a96a1bed438c315b -https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda#e23a27b52fb320687239e2c5ae4d7540 -https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda#25d896c331481145720a21e5145fad65 -https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 -https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda#d2bb0c889d94f2fdc5856392c3002976 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda#f51503ac45a4888bce71af9027a2ecc9 -https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda#b99ed99e42dafb27889483b3098cace7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda#a229e22d4d8814a07702b0919d8e6701 -https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda#0fed1ff55f4938a65907f3ecf62609db -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda#e5de3c36dd548b35ff2a8aa49208dcb3 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda#e7f6ed9e60043bb5cbcc527764897f0d -https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda#4feebd0fbf61075a1a9c2e9b3936c257 -https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2#7b08314a6867a9d5648a1c3265e9eb8e -https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda#6dd4f07147774bf720075a210f8026b9 -https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda#4540f9570d12db2150f42ba036154552 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.0-he8854b5_0.conda#ad8164bdeece883b825c50639c0c4725 -https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2#4f0d284f5d11e04277b552eb1c172c7f -https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda#a85ba48648f6868016f2741fd9170250 -https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda#d13423b06447113a90b5b1366d4da171 -https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda#a9138815598fe6b91a1d6782ca657b0c -https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda#24e92d0942c799db387f5c9d7b81f1af -https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda#8c6fd84f9c87ac00636007c6131e457d -https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda#bb960f01525b5e001608afef9d47b79c -https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda#bb5a90c93e3bac3d5690acf76b4a6386 -https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda#1c246e1105000c3660558459e2fd6d43 -https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda#bff06dcde4a707339d66d45d96ceb2e2 -https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 -https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 -https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 -https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda#cea962410e327262346d48d01f05936c -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda#f731af71c723065d91b4c01bb822641b -https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda#87d58d103b47c4a8567b3d7666647684 -https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 -https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a -https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.40.0-py310hff09b76_0.conda#d5628a33ce7652511e38fc98643dc910 -https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 -https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.40.0-py310hf00a4a2_0.conda#a82af0fcbb72db253dc89a7a45279372 -https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda#9ae2c92975118058bd720e9ba2bb7c58 -https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.3-py314h451b6cc_0.conda#1a2cb55be9a153ad6203bff6b787c240 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 -https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c -https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 -https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 -https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 -https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a -https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py314h51f160d_0.conda#88a3dbd279e6b1faf0cddb8397866864 -https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda#55bf7b559202236157b14323b40f19e6 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 -https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b -https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 -https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda#09a970fbf75e8ed1aa633827ded6aa4f -https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda#ab7288cc39545556d1bc5e71ab2df9a9 diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index 37e7612d..7a970e2b 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.34 + - bioconda::multiqc=1.35 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index e80e8cd8..c4bc715e 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/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/data' - : 'community.wave.seqera.io/library/multiqc:1.34--db7c73dae76bc9e6'}" + ? '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 2facc627..27ce18d8 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-db7c73dae76bc9e6_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-d167b8012595a136_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.34--db7c73dae76bc9e6 - build_id: bd-db7c73dae76bc9e6_1 - scan_id: sc-66fc7138dbf1cf48_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.34--d167b8012595a136 - build_id: bd-d167b8012595a136_1 - scan_id: sc-ac701dfa631a2af9_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.34--4fc8657c816047c0 - build_id: bd-4fc8657c816047c0_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/1b/1bef8af6be88c5733461959c46ac8ef73d18f65277f62a1695d0e1633054f9c2/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.34--7fbd82d945c06726 - build_id: bd-7fbd82d945c06726_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9a/9a1fec9662a152683e6fcae440d0ce20920b3b89dc62d1e3a52e73f92eba0969/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/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 7c2f370f..44899216 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -81,7 +81,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -175,7 +175,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -221,7 +221,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -314,7 +314,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } @@ -408,7 +408,7 @@ [ "MULTIQC", "multiqc", - "1.34" + "1.35" ] ] } diff --git a/modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-644a84cef31cc4aa_1.txt b/modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-644a84cef31cc4aa_1.txt deleted file mode 100644 index e2883507..00000000 --- a/modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-644a84cef31cc4aa_1.txt +++ /dev/null @@ -1,131 +0,0 @@ - -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: linux-64 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_18.conda#239c5e9546c38a1e884d69effcf4c882 -https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda#a9f577daf3de00bca7c3c76c0ecbd1de -https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda#0aa00f03f9e39fb9876085dee11a85d4 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda#d2ffd7602c02f2b316fd921d39876885 -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda#d87ff7921124eccd67248aa483c23fec -https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda#4a13eeac0b5c8e5b8ab496e6c4ddd829 -https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda#18335a698559cdbcd86150a48bf54ba6 -https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda#49f570f3bc4c874a06ea69b7225753af -https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda#a360c33a5abe61c07959e449fa1453eb -https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda#b88d90cad08e6bc8ad540cb310a761fb -https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda#2c21e66f50753a083cbe6b80f38268fa -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda#1b08cd684f34175e4514474793d44bcb -https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda#c80d8a3b84358cb967fa81e7075fbc8a -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda#810d83373448da85c3f673fbcb7ad3a3 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda#38ffe67b78c9d4de527be8315e5ada2c -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda#da1b85b6a87e141f5140bb9924cecab0 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 -https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda#d7d95fc8287ea7bf33e0e7116d2b95ec -https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda#cffd3bdd58090148f4cfcd831f4b26ab -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda#a443f87920815d41bfe611296e507995 -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 -https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 -https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda#8910d2c46f7e7b519129f486e0fe927a -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 -https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_18.conda#646855f357199a12f02a87382d429b75 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_18.conda#9063115da5bc35fdc3e1002e69b9ef6e -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda#89d61bc91d3f39fda0ca10fcd3c68594 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda#6d6d225559bfa6e2f3c90ee9c03d4e2e -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda#36ae340a916635b97ac8a0655ace2a35 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda#881d801569b201c2e753f03c84b85e15 -https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda#36f5b7eb328bdc204954a2225cf908e2 -https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 -https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda#7de50d165039df32d38be74c1b34a910 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda#eba48a68a1a2b9d3c0d9511548db85db -https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda#fb16b4b69e3f1dcfe79d80db8fd0c55d -https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda#e289f3d17880e44b633ba911d57a321b -https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda#867127763fbe935bab59815b6e0b7b5c -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac -https://conda.anaconda.org/bioconda/linux-64/illumina-interop-1.9.0-h503566f_0.conda#7299cd17a6adac3294ca2d7938377bd4 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda#9a17c4307d23318476d7fbf0fedc0cde -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda#c1c368b5437b0d1a68f372ccf01cb133 -https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda#d5e96b1ed75ca01906b3d2469b4ce493 -https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2#86e69bd82c2a2c6fd29f5ab7e02b3691 -https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda#e235d5566c9cc8970eb2798dd4ecf62f -https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda#567fbeed956c200c1db5782a424e58ee -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda#dc540e5bd5616d83a1ec46af8315ff98 -https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2#b3723b235b0758abaae8c82ce4d80146 -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda#6178c6f2fb254558238ef4e6c56fb782 -https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda#a752488c68f2e7c456bcbd8f16eec275 -https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda#6c77a605a7a689d17d4819c0f8ac9a00 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda#aea31d2e5b1091feca96fcfe945c3cf9 -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda#cd5a90476766d53e901500df9215e927 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda#6f2e2c8f58160147c4d1c6f4c14cbac4 -https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda#b3c17d95b5a10c6e64a21fa17573e70e -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda#b2895afaf55bf96a8c8282a2e47a5de0 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda#1dafce8548e38671bea82e3f5c6ce22f -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda#92ed62436b625154323d40d5f2f11dd7 -https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 -https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 -https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda#11b3379b191f63139e29c0d19dee24cd -https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda#2aadb0d17215603a82a2a6b0afd9a4cb -https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda#76c4757c0ec9d11f969e8eb44899307b -https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 -https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a -https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-32-1.40.0-py310hffdcd12_0.conda#8eacf9ff4d4e1ca1b52f8f3ba3e0c993 -https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 -https://conda.anaconda.org/conda-forge/linux-64/polars-runtime-compat-1.40.0-py310hbcd5346_0.conda#03a6899e17bb731c8e21b08212f1a64c -https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 -https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a -https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda#2035f68f96be30dc60a5dfd7452c7941 -https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc -https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda#1f3fd537f929b8d3236f9f0f0e7f7a32 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 -https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c -https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 -https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 -https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 -https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a -https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py314h5bd0f2a_0.conda#4ffb42385183c854564f1f9adcf80a63 -https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda#d705f9d8a1185a2b01cced191177a028 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 -https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b -https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.2-py314hb4ffadd_0.conda#41ee6fe2a848876bc9f524c5a500b85b -https://conda.anaconda.org/bioconda/noarch/multiqc_sav-0.2.0-pyh7e72e81_0.conda#e027fdaaf741e0dd5b6c1da81edf1e19 -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda#bf47878473e5ab9fdb4115735230e191 -https://conda.anaconda.org/conda-forge/linux-64/procps-ng-4.0.6-h18c060e_0.conda#f2c23a77b25efcad57d377b34bd84941 diff --git a/modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt b/modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt new file mode 100644 index 00000000..829cd823 --- /dev/null +++ b/modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt @@ -0,0 +1,1837 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +indexes: +- https://pypi.org/simple +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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- 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.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.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.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.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/bioconda/linux-64/illumina-interop-1.9.0-h503566f_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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.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/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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.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.42.1-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/libzlib-1.3.2-h25fd6f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +- 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_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc_sav-0.2.0-pyh7e72e81_0.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.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/pandas-3.0.3-py314hb4ffadd_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/pip-26.1.1-pyh145f28c_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.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 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +- 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.5-habeac84_100_cp314.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_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/yaml-0.2.5-h280c20c_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda +- pypi: https://files.pythonhosted.org/packages/69/88/1ec58aeedfaf37519e20676a58ade8cb10c15d99b4e128b9eacaa90a32ee/interop-1.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +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 +purls: [] +size: 28948 +timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +purls: [] +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +purls: +- pkg:pypi/annotated-types?source=hash-mapping +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/attrs?source=hash-mapping +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda +noarch: generic +sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe +md5: 1133126d840e75287d83947be3fc3e71 +depends: +- python >=3.14 +license: BSD-3-Clause AND MIT AND EPL-2.0 +purls: +- pkg:pypi/backports-zstd?source=compressed-mapping +size: 7533 +timestamp: 1778594057496 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda +sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 +md5: 8910d2c46f7e7b519129f486e0fe927a +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- libbrotlicommon 1.2.0 hb03c661_1 +license: MIT +license_family: MIT +purls: +- pkg:pypi/brotli?source=hash-mapping +size: 367376 +timestamp: 1764017265553 +- 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 +purls: [] +size: 260182 +timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f +depends: +- __unix +license: ISC +purls: [] +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 +purls: +- pkg:pypi/certifi?source=compressed-mapping +size: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 +depends: +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/charset-normalizer?source=hash-mapping +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 +depends: +- __unix +- python +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/click?source=compressed-mapping +size: 104631 +timestamp: 1779108494556 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/coloredlogs?source=hash-mapping +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/colormath?source=hash-mapping +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.5-py314hd8ed1ab_100.conda +noarch: generic +sha256: 777882d2685f368417f31bbe1b28f73687fc6c8f6a5768bda20ffeefa6b07f5b +md5: a749029ce5d0632a913db19d17f944ab +depends: +- python >=3.14,<3.15.0a0 +- python_abi * *_cp314 +license: Python-2.0 +purls: [] +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.1 hecca717_0 +- libgcc >=14 +license: MIT +license_family: MIT +purls: [] +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 +license: BSD-3-Clause +license_family: BSD +purls: [] +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 +purls: [] +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 +purls: [] +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 +purls: [] +size: 1620504 +timestamp: 1727511233259 +- 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.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- libgcc >=14 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +purls: [] +size: 280882 +timestamp: 1779421631622 +- 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 +purls: [] +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/h2?source=hash-mapping +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/hpack?source=hash-mapping +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/humanfriendly?source=hash-mapping +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/humanize?source=hash-mapping +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/hyperframe?source=hash-mapping +size: 17397 +timestamp: 1737618427549 +- 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 +purls: +- pkg:pypi/idna?source=compressed-mapping +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/bioconda/linux-64/illumina-interop-1.9.0-h503566f_0.conda +sha256: e21ab0e30893f8fe8e8a07e9114f03f77da303789968db1f7368e01e0f54b8eb +md5: 7299cd17a6adac3294ca2d7938377bd4 +depends: +- libgcc >=13 +- libstdcxx >=13 +license: GPL-3.0-only +license_family: GPL +purls: [] +size: 3952143 +timestamp: 1765592693052 +- 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 +purls: +- pkg:pypi/importlib-metadata?source=compressed-mapping +size: 34766 +timestamp: 1779714582554 +- pypi: https://files.pythonhosted.org/packages/69/88/1ec58aeedfaf37519e20676a58ade8cb10c15d99b4e128b9eacaa90a32ee/interop-1.9.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl +name: interop +version: 1.9.0 +sha256: ba85fa500be29a00108b85a60d547d52e91e3c844355c9320da4a49fdeace29d +requires_dist: +- numpy>=1.26.2 ; python_full_version >= '3.12' +- numpy>=1.23.2 ; python_full_version >= '3.11' +- numpy>=1.21.6 ; python_full_version >= '3.10' +- numpy>=1.19.3 ; python_full_version >= '3.9' +- numpy>=1.16.6,<2.0 ; python_full_version < '3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/jinja2?source=hash-mapping +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/jsonschema?source=hash-mapping +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/jsonschema-specifications?source=hash-mapping +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kaleido-core-0.2.1-h3644ca4_0.tar.bz2 +sha256: 7f243680ca03eba7457b7a48f93a9440ba8181a8eac20a3eb5ef165ab6c96664 +md5: b3723b235b0758abaae8c82ce4d80146 +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +purls: [] +size: 62099926 +timestamp: 1615199463039 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda +sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 +md5: f92f984b558e6e6204014b16d212b271 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libjpeg-turbo >=3.1.4.1,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +purls: [] +size: 251086 +timestamp: 1778079286384 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda +sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c +md5: 18335a698559cdbcd86150a48bf54ba6 +depends: +- __glibc >=2.17,<3.0.a0 +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-64 2.45.1 +license: GPL-3.0-only +license_family: GPL +purls: [] +size: 728002 +timestamp: 1774197446916 +- 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 +purls: [] +size: 261513 +timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda +build_number: 7 +sha256: 081c850f99bc355821fac9c6e3727d40b3f8ce3beb50a5437cf03726b611ff39 +md5: 955b44e8b00b7f7ef4ce0130cef12394 +depends: +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<1.0a0 +constrains: +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas +- liblapacke 3.11.0 7*_openblas +- mkl <2027 +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 18716 +timestamp: 1778489854108 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda +build_number: 7 +sha256: 956ae0bb1ec8b0c3663d75b151aceb0521b54e513bf97f621a035f9c87037970 +md5: 0675639dc24cb0032f199e7ff68e4633 +depends: +- libblas 3.11.0 7_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapack 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 18675 +timestamp: 1778489861559 +- 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 +purls: [] +size: 73490 +timestamp: 1761979956660 +- 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.1.* +license: MIT +license_family: MIT +purls: [] +size: 77294 +timestamp: 1779278686680 +- 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 +purls: [] +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 +purls: [] +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 +purls: [] +size: 384575 +timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda +sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 +md5: 57736f29cc2b0ec0b6c2952d3f101b6a +depends: +- __glibc >=2.17,<3.0.a0 +- _openmp_mutex >=4.5 +constrains: +- libgcc-ng ==15.2.0=*_19 +- libgomp 15.2.0 he0feb66_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 1041084 +timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda +sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 +md5: 331ee9b72b9dff570d56b1302c5ab37d +depends: +- libgcc 15.2.0 he0feb66_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 27694 +timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda +sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f +md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 +depends: +- libgfortran5 15.2.0 h68bc16d_19 +constrains: +- libgfortran-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 27655 +timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda +sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 +md5: 85072b0ad177c966294f129b7c04a2d5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 2483673 +timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda +sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b +md5: faac990cb7aedc7f3a2224f2c9b0c26c +depends: +- __glibc >=2.17,<3.0.a0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 603817 +timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda +sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 +md5: 6178c6f2fb254558238ef4e6c56fb782 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +purls: [] +size: 633831 +timestamp: 1775962768273 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda +build_number: 7 +sha256: 96962084921f197c9ad13fb7f8b324f2351d50ff3d8d962148751ad532f54a01 +md5: 6569b4f273740e25dc0dc7e3232c2a6c +depends: +- libblas 3.11.0 7_h4a7cf45_openblas +constrains: +- liblapacke 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 18694 +timestamp: 1778489869038 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda +sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d +md5: b88d90cad08e6bc8ad540cb310a761fb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +constrains: +- xz 5.8.3.* +license: 0BSD +purls: [] +size: 113478 +timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda +sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 +md5: 2c21e66f50753a083cbe6b80f38268fa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-2-Clause +license_family: BSD +purls: [] +size: 92400 +timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda +sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 +md5: 2d3278b721e40468295ca755c3b84070 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.33,<0.3.34.0a0 +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 5931919 +timestamp: 1776993658641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda +sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 +md5: eba48a68a1a2b9d3c0d9511548db85db +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: zlib-acknowledgement +purls: [] +size: 317729 +timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda +sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d +md5: 7dc38adcbf71e6b38748e919e16e0dce +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: blessing +purls: [] +size: 954962 +timestamp: 1777986471789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda +sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc +md5: 5794b3bdc38177caf969dabd3af08549 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc 15.2.0 he0feb66_19 +constrains: +- libstdcxx-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 5852044 +timestamp: 1778269036376 +- 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 +purls: [] +size: 435273 +timestamp: 1762022005702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.1-h5347b49_0.conda +sha256: 3f0edf1280e2f6684a986f821eaa3e123d2694a00b31b96ca0d4a4c12c129231 +md5: 7d0a66598195ef00b6efc55aefc7453b +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 40163 +timestamp: 1779118517630 +- 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 +purls: [] +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 +purls: [] +size: 395888 +timestamp: 1727278577118 +- 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 +purls: [] +size: 63629 +timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/markdown?source=hash-mapping +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/markdown-it-py?source=hash-mapping +size: 69017 +timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda +sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf +md5: 9a17c4307d23318476d7fbf0fedc0cde +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/markupsafe?source=hash-mapping +size: 27424 +timestamp: 1772445227915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/mathjax-2.7.7-ha770c72_3.tar.bz2 +sha256: 02fef69bde69db264a12f21386612262f545b6e3e68d8f1ccec19f3eaae58edf +md5: 86e69bd82c2a2c6fd29f5ab7e02b3691 +license: Apache-2.0 +license_family: Apache +purls: [] +size: 22281629 +timestamp: 1662784498331 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/mdurl?source=hash-mapping +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- 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 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard >=4 +license: GPL-3.0-or-later +license_family: GPL3 +purls: +- pkg:pypi/multiqc?source=hash-mapping +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc_sav-0.2.0-pyh7e72e81_0.conda +sha256: 8ed970d4deb63b3fd949bc1957718d557b005e62b1126c922cc34cf86ee11d13 +md5: e027fdaaf741e0dd5b6c1da81edf1e19 +depends: +- illumina-interop >=1.7.0,<2 +- multiqc >=1.25 +- numpy +- pandas +- python +license: GPL3 +purls: +- pkg:pypi/multiqc-sav?source=hash-mapping +size: 20605 +timestamp: 1766064765632 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/narwhals?source=compressed-mapping +size: 284323 +timestamp: 1778929680962 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/natsort?source=hash-mapping +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda +sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 +md5: fc21868a1a5aacc937e7a18747acb8a5 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +license: X11 AND BSD-3-Clause +purls: [] +size: 918956 +timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/networkx?source=hash-mapping +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nspr-4.38-h29cc59b_0.conda +sha256: e3664264bd936c357523b55c71ed5a30263c6ba278d726a75b1eb112e6fb0b64 +md5: e235d5566c9cc8970eb2798dd4ecf62f +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +purls: [] +size: 228588 +timestamp: 1762348634537 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nss-3.118-h445c969_0.conda +sha256: 44dd98ffeac859d84a6dcba79a2096193a42fc10b29b28a5115687a680dd6aea +md5: 567fbeed956c200c1db5782a424e58ee +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +purls: [] +size: 2057773 +timestamp: 1763485556350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda +sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 +md5: f49b5f950379e0b97c35ca97682f7c6a +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- liblapack >=3.9.0,<4.0a0 +- python_abi 3.14.* *_cp314 +- libblas >=3.9.0,<4.0a0 +- libcblas >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/numpy?source=compressed-mapping +size: 8928909 +timestamp: 1779169198391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda +sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d +md5: 11b3379b191f63139e29c0d19dee24cd +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +purls: [] +size: 355400 +timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda +sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb +md5: da1b85b6a87e141f5140bb9924cecab0 +depends: +- __glibc >=2.17,<3.0.a0 +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +purls: [] +size: 3167099 +timestamp: 1775587756857 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +purls: +- pkg:pypi/packaging?source=hash-mapping +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py314hb4ffadd_0.conda +sha256: 8e4b161f3f7fbdf17f842b518ff3794b6af9378a90d095719d7153360d126dc1 +md5: bc2e1390314b1269e66fb1966fbcae5d +depends: +- python +- numpy >=1.26.0 +- python-dateutil >=2.8.2 +- libstdcxx >=14 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- numpy >=1.23,<3 +- python_abi 3.14.* *_cp314 +constrains: +- adbc-driver-postgresql >=1.2.0 +- adbc-driver-sqlite >=1.2.0 +- beautifulsoup4 >=4.12.3 +- blosc >=1.21.3 +- bottleneck >=1.4.2 +- fastparquet >=2024.11.0 +- fsspec >=2024.10.0 +- gcsfs >=2024.10.0 +- html5lib >=1.1 +- hypothesis >=6.116.0 +- jinja2 >=3.1.5 +- lxml >=5.3.0 +- matplotlib >=3.9.3 +- numba >=0.60.0 +- numexpr >=2.10.2 +- odfpy >=1.4.1 +- openpyxl >=3.1.5 +- psycopg2 >=2.9.10 +- pyarrow >=13.0.0 +- pyiceberg >=0.8.1 +- pymysql >=1.1.1 +- pyqt5 >=5.15.9 +- pyreadstat >=1.2.8 +- pytables >=3.10.1 +- pytest >=8.3.4 +- pytest-xdist >=3.6.1 +- python-calamine >=0.3.0 +- pytz >=2024.2 +- pyxlsb >=1.0.10 +- qtpy >=2.4.2 +- scipy >=1.14.1 +- s3fs >=2024.10.0 +- sqlalchemy >=2.0.36 +- tabulate >=0.9.0 +- xarray >=2024.10.0 +- xlrd >=2.0.1 +- xlsxwriter >=3.2.0 +- zstandard >=0.23.0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/pandas?source=compressed-mapping +size: 15303815 +timestamp: 1778602611222 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda +sha256: 123d8a7c16c88658b4f29e9f115a047598c941708dade74fbaff373a32dbec5e +md5: 76c4757c0ec9d11f969e8eb44899307b +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- libtiff >=4.7.1,<4.8.0a0 +- openjpeg >=2.5.4,<3.0a0 +- libxcb >=1.17.0,<2.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- python_abi 3.14.* *_cp314 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- lcms2 >=2.18,<3.0a0 +- tk >=8.6.13,<8.7.0a0 +license: HPND +purls: +- pkg:pypi/pillow?source=hash-mapping +size: 1082797 +timestamp: 1775060059882 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh145f28c_0.conda +sha256: 00acccc6f69568ddc56d4d5cc031fdb27eb6a1588a80b1f3a5233bd2a6f944f0 +md5: 2e7e59a063366f1fc4f45ac86bd9485f +depends: +- python >=3.13.0a0 +license: MIT +license_family: MIT +purls: +- pkg:pypi/pip?source=hash-mapping +size: 1199678 +timestamp: 1777924078252 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +purls: +- pkg:pypi/plotly?source=hash-mapping +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 +depends: +- polars-runtime-32 ==1.41.0 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 +license: MIT +purls: +- pkg:pypi/polars?source=hash-mapping +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: 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 +purls: +- pkg:pypi/polars-runtime-32?source=hash-mapping +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 +purls: +- pkg:pypi/polars-runtime-compat?source=hash-mapping +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 +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 +purls: [] +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 +purls: [] +size: 8252 +timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +purls: +- pkg:pypi/pyaml-env?source=hash-mapping +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- annotated-types >=0.6.0 +- pydantic-core ==2.46.4 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/pydantic?source=hash-mapping +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda +sha256: 802e216c39f1359aed60823b6e11d8ccd812b0ae1c81ae5ac1c81f99446409ab +md5: 0c96993dbeadf3a277cf757b9f1c9412 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +purls: +- pkg:pypi/pydantic-core?source=hash-mapping +size: 1895020 +timestamp: 1778084229247 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 +depends: +- python >=3.10 +license: BSD-2-Clause +license_family: BSD +purls: +- pkg:pypi/pygments?source=hash-mapping +size: 893031 +timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/pysocks?source=hash-mapping +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.5-habeac84_100_cp314.conda +build_number: 100 +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.8.0,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.3,<6.0a0 +- libmpdec >=4.0.0,<5.0a0 +- libsqlite >=3.53.1,<4.0a0 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- openssl >=3.5.6,<4.0a0 +- python_abi 3.14.* *_cp314 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +- zstd >=1.5.7,<1.6.0a0 +license: Python-2.0 +purls: [] +size: 36745188 +timestamp: 1779236923603 +python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda +sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 +md5: 5b8d21249ff20967101ffa321cab24e8 +depends: +- python >=3.9 +- six >=1.5 +- python +license: Apache-2.0 +license_family: APACHE +purls: +- pkg:pypi/python-dateutil?source=hash-mapping +size: 233310 +timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/python-dotenv?source=hash-mapping +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.5-h4df99d1_100.conda +sha256: 41dd7da285d71d519257fa7dacb1cae060d5ebfaa5f92cba5994899d2978e943 +md5: 41954747ba952ec4b01e16c2c9e8d8ff +depends: +- cpython 3.14.5.* +- python_abi * *_cp314 +license: Python-2.0 +purls: [] +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 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +purls: +- pkg:pypi/kaleido?source=hash-mapping +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda +build_number: 8 +sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 +md5: 0539938c55b6b1a59b560e843ad864a4 +constrains: +- python 3.14.* *_cp314 +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 6989 +timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda +sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d +md5: 2035f68f96be30dc60a5dfd7452c7941 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +purls: +- pkg:pypi/pyyaml?source=hash-mapping +size: 202391 +timestamp: 1770223462836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda +sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 +md5: d7d95fc8287ea7bf33e0e7116d2b95ec +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +purls: [] +size: 345073 +timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/referencing?source=hash-mapping +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.5.9-py314h5bd0f2a_0.conda +sha256: c7a4aca4977c15c82d053b06cbc676460974c1b25757cfeea8a9a2497ac911f8 +md5: 9dd235b6ac69a0198080dac39f9891aa +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +purls: +- pkg:pypi/regex?source=hash-mapping +size: 413611 +timestamp: 1778374155646 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 +depends: +- python >=3.10 +- certifi >=2023.5.7 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.26,<3 +- python +constrains: +- chardet >=3.0.2,<8 +license: Apache-2.0 +license_family: APACHE +purls: +- pkg:pypi/requests?source=compressed-mapping +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/rich?source=hash-mapping +size: 208577 +timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/rich-click?source=hash-mapping +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda +sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 +md5: c1c368b5437b0d1a68f372ccf01cb133 +depends: +- python +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +- python_abi 3.14.* *_cp314 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +purls: +- pkg:pypi/rpds-py?source=hash-mapping +size: 376121 +timestamp: 1764543122774 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda +sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d +md5: 3339e3b65d58accf4ca4fb8748ab16b3 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/six?source=hash-mapping +size: 18455 +timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/spectra?source=hash-mapping +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.1-hbc0de68_0.conda +sha256: d167fa92781bcdcd3b9aaa6bb1cd50c5b108f6190c170098a118b5cf5df2f881 +md5: 8e0b8654ead18e50af552e54b5a08a61 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libsqlite 3.53.1 h0c1763c_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +purls: [] +size: 205399 +timestamp: 1777986477546 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tiktoken-0.12.0-py314h67fec18_3.conda +sha256: 7e395d67fd249d901beb1ae269057763c0d8c3ee5f7a348694bdb16d158a37d9 +md5: d705f9d8a1185a2b01cced191177a028 +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +- python >=3.14,<3.15.0a0 +- python_abi 3.14.* *_cp314 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +purls: +- pkg:pypi/tiktoken?source=hash-mapping +size: 939648 +timestamp: 1764028306357 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda +sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac +md5: cffd3bdd58090148f4cfcd831f4b26ab +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +purls: [] +size: 3301196 +timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +purls: +- pkg:pypi/tqdm?source=hash-mapping +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae +depends: +- typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python +constrains: +- pytest >=7 +license: MIT +license_family: MIT +purls: +- pkg:pypi/typeguard?source=hash-mapping +size: 38297 +timestamp: 1778779291237 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +purls: [] +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/typing-inspection?source=hash-mapping +size: 20935 +timestamp: 1777105465795 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +purls: +- pkg:pypi/typing-extensions?source=hash-mapping +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +purls: [] +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/urllib3?source=hash-mapping +size: 103560 +timestamp: 1778188657149 +- 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 +purls: [] +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 +purls: [] +size: 20591 +timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda +sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad +md5: a77f85f77be52ff59391544bfe73390a +depends: +- libgcc >=14 +- __glibc >=2.17,<3.0.a0 +license: MIT +license_family: MIT +purls: [] +size: 85189 +timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/zipp?source=compressed-mapping +size: 24190 +timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda +sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f +md5: 2aadb0d17215603a82a2a6b0afd9a4cb +depends: +- __glibc >=2.17,<3.0.a0 +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +purls: [] +size: 122618 +timestamp: 1770167931827 +- 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 +purls: [] +size: 601375 +timestamp: 1764777111296 diff --git a/modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-039d1ec6b47ba325_1.txt b/modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-039d1ec6b47ba325_1.txt deleted file mode 100644 index babbadb3..00000000 --- a/modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-039d1ec6b47ba325_1.txt +++ /dev/null @@ -1,130 +0,0 @@ - -# This file may be used to create an environment using: -# $ conda create --name --file -# platform: linux-aarch64 -@EXPLICIT -https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_18.conda#4faa39bf919939602e594253bd673958 -https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda#468fd3bb9e1f671d36c2cbc677e56f1d -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda#552567ea2b61e3a3035759b2fdb3f9a6 -https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda#840d8fc0d7b3209be93080bc20e07f2d -https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda#502006882cf5461adced436e410046d1 -https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda#c3655f82dcea2aa179b291e7099c1fcc -https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda#a21644fc4a83da26452a718dc9468d5f -https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda#05d1e0b30acd816a192c03dc6e164f4d -https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda#2f364feefb6a7c00423e80dcb12db62a -https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda#76298a9e6d71ee6e832a8d0d7373b261 -https://conda.anaconda.org/conda-forge/linux-aarch64/libmpdec-4.0.0-he30d5cf_1.conda#7b9813e885482e3ccb1fa212b86d7fd0 -https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.0-h022381a_0.conda#86db4036fd08bf34e991bf48a8af405d -https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda#a0b5de740d01c390bdbb46d7503c9fab -https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda#182afabe009dc78d8b73100255ee6868 -https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda#e18ad67cf881dcadee8b8d9e2f8e5f73 -https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda#3b129669089e4d6a5c6871dbb4669b99 -https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 -https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda#3d49cad61f829f4f0e0611547a9cda12 -https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda#7fc6affb9b01e567d2ef1d05b84aa6ed -https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda#ad659d0a2b3e47e38d829aa8cad2d610 -https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.14.4-hfd9ac0a_100_cp314.conda#3cfbe780f0f51cc8cba41db9f8a28bfe -https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.4-py314hd8ed1ab_100.conda#f111d4cfaf1fe9496f386bc98ae94452 -https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.4-h4df99d1_100.conda#e4e60721757979d01d3964122f674959 -https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f -https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d -https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 -https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c -https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda#c6b0543676ecb1fb2d7643941fe375f2 -https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda#a2ac7763a9ac75055b68f325d3255265 -https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda#f56573d05e3b735cb03efeb64a15f388 -https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda#a1b5c571a0923a205d663d8678df4792 -https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda#929471569c93acefb30282a22060dcd5 -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda#a9167b9571f3baa9d448faa2139d1089 -https://conda.anaconda.org/conda-forge/noarch/click-8.3.2-pyhc90fa1f_0.conda#4d18bc3af7cfcea97bd817164672a08c -https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda#7fe569c10905402ed47024fc481bb371 -https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda#b866ff7007b934d564961066c8195983 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda#a2c1eeadae7a309daed9d62c96012a2b -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_18.conda#574d88ce3348331e962cfa5ed451b247 -https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_18.conda#41f261f5e4e2e8cbd236c2f1f15dae1b -https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda#5d2ce5cf40443d055ec6d33840192265 -https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda#652bb20bb4618cacd11e17ae070f47ce -https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda#939e300b110db241a96a1bed438c315b -https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda#e23a27b52fb320687239e2c5ae4d7540 -https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.3-py314haac167e_0.conda#25d896c331481145720a21e5145fad65 -https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda#071cf7b0ce333c81718b054066c15102 -https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda#d2bb0c889d94f2fdc5856392c3002976 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda#49023d73832ef61042f6a237cb2687e7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda#f51503ac45a4888bce71af9027a2ecc9 -https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda#b99ed99e42dafb27889483b3098cace7 -https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda#a229e22d4d8814a07702b0919d8e6701 -https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.17.1-hba86a56_0.conda#0fed1ff55f4938a65907f3ecf62609db -https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda#a7970cd949a077b7cb9696379d338681 -https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e -https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac -https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 -https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda#daddf757c3ecd6067b9af1df1f25d89e -https://conda.anaconda.org/conda-forge/noarch/idna-3.13-pyhcf101f3_0.conda#fb7130c190f9b4ec91219840a05ba3ac -https://conda.anaconda.org/bioconda/linux-aarch64/illumina-interop-1.9.0-h80f0ee0_0.conda#ebced75229b98f40fb302ff41a605cb9 -https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda#e1c36c6121a7c9c76f2f148f1e83b983 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda#080594bf4493e6bae2607e65390c520a -https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py314hb76de3f_1.conda#e5de3c36dd548b35ff2a8aa49208dcb3 -https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda#04558c96691bed63104678757beb4f8d -https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py314h02b7a91_0.conda#e7f6ed9e60043bb5cbcc527764897f0d -https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda#870293df500ca7e18bedefa5838a22ab -https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda#439cd0f567d697b20a8f45cb70a1005a -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda#ada41c863af263cc4c5fcbaff7c3e4dc -https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda#4feebd0fbf61075a1a9c2e9b3936c257 -https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2#7b08314a6867a9d5648a1c3265e9eb8e -https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda#6dd4f07147774bf720075a210f8026b9 -https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda#4540f9570d12db2150f42ba036154552 -https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.0-he8854b5_0.conda#ad8164bdeece883b825c50639c0c4725 -https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2#4f0d284f5d11e04277b552eb1c172c7f -https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda#a85ba48648f6868016f2741fd9170250 -https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda#d13423b06447113a90b5b1366d4da171 -https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda#a9138815598fe6b91a1d6782ca657b0c -https://conda.anaconda.org/conda-forge/linux-aarch64/libwebp-base-1.6.0-ha2e29f5_0.conda#24e92d0942c799db387f5c9d7b81f1af -https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda#8c6fd84f9c87ac00636007c6131e457d -https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda#bb960f01525b5e001608afef9d47b79c -https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda#bb5a90c93e3bac3d5690acf76b4a6386 -https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxau-1.0.12-he30d5cf_1.conda#1c246e1105000c3660558459e2fd6d43 -https://conda.anaconda.org/conda-forge/linux-aarch64/xorg-libxdmcp-1.1.5-he30d5cf_1.conda#bff06dcde4a707339d66d45d96ceb2e2 -https://conda.anaconda.org/conda-forge/linux-aarch64/libxcb-1.17.0-h262b8f6_0.conda#cd14ee5cca2464a425b1dbfc24d90db2 -https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda#ba0a9221ce1063f31692c07370d062f3 -https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 -https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 -https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda#e941e85e273121222580723010bd4fa2 -https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda#b8ae38639d323d808da535fb71e31be8 -https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda#cea962410e327262346d48d01f05936c -https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda#f731af71c723065d91b4c01bb822641b -https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py314hac3e5ec_0.conda#87d58d103b47c4a8567b3d7666647684 -https://conda.anaconda.org/conda-forge/noarch/narwhals-2.20.0-pyhcf101f3_0.conda#6cac1a50359219d786453c6fef819f98 -https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda#3e9427ee186846052e81fadde8ebe96a -https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-32-1.40.0-py310hff09b76_0.conda#d5628a33ce7652511e38fc98643dc910 -https://conda.anaconda.org/conda-forge/noarch/polars-1.40.0-pyh58ad624_0.conda#fd16be490f5403adfbf27dd4901bbe34 -https://conda.anaconda.org/conda-forge/linux-aarch64/polars-runtime-compat-1.40.0-py310hf00a4a2_0.conda#a82af0fcbb72db253dc89a7a45279372 -https://conda.anaconda.org/conda-forge/noarch/polars-lts-cpu-1.34.0.deprecated-hc364b38_0.conda#ef0340e75068ac8ff96462749b5c98e7 -https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda#032d8030e4a24fe1f72c74423a46fb88 -https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py314h807365f_1.conda#9ae2c92975118058bd720e9ba2bb7c58 -https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda#e17be1016bcc3516827b836cd3e4d9dc -https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.3-py314h451b6cc_0.conda#1a2cb55be9a153ad6203bff6b787c240 -https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda#a0a4a3035667fc34f29bfbd5c190baa6 -https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda#f690e6f204efd2e5c06b57518a383d98 -https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda#130584ad9f3a513cdd71b1fdc1244e9c -https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2#310259a5b03ff02289d7705f39e2b1d2 -https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda#9272daa869e03efe68833e3dc7a02130 -https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda#10afbb4dbf06ff959ad25a92ccee6e59 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda#16c18772b340887160c79a6acc022db0 -https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda#0242025a3c804966bf71aa04eee82f66 -https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda#0c20a8ebcddb24a45da89d5e917e6cb9 -https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda#472239e4eb7b5a84bb96b3ed7e3a596a -https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py314h51f160d_0.conda#88a3dbd279e6b1faf0cddb8397866864 -https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py314h6a36e60_3.conda#55bf7b559202236157b14323b40f19e6 -https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda#e5ce43272193b38c2e9037446c1d9206 -https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda#260af1b0a94f719de76b4e14094e9a3b -https://conda.anaconda.org/bioconda/noarch/multiqc-1.34-pyhdfd78af_0.conda#a7111ab9a6a6146b40cbce16655ac873 -https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 -https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 -https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.2-py314he6363bd_0.conda#8628f9a9ba5c7c0ed27a5d60fea957e5 -https://conda.anaconda.org/bioconda/noarch/multiqc_sav-0.2.0-pyh7e72e81_0.conda#e027fdaaf741e0dd5b6c1da81edf1e19 -https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda#bf47878473e5ab9fdb4115735230e191 -https://conda.anaconda.org/conda-forge/linux-aarch64/procps-ng-4.0.6-h1779866_0.conda#ab7288cc39545556d1bc5e71ab2df9a9 diff --git a/modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt b/modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt new file mode 100644 index 00000000..03e286e3 --- /dev/null +++ b/modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt @@ -0,0 +1,1825 @@ + +version: 6 +environments: +default: +channels: +- url: https://conda.anaconda.org/conda-forge/ +- url: https://conda.anaconda.org/bioconda/ +- url: https://conda.anaconda.org/bioconda/ +indexes: +- https://pypi.org/simple +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/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.5.0-py312ha46dd1d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py312hac7b6a9_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.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.12.13-py312hd8ed1ab_0.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.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.15-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/illumina-interop-1.9.0-h80f0ee0_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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.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/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.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 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.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.42.1-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/noarch/markdown-3.10.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_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_1.conda +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc_sav-0.2.0-pyh7e72e81_0.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.6-py312hce9e0af_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/pandas-3.0.3-py312hf55c4e8_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py312h3b21937_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_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.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 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py312h5eb8f6c_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.12.13-h91f4b29_0_cpython.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.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.12.13-hd8ed1ab_0.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.12-8_cp312.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.5.9-py312hcd1a082_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py312h75d7d99_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py312h1826693_3.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_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/yaml-0.2.5-h80f16a2_3.conda +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda +- pypi: https://files.pythonhosted.org/packages/ff/2b/ef4e5ff22d017111c51e43909347d0106b8bd0f9235a9345ca81a262255f/interop-1.9.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl +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 +purls: [] +size: 28926 +timestamp: 1770939656741 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda +sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 +md5: aaa2a381ccc56eac91d63b6c1240312f +depends: +- cpython +- python-gil +license: MIT +license_family: MIT +purls: [] +size: 8191 +timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda +sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 +md5: 2934f256a8acfe48f6ebb4fce6cde29c +depends: +- python >=3.9 +- typing-extensions >=4.0.0 +license: MIT +license_family: MIT +purls: +- pkg:pypi/annotated-types?source=hash-mapping +size: 18074 +timestamp: 1733247158254 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda +sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab +md5: c6b0543676ecb1fb2d7643941fe375f2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/attrs?source=hash-mapping +size: 64927 +timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.5.0-py312ha46dd1d_0.conda +sha256: 0c6fcd7ee0d3defcd279f9a144e9d56fe7d100d6a4749c0d0bd5faa302a54a43 +md5: 4e6cc4fee8896183d0bd2b5f32c3d1b5 +depends: +- python +- libgcc >=14 +- zstd >=1.5.7,<1.6.0a0 +- python_abi 3.12.* *_cp312 +license: BSD-3-Clause AND MIT AND EPL-2.0 +purls: +- pkg:pypi/backports-zstd?source=hash-mapping +size: 241317 +timestamp: 1778594051531 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py312hac7b6a9_1.conda +sha256: aa14d1f26a1d4ed3a735281beb20129b9ba4670fed688045ac71f4119aeed7e6 +md5: d64147176625536a8024e26577c5e894 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.12,<3.13.0a0 +- python >=3.12,<3.13.0a0 *_cpython +- python_abi 3.12.* *_cp312 +constrains: +- libbrotlicommon 1.2.0 he30d5cf_1 +license: MIT +license_family: MIT +purls: +- pkg:pypi/brotli?source=hash-mapping +size: 373800 +timestamp: 1764017545385 +- 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 +purls: [] +size: 192412 +timestamp: 1771350241232 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.5.20-hbd8a1cb_0.conda +sha256: 9812a303a1395e1dafbd92e5bc8a1ff6013bcbba0a09c7f03a8d23e43560aa9b +md5: 489b8e97e666c93f68fdb35c3c9b957f +depends: +- __unix +license: ISC +purls: [] +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 +purls: +- pkg:pypi/certifi?source=compressed-mapping +size: 134201 +timestamp: 1779285131141 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda +sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 +md5: a9167b9571f3baa9d448faa2139d1089 +depends: +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/charset-normalizer?source=hash-mapping +size: 58872 +timestamp: 1775127203018 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.0-pyhc90fa1f_0.conda +sha256: 99ab8ef815c4520cce3a7482c2513f377c14348206857661d84c76a55e030f97 +md5: 003767c47f1f0a474c4de268b57839c3 +depends: +- __unix +- python +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/click?source=compressed-mapping +size: 104631 +timestamp: 1779108494556 +- conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda +sha256: 8021c76eeadbdd5784b881b165242db9449783e12ce26d6234060026fd6a8680 +md5: b866ff7007b934d564961066c8195983 +depends: +- humanfriendly >=9.1 +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/coloredlogs?source=hash-mapping +size: 43758 +timestamp: 1733928076798 +- conda: https://conda.anaconda.org/conda-forge/noarch/colormath-3.0.0-pyhd8ed1ab_4.conda +sha256: 59c9e29800b483b390467f90e82b0da3a4fbf0612efe1c90813fca232780e160 +md5: 071cf7b0ce333c81718b054066c15102 +depends: +- networkx >=2.0 +- numpy +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/colormath?source=hash-mapping +size: 39326 +timestamp: 1735759976140 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.13-py312hd8ed1ab_0.conda +noarch: generic +sha256: d3e9bbd7340199527f28bbacf947702368f31de60c433a16446767d3c6aaf6fe +md5: f54c1ffb8ecedb85a8b7fcde3a187212 +depends: +- python >=3.12,<3.13.0a0 +- python_abi * *_cp312 +license: Python-2.0 +purls: [] +size: 46463 +timestamp: 1772728929620 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.8.1-hfae3067_0.conda +sha256: a9cd5eb1700e11cc39acc36630a2d72a4e317943bd7c5695cd8804419f04ff42 +md5: 89f0247b3cea528d8ad1a6664a313153 +depends: +- libexpat 2.8.1 hfae3067_0 +- libgcc >=14 +license: MIT +license_family: MIT +purls: [] +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 +license: BSD-3-Clause +license_family: BSD +purls: [] +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 +purls: [] +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 +purls: [] +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 +purls: [] +size: 1620504 +timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fontconfig-2.18.0-hba86a56_0.conda +sha256: 1805f4ab3d9e1734a5a17abccc2cb0fdade51d4d5f29bdc410600ea0115ec050 +md5: b660d59a9d0fb3297327418624acaec3 +depends: +- libexpat >=2.8.1,<3.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- libgcc >=14 +- libuuid >=2.42.1,<3.0a0 +- libzlib >=1.3.2,<2.0a0 +license: MIT +license_family: MIT +purls: [] +size: 293348 +timestamp: 1779421661332 +- 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 +purls: [] +size: 4059 +timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda +sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 +md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 +depends: +- python >=3.10 +- hyperframe >=6.1,<7 +- hpack >=4.1,<5 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/h2?source=hash-mapping +size: 95967 +timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda +sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba +md5: 0a802cb9888dd14eeefc611f05c40b6e +depends: +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/hpack?source=hash-mapping +size: 30731 +timestamp: 1737618390337 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda +sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d +md5: 7fe569c10905402ed47024fc481bb371 +depends: +- __unix +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/humanfriendly?source=hash-mapping +size: 73563 +timestamp: 1733928021866 +- conda: https://conda.anaconda.org/conda-forge/noarch/humanize-4.15.0-pyhd8ed1ab_0.conda +sha256: 6c4343b376d0b12a4c75ab992640970d36c933cad1fd924f6a1181fa91710e80 +md5: daddf757c3ecd6067b9af1df1f25d89e +depends: +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/humanize?source=hash-mapping +size: 67994 +timestamp: 1766267728652 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda +sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 +md5: 8e6923fc12f1fe8f8c4e5c9f343256ac +depends: +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/hyperframe?source=hash-mapping +size: 17397 +timestamp: 1737618427549 +- 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 +purls: +- pkg:pypi/idna?source=compressed-mapping +size: 62642 +timestamp: 1779294335905 +- conda: https://conda.anaconda.org/bioconda/linux-aarch64/illumina-interop-1.9.0-h80f0ee0_0.conda +sha256: 2ce2b9ca6098d780b226823838efe0fcb074ae8440791deb5e863a7ff4f3c4c4 +md5: ebced75229b98f40fb302ff41a605cb9 +depends: +- libgcc >=13 +- libstdcxx >=13 +license: GPL-3.0-only +license_family: GPL +purls: [] +size: 3651142 +timestamp: 1765592449988 +- 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 +purls: +- pkg:pypi/importlib-metadata?source=compressed-mapping +size: 34766 +timestamp: 1779714582554 +- pypi: https://files.pythonhosted.org/packages/ff/2b/ef4e5ff22d017111c51e43909347d0106b8bd0f9235a9345ca81a262255f/interop-1.9.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl +name: interop +version: 1.9.0 +sha256: 889f71f1ac904bff4bb2496fea49a812133bf76b7d3eced66439ebea53e4ca7d +requires_dist: +- numpy>=1.26.2 ; python_full_version >= '3.12' +- numpy>=1.23.2 ; python_full_version >= '3.11' +- numpy>=1.21.6 ; python_full_version >= '3.10' +- numpy>=1.19.3 ; python_full_version >= '3.9' +- numpy>=1.16.6,<2.0 ; python_full_version < '3.9' +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda +sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b +md5: 04558c96691bed63104678757beb4f8d +depends: +- markupsafe >=2.0 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/jinja2?source=hash-mapping +size: 120685 +timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda +sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 +md5: ada41c863af263cc4c5fcbaff7c3e4dc +depends: +- attrs >=22.2.0 +- jsonschema-specifications >=2023.3.6 +- python >=3.10 +- referencing >=0.28.4 +- rpds-py >=0.25.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/jsonschema?source=hash-mapping +size: 82356 +timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda +sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 +md5: 439cd0f567d697b20a8f45cb70a1005a +depends: +- python >=3.10 +- referencing >=0.31.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/jsonschema-specifications?source=hash-mapping +size: 19236 +timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kaleido-core-0.2.1-he5a581e_0.tar.bz2 +sha256: d3c7f4797566e6f983d16c2a87063a18e4b2d819a66230190a21584d70042755 +md5: 4f0d284f5d11e04277b552eb1c172c7f +depends: +- __glibc >=2.17,<3.0.a0 +- expat >=2.2.10,<3.0.0a0 +- fontconfig +- fonts-conda-forge +- libgcc-ng >=9.3.0 +- mathjax 2.7.* +- nspr >=4.29,<5.0a0 +- nss >=3.62,<4.0a0 +- sqlite >=3.34.0,<4.0a0 +license: MIT +license_family: MIT +purls: [] +size: 65750397 +timestamp: 1615199465742 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.19.1-h9d5b58d_0.conda +sha256: 1e5f68e4b36a0e1a278c6dc026bc3d7775518a15832cbc9d7fc1c0e4c47784b1 +md5: b1f8bee3c53a6d2c103fb4a1ae44f5c4 +depends: +- libgcc >=14 +- libjpeg-turbo >=3.1.4.1,<4.0a0 +- libtiff >=4.7.1,<4.8.0a0 +license: MIT +license_family: MIT +purls: [] +size: 296899 +timestamp: 1778079402392 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda +sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 +md5: a21644fc4a83da26452a718dc9468d5f +depends: +- zstd >=1.5.7,<1.6.0a0 +constrains: +- binutils_impl_linux-aarch64 2.45.1 +license: GPL-3.0-only +license_family: GPL +purls: [] +size: 875596 +timestamp: 1774197520746 +- 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 +purls: [] +size: 240444 +timestamp: 1773114901155 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-7_haddc8a3_openblas.conda +build_number: 7 +sha256: f27ba323c2f1e1731b5e880fe520f178f55047f25be94f77e649605b2343c066 +md5: e8d07b777f6ff1fab69665336561910b +depends: +- libopenblas >=0.3.33,<0.3.34.0a0 +- libopenblas >=0.3.33,<1.0a0 +constrains: +- liblapack 3.11.0 7*_openblas +- libcblas 3.11.0 7*_openblas +- mkl <2027 +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 18696 +timestamp: 1778489796402 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-7_hd72aa62_openblas.conda +build_number: 7 +sha256: c8f0192362966df0828419f042d6f94c079e5df00ad6bd05b5e84c12b42f8cc7 +md5: 90ac57b82c055faa9be25031864b7d8f +depends: +- libblas 3.11.0 7_haddc8a3_openblas +constrains: +- liblapack 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 18664 +timestamp: 1778489802790 +- 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 +purls: [] +size: 71117 +timestamp: 1761979776756 +- 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.1.* +license: MIT +license_family: MIT +purls: [] +size: 77140 +timestamp: 1779278671302 +- 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 +purls: [] +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 +purls: [] +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 +purls: [] +size: 422941 +timestamp: 1774301093473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_19.conda +sha256: 4592b096e553f67799ae70d4b6167eeda3ec74587d68c7aecbf4e7b1df136681 +md5: f35b3f52d0a2ec4ffe3c89ba135cdb9a +depends: +- _openmp_mutex >=4.5 +constrains: +- libgomp 15.2.0 h8acb6b2_19 +- libgcc-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 622462 +timestamp: 1778268755949 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_19.conda +sha256: 1137f93f477f56199ded24117430045a0c02cbe8b10031beac3b9ad2138539d3 +md5: 770cf892e5530f43e63cadc673e85653 +depends: +- libgcc 15.2.0 h8acb6b2_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 27738 +timestamp: 1778268759211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran-15.2.0-he9431aa_19.conda +sha256: e5ad94be72634233510b33ba792a3339921bd468f0b8bc6961ea05eded251d9b +md5: c7a5b5decf969ead5ecada83654164cf +depends: +- libgfortran5 15.2.0 h1b7bec0_19 +constrains: +- libgfortran-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 27728 +timestamp: 1778268784621 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgfortran5-15.2.0-h1b7bec0_19.conda +sha256: af8e9bdcaa77f133a8ee4c1ef57ef564d9c45aa262abf9f5ef9b50eb99d96407 +md5: 779dbb494de6d3d6477cab52eb34285a +depends: +- libgcc >=15.2.0 +constrains: +- libgfortran 15.2.0 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 1487244 +timestamp: 1778268767295 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-15.2.0-h8acb6b2_19.conda +sha256: 2370ef0ffcbae5bede3c4bf136add4abc257245eb91f724c99bb4a43116c5a83 +md5: c5e8a379c4a2ec2aea4ba22758c001d9 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 587387 +timestamp: 1778268674393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.4.1-he30d5cf_0.conda +sha256: e97ec2af5f09f8f6ea8ecd550055c95ae80fae22015fcfadaa94eafe025c9ccc +md5: a85ba48648f6868016f2741fd9170250 +depends: +- libgcc >=14 +constrains: +- jpeg <0.0.0a +license: IJG AND BSD-3-Clause AND Zlib +purls: [] +size: 693143 +timestamp: 1775962625956 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-7_h88aeb00_openblas.conda +build_number: 7 +sha256: 20b38a0156200ac65f597bf0a93914c565435f2cc58b1042581854231a99ac35 +md5: 5899cbd743cc74fd655c1ed2af7120f3 +depends: +- libblas 3.11.0 7_haddc8a3_openblas +constrains: +- libcblas 3.11.0 7*_openblas +- blas 2.307 openblas +- liblapacke 3.11.0 7*_openblas +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 18685 +timestamp: 1778489809140 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_0.conda +sha256: d61962b9cd54c3554361550203c64d5b65b71e3058a285b66e4b04b9769f0a5c +md5: 76298a9e6d71ee6e832a8d0d7373b261 +depends: +- libgcc >=14 +constrains: +- xz 5.8.3.* +license: 0BSD +purls: [] +size: 126102 +timestamp: 1775828008518 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda +sha256: c0dc4d84198e3eef1f37321299e48e2754ca83fd12e6284754e3cb231357c3a5 +md5: d5d58b2dc3e57073fe22303f5fed4db7 +depends: +- libgcc >=13 +license: LGPL-2.1-only +license_family: GPL +purls: [] +size: 34831 +timestamp: 1750274211 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.33-pthreads_h9d3fd7e_0.conda +sha256: b018ecfb05e75a8eea3f21f6b5c5c2a54b5178bdcf19e2e2df2735740214a8c8 +md5: 58a66cd95e9692f08abe89f55a6f3f12 +depends: +- libgcc >=14 +- libgfortran +- libgfortran5 >=14.3.0 +constrains: +- openblas >=0.3.33,<0.3.34.0a0 +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 5121336 +timestamp: 1776993423004 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.58-h1abf092_0.conda +sha256: 483eaa53da40a6a3e558709d9f7b1ca388735364ae21a1ba58cf942514649c92 +md5: f51503ac45a4888bce71af9027a2ecc9 +depends: +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: zlib-acknowledgement +purls: [] +size: 341202 +timestamp: 1776315188425 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.53.1-h022381a_0.conda +sha256: ad03b7d8e4d08001f0df88ee7a56108bb35bae4795a42b9a04cc1abfa822bd07 +md5: 2ec1119217d8f0d086e9a62f3cb0e5ea +depends: +- libgcc >=14 +- libzlib >=1.3.2,<2.0a0 +license: blessing +purls: [] +size: 955361 +timestamp: 1777986487553 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_19.conda +sha256: 1dadc45e599f510dd5f97141dddcdbb9844d9f1430c1f3a38075cf1c58f87b4e +md5: 543fbc8d71f2a0baf04cf88ce96cb8bb +depends: +- libgcc 15.2.0 h8acb6b2_19 +constrains: +- libstdcxx-ng ==15.2.0=*_19 +license: GPL-3.0-only WITH GCC-exception-3.1 +license_family: GPL +purls: [] +size: 5546559 +timestamp: 1778268777463 +- 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 +purls: [] +size: 488407 +timestamp: 1762022048105 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42.1-h1022ec0_0.conda +sha256: 1628839b062e98b2192857d4da8496ac9ac6b0dbb77aa040c34efc9192c440ee +md5: 0f42f9fedd2a32d798de95a7f65c456f +depends: +- libgcc >=14 +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 43453 +timestamp: 1779118526838 +- 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 +purls: [] +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 +purls: [] +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 +purls: [] +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 +purls: [] +size: 69833 +timestamp: 1774072605429 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda +sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b +md5: ba0a9221ce1063f31692c07370d062f3 +depends: +- importlib-metadata >=4.4 +- python >=3.10 +- python +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/markdown?source=hash-mapping +size: 85893 +timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda +sha256: 0c4c35376fe920714390d46e4b8d31c876d65f18e1655899e0763ec25f2a902f +md5: 6d03368f2b2b0a5fb6839df53b2eb5e0 +depends: +- mdurl >=0.1,<1 +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/markdown-it-py?source=hash-mapping +size: 69017 +timestamp: 1778169663339 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-3.0.3-py312hd077ced_1.conda +sha256: 5919bf53e9f74ee1c6ce35ce13a7cd92741d45385c2d0b3eae48b01c0f11f41a +md5: 1fecdd103b37427ba6041b9b03d657ea +depends: +- libgcc >=14 +- python >=3.12,<3.13.0a0 +- python_abi 3.12.* *_cp312 +constrains: +- jinja2 >=3.0.0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/markupsafe?source=hash-mapping +size: 26305 +timestamp: 1772446326927 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mathjax-2.7.7-h8af1aa0_3.tar.bz2 +sha256: 8fd4c79d6eda3d4cba73783114305a53a154ada4d1e334d4e02cb3521429599b +md5: 7b08314a6867a9d5648a1c3265e9eb8e +license: Apache-2.0 +license_family: Apache +purls: [] +size: 22257008 +timestamp: 1662784555011 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda +sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 +md5: 592132998493b3ff25fd7479396e8351 +depends: +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/mdurl?source=hash-mapping +size: 14465 +timestamp: 1733255681319 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc-1.35-pyhdfd78af_1.conda +sha256: e86033aa55a9e915e2d0957e770bdb81e3feb26a227d1adb17f9d6c528da6a71 +md5: cdb20309681ba3ce8f52c110e214d4f3 +depends: +- click +- coloredlogs +- humanize +- importlib-metadata +- jinja2 >=3.0.0 +- jsonschema +- markdown +- natsort +- numpy +- packaging +- 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 +- python-dotenv +- python-kaleido 0.2.1 +- pyyaml >=4 +- requests +- rich >=10 +- rich-click +- spectra >=0.0.10 +- tiktoken +- tqdm +- typeguard >=4 +license: GPL-3.0-or-later +license_family: GPL3 +purls: +- pkg:pypi/multiqc?source=hash-mapping +size: 4282188 +timestamp: 1779465338806 +- conda: https://conda.anaconda.org/bioconda/noarch/multiqc_sav-0.2.0-pyh7e72e81_0.conda +sha256: 8ed970d4deb63b3fd949bc1957718d557b005e62b1126c922cc34cf86ee11d13 +md5: e027fdaaf741e0dd5b6c1da81edf1e19 +depends: +- illumina-interop >=1.7.0,<2 +- multiqc >=1.25 +- numpy +- pandas +- python +license: GPL3 +purls: +- pkg:pypi/multiqc-sav?source=hash-mapping +size: 20605 +timestamp: 1766064765632 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.21.2-pyhcf101f3_0.conda +sha256: 70f43d62450927d51673eecd8823e14f5b3cfebdb43cda1d502eba97162bab42 +md5: 6687827c332121727ce383919e1ec8c2 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/narwhals?source=compressed-mapping +size: 284323 +timestamp: 1778929680962 +- conda: https://conda.anaconda.org/conda-forge/noarch/natsort-8.4.0-pyhcf101f3_2.conda +sha256: aeb1548eb72e4f198e72f19d242fb695b35add2ac7b2c00e0d83687052867680 +md5: e941e85e273121222580723010bd4fa2 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/natsort?source=hash-mapping +size: 39262 +timestamp: 1770905275632 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.6-hf8d1292_0.conda +sha256: 369db85c5cd8d99dde364ce70725d76511d9c8199e5b820c740414091bf5bcca +md5: b2a43456aa56fe80c2477a5094899eff +depends: +- libgcc >=14 +license: X11 AND BSD-3-Clause +purls: [] +size: 960036 +timestamp: 1777422174534 +- conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda +sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 +md5: a2c1eeadae7a309daed9d62c96012a2b +depends: +- python >=3.11 +- python +constrains: +- numpy >=1.25 +- scipy >=1.11.2 +- matplotlib-base >=3.8 +- pandas >=2.0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/networkx?source=hash-mapping +size: 1587439 +timestamp: 1765215107045 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nspr-4.38-h3ad9384_0.conda +sha256: 78a06e89285fef242e272998b292c1e621e3ee3dd4fba62ec014e503c7ec118f +md5: 6dd4f07147774bf720075a210f8026b9 +depends: +- libgcc >=14 +- libstdcxx >=14 +license: MPL-2.0 +license_family: MOZILLA +purls: [] +size: 235140 +timestamp: 1762350120355 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda +sha256: 48942696889367ffd448f8dccfc080fb7e130b9938a4a3b6b20ef8e6af856463 +md5: 4540f9570d12db2150f42ba036154552 +depends: +- libgcc >=14 +- libsqlite >=3.51.0,<4.0a0 +- libstdcxx >=14 +- libzlib >=1.3.1,<2.0a0 +- nspr >=4.38,<5.0a0 +license: MPL-2.0 +license_family: MOZILLA +purls: [] +size: 2061869 +timestamp: 1763490303490 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-2.4.6-py312hce9e0af_0.conda +sha256: 4facc6fe76540d7e6e77b802602f7b1b3aa574a5fa6f406e0d21960858f1f539 +md5: 84ad95777b2f6bc736a6e08e5f02c04e +depends: +- python +- libstdcxx >=14 +- libgcc >=14 +- python_abi 3.12.* *_cp312 +- libblas >=3.9.0,<4.0a0 +- libcblas >=3.9.0,<4.0a0 +- liblapack >=3.9.0,<4.0a0 +constrains: +- numpy-base <0a0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/numpy?source=compressed-mapping +size: 7839794 +timestamp: 1779169203525 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda +sha256: bd1bc8bdde5e6c5cbac42d462b939694e40b59be6d0698f668515908640c77b8 +md5: cea962410e327262346d48d01f05936c +depends: +- libgcc >=14 +- libpng >=1.6.50,<1.7.0a0 +- libstdcxx >=14 +- libtiff >=4.7.1,<4.8.0a0 +- libzlib >=1.3.1,<2.0a0 +license: BSD-2-Clause +license_family: BSD +purls: [] +size: 392636 +timestamp: 1758489353577 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.2-h546c87b_0.conda +sha256: 348cb74c1530ac241215d047ef65d134cf797af935c97a68655319362b7e6a01 +md5: 3b129669089e4d6a5c6871dbb4669b99 +depends: +- ca-certificates +- libgcc >=14 +license: Apache-2.0 +license_family: Apache +purls: [] +size: 3706406 +timestamp: 1775589602258 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda +sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 +md5: 4c06a92e74452cfa53623a81592e8934 +depends: +- python >=3.8 +- python +license: Apache-2.0 +license_family: APACHE +purls: +- pkg:pypi/packaging?source=hash-mapping +size: 91574 +timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pandas-3.0.3-py312hf55c4e8_0.conda +sha256: 213d1cd00ffc74c11705b0cf58a66f32e20751bbc229781e614cd093146fa6bc +md5: c52993e9fec826ce29efc96292ba3c1b +depends: +- python +- numpy >=1.26.0 +- python-dateutil >=2.8.2 +- libstdcxx >=14 +- libgcc >=14 +- python 3.12.* *_cpython +- numpy >=1.23,<3 +- python_abi 3.12.* *_cp312 +constrains: +- adbc-driver-postgresql >=1.2.0 +- adbc-driver-sqlite >=1.2.0 +- beautifulsoup4 >=4.12.3 +- blosc >=1.21.3 +- bottleneck >=1.4.2 +- fastparquet >=2024.11.0 +- fsspec >=2024.10.0 +- gcsfs >=2024.10.0 +- html5lib >=1.1 +- hypothesis >=6.116.0 +- jinja2 >=3.1.5 +- lxml >=5.3.0 +- matplotlib >=3.9.3 +- numba >=0.60.0 +- numexpr >=2.10.2 +- odfpy >=1.4.1 +- openpyxl >=3.1.5 +- psycopg2 >=2.9.10 +- pyarrow >=13.0.0 +- pyiceberg >=0.8.1 +- pymysql >=1.1.1 +- pyqt5 >=5.15.9 +- pyreadstat >=1.2.8 +- pytables >=3.10.1 +- pytest >=8.3.4 +- pytest-xdist >=3.6.1 +- python-calamine >=0.3.0 +- pytz >=2024.2 +- pyxlsb >=1.0.10 +- qtpy >=2.4.2 +- scipy >=1.14.1 +- s3fs >=2024.10.0 +- sqlalchemy >=2.0.36 +- tabulate >=0.9.0 +- xarray >=2024.10.0 +- xlrd >=2.0.1 +- xlsxwriter >=3.2.0 +- zstandard >=0.23.0 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/pandas?source=hash-mapping +size: 14663420 +timestamp: 1778602607643 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pillow-12.2.0-py312h3b21937_0.conda +sha256: 288e2bf65769f196261f1d4ad9997057bcefd2d1be191df58b928e7300d460da +md5: 6d40028aafd1ac96b8d4e2a93fca200f +depends: +- python +- python 3.12.* *_cpython +- libgcc >=14 +- libxcb >=1.17.0,<2.0a0 +- libjpeg-turbo >=3.1.2,<4.0a0 +- lcms2 >=2.18,<3.0a0 +- python_abi 3.12.* *_cp312 +- libtiff >=4.7.1,<4.8.0a0 +- libwebp-base >=1.6.0,<2.0a0 +- tk >=8.6.13,<8.7.0a0 +- zlib-ng >=2.3.3,<2.4.0a0 +- libfreetype >=2.14.3 +- libfreetype6 >=2.14.3 +- openjpeg >=2.5.4,<3.0a0 +license: HPND +purls: +- pkg:pypi/pillow?source=hash-mapping +size: 1020171 +timestamp: 1775060067775 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.1.1-pyh8b19718_0.conda +sha256: 1bd94ef1ae08fd811ef3b26857e46ba460c7430bf1f3ccd94a4d6614fd619bd5 +md5: 35870d32aed92041d31cbb15e822dca3 +depends: +- python >=3.10,<3.13.0a0 +- setuptools +- wheel +license: MIT +license_family: MIT +purls: +- pkg:pypi/pip?source=hash-mapping +size: 1201616 +timestamp: 1777924080196 +- conda: https://conda.anaconda.org/conda-forge/noarch/plotly-6.6.0-pyhd8ed1ab_0.conda +sha256: c418d325359fc7a0074cea7f081ef1bce26e114d2da8a0154c5d27ecc87a08e7 +md5: 3e9427ee186846052e81fadde8ebe96a +depends: +- narwhals >=1.15.1 +- packaging +- python >=3.10 +constrains: +- ipywidgets >=7.6 +license: MIT +license_family: MIT +purls: +- pkg:pypi/plotly?source=hash-mapping +size: 5251872 +timestamp: 1772628857717 +- conda: https://conda.anaconda.org/conda-forge/noarch/polars-1.41.0-pyh58ad624_0.conda +sha256: 70fc56877c4a095ee658d61924d8019768fbae4a48437058d181fc94b0a7c4d8 +md5: 25a883fed9f1f3f21ff317a3e7c92ac4 +depends: +- polars-runtime-32 ==1.41.0 +- python >=3.10 +- python +constrains: +- numpy >=1.16.0 +- pyarrow >=7.0.0 +- fastexcel >=0.9 +- openpyxl >=3.0.0 +- xlsx2csv >=0.8.0 +- connectorx >=0.3.2 +- deltalake >=1.0.0 +- pyiceberg >=0.7.1 +- altair >=5.4.0 +- great_tables >=0.8.0 +- polars-runtime-32 ==1.41.0 +- polars-runtime-64 ==1.41.0 +- polars-runtime-compat ==1.41.0 +license: MIT +purls: +- pkg:pypi/polars?source=hash-mapping +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: d903b774ec09189e164207328aac157eee82fed8cc5c9ace46aeb5d1c15cb5b3 +md5: 8c08c506ed1ea8ce0ca37af5e918c58d +depends: +- python +- libgcc >=14 +- libstdcxx >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +purls: +- pkg:pypi/polars-runtime-32?source=hash-mapping +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 +- libgcc >=14 +- _python_abi3_support 1.* +- cpython >=3.10 +constrains: +- __glibc >=2.17 +license: MIT +purls: +- pkg:pypi/polars-runtime-compat?source=hash-mapping +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 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-2.0-or-later AND LGPL-2.0-or-later +license_family: GPL +purls: [] +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 +purls: [] +size: 8342 +timestamp: 1726803319942 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyaml-env-1.2.2-pyhd8ed1ab_0.conda +sha256: 58994e0d2ea8584cb399546e6f6896d771995e6121d1a7b6a2c9948388358932 +md5: e17be1016bcc3516827b836cd3e4d9dc +depends: +- python >=3.9 +- pyyaml >=5.0,<=7.0 +license: MIT +license_family: MIT +purls: +- pkg:pypi/pyaml-env?source=hash-mapping +size: 14645 +timestamp: 1736766960536 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda +sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f +md5: 729843edafc0899b3348bd3f19525b9d +depends: +- typing-inspection >=0.4.2 +- typing_extensions >=4.14.1 +- python >=3.10 +- annotated-types >=0.6.0 +- pydantic-core ==2.46.4 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/pydantic?source=hash-mapping +size: 346511 +timestamp: 1778103405862 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.46.4-py312h5eb8f6c_0.conda +sha256: 10ed377d2cfde0fa7f796e49e6ab7685fc51e90fc8cedc8fef9edcc2b156cb81 +md5: 77d5e3d055eb85714fb15dca2dd824a4 +depends: +- python +- typing-extensions >=4.6.0,!=4.7.0 +- libgcc >=14 +- python 3.12.* *_cpython +- python_abi 3.12.* *_cp312 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +purls: +- pkg:pypi/pydantic-core?source=hash-mapping +size: 1782281 +timestamp: 1778084250371 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda +sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 +md5: 16c18772b340887160c79a6acc022db0 +depends: +- python >=3.10 +license: BSD-2-Clause +license_family: BSD +purls: +- pkg:pypi/pygments?source=hash-mapping +size: 893031 +timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda +sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 +md5: 461219d1a5bd61342293efa2c0c90eac +depends: +- __unix +- python >=3.9 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/pysocks?source=hash-mapping +size: 21085 +timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.13-h91f4b29_0_cpython.conda +sha256: 61933478813f5fd96c89a00dd964201b0266d71d2e3bc4dd5679354056e46948 +md5: 8aed8fdbbc03a5c9f455d20ce75a9dce +depends: +- bzip2 >=1.0.8,<2.0a0 +- ld_impl_linux-aarch64 >=2.36.1 +- libexpat >=2.7.4,<3.0a0 +- libffi >=3.5.2,<3.6.0a0 +- libgcc >=14 +- liblzma >=5.8.2,<6.0a0 +- libnsl >=2.0.1,<2.1.0a0 +- libsqlite >=3.51.2,<4.0a0 +- libuuid >=2.41.3,<3.0a0 +- libxcrypt >=4.4.36 +- libzlib >=1.3.1,<2.0a0 +- ncurses >=6.5,<7.0a0 +- openssl >=3.5.5,<4.0a0 +- readline >=8.3,<9.0a0 +- tk >=8.6.13,<8.7.0a0 +- tzdata +constrains: +- python_abi 3.12.* *_cp312 +license: Python-2.0 +purls: [] +size: 13757191 +timestamp: 1772728951853 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda +sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 +md5: 5b8d21249ff20967101ffa321cab24e8 +depends: +- python >=3.9 +- six >=1.5 +- python +license: Apache-2.0 +license_family: APACHE +purls: +- pkg:pypi/python-dateutil?source=hash-mapping +size: 233310 +timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dotenv-1.2.2-pyhcf101f3_0.conda +sha256: 74e417a768f59f02a242c25e7db0aa796627b5bc8c818863b57786072aeb85e5 +md5: 130584ad9f3a513cdd71b1fdc1244e9c +depends: +- python >=3.10 +license: BSD-3-Clause +license_family: BSD +purls: +- pkg:pypi/python-dotenv?source=hash-mapping +size: 27848 +timestamp: 1772388605021 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.12.13-hd8ed1ab_0.conda +sha256: 97327b9509ae3aae28d27217a5d7bd31aff0ab61a02041e9c6f98c11d8a53b29 +md5: 32780d6794b8056b78602103a04e90ef +depends: +- cpython 3.12.13.* +- python_abi * *_cp312 +license: Python-2.0 +purls: [] +size: 46449 +timestamp: 1772728979370 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-kaleido-0.2.1-pyhd8ed1ab_0.tar.bz2 +sha256: e17bf63a30aec33432f1ead86e15e9febde9fc40a7f869c0e766be8d2db44170 +md5: 310259a5b03ff02289d7705f39e2b1d2 +depends: +- kaleido-core 0.2.1.* +- python >=3.5 +license: MIT +license_family: MIT +purls: +- pkg:pypi/kaleido?source=hash-mapping +size: 18320 +timestamp: 1615204747600 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda +build_number: 8 +sha256: 80677180dd3c22deb7426ca89d6203f1c7f1f256f2d5a94dc210f6e758229809 +md5: c3efd25ac4d74b1584d2f7a57195ddf1 +constrains: +- python 3.12.* *_cpython +license: BSD-3-Clause +license_family: BSD +purls: [] +size: 6958 +timestamp: 1752805918820 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda +sha256: 0ba02720b470150a8c6261a86ea4db01dcf121e16a3e3978a84e965d3fe9c39a +md5: 47018c13dbb26186b577fd8bd1823a44 +depends: +- libgcc >=14 +- python >=3.12,<3.13.0a0 +- python >=3.12,<3.13.0a0 *_cpython +- python_abi 3.12.* *_cp312 +- yaml >=0.2.5,<0.3.0a0 +license: MIT +license_family: MIT +purls: +- pkg:pypi/pyyaml?source=hash-mapping +size: 192182 +timestamp: 1770223431156 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.3-hb682ff5_0.conda +sha256: fe695f9d215e9a2e3dd0ca7f56435ab4df24f5504b83865e3d295df36e88d216 +md5: 3d49cad61f829f4f0e0611547a9cda12 +depends: +- libgcc >=14 +- ncurses >=6.5,<7.0a0 +license: GPL-3.0-only +license_family: GPL +purls: [] +size: 357597 +timestamp: 1765815673644 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda +sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 +md5: 870293df500ca7e18bedefa5838a22ab +depends: +- attrs >=22.2.0 +- python >=3.10 +- rpds-py >=0.7.0 +- typing_extensions >=4.4.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/referencing?source=hash-mapping +size: 51788 +timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.5.9-py312hcd1a082_0.conda +sha256: 829ea3e284c18d331eaf474f366f1f7c8181470bde215e7ecf7119108b331511 +md5: 29d9375f7e73ce33eeb0609bbcadb267 +depends: +- libgcc >=14 +- python >=3.12,<3.13.0a0 +- python >=3.12,<3.13.0a0 *_cpython +- python_abi 3.12.* *_cp312 +license: Apache-2.0 AND CNRI-Python +license_family: PSF +purls: +- pkg:pypi/regex?source=hash-mapping +size: 405735 +timestamp: 1778374200794 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda +sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da +md5: 4a85203c1d80c1059086ae860836ffb9 +depends: +- python >=3.10 +- certifi >=2023.5.7 +- charset-normalizer >=2,<4 +- idna >=2.5,<4 +- urllib3 >=1.26,<3 +- python +constrains: +- chardet >=3.0.2,<8 +license: Apache-2.0 +license_family: APACHE +purls: +- pkg:pypi/requests?source=compressed-mapping +size: 68709 +timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda +sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a +md5: 0242025a3c804966bf71aa04eee82f66 +depends: +- markdown-it-py >=2.2.0 +- pygments >=2.13.0,<3.0.0 +- python >=3.10 +- typing_extensions >=4.0.0,<5.0.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/rich?source=hash-mapping +size: 208577 +timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda +sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 +md5: 0c20a8ebcddb24a45da89d5e917e6cb9 +depends: +- python >=3.10 +- rich >=12 +- click >=8 +- typing-extensions >=4 +- __unix +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/rich-click?source=hash-mapping +size: 64356 +timestamp: 1769850479089 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rpds-py-0.30.0-py312h75d7d99_0.conda +sha256: 51e7d33b71b30ac5ceab09cc35521eccdaf4e3897ca4c6eda1059fb82a91b285 +md5: 85212b0e327723285cc36efddd25e03d +depends: +- python +- libgcc >=14 +- python_abi 3.12.* *_cp312 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +purls: +- pkg:pypi/rpds-py?source=hash-mapping +size: 380599 +timestamp: 1764543504405 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda +sha256: 82088a6e4daa33329a30bc26dc19a98c7c1d3f05c0f73ce9845d4eab4924e9e1 +md5: 8e194e7b992f99a5015edbd4ebd38efd +depends: +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/setuptools?source=hash-mapping +size: 639697 +timestamp: 1773074868565 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda +sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d +md5: 3339e3b65d58accf4ca4fb8748ab16b3 +depends: +- python >=3.9 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/six?source=hash-mapping +size: 18455 +timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/spectra-0.0.11-pyhd8ed1ab_2.conda +sha256: 7c65782d2511738e62c70462e89d65da4fa54d5a7e47c46667bcd27a59f81876 +md5: 472239e4eb7b5a84bb96b3ed7e3a596a +depends: +- colormath >=3.0.0 +- python >=3.9 +license: MIT +license_family: MIT +purls: +- pkg:pypi/spectra?source=hash-mapping +size: 22284 +timestamp: 1735770589188 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sqlite-3.53.1-he8854b5_0.conda +sha256: 27467e4bfb0681546f149718c33b806fec078185fbaa6a4d17d440bc8f56185c +md5: 46009bdca2315a99e0a3a7d0ba1af3b9 +depends: +- libgcc >=14 +- libsqlite 3.53.1 h022381a_0 +- libzlib >=1.3.2,<2.0a0 +- ncurses >=6.6,<7.0a0 +- readline >=8.3,<9.0a0 +license: blessing +purls: [] +size: 209964 +timestamp: 1777986493350 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tiktoken-0.12.0-py312h1826693_3.conda +sha256: 2b4593bdc2aff69b821cbe9aa277d39d2d7b306ec97ea5da91da9b8e2943cdd6 +md5: f61eeb18f94773129f56b7073e96bc68 +depends: +- libgcc >=14 +- libstdcxx >=14 +- python >=3.12,<3.13.0a0 +- python_abi 3.12.* *_cp312 +- regex >=2022.1.18 +- requests >=2.26.0 +constrains: +- __glibc >=2.17 +license: MIT +license_family: MIT +purls: +- pkg:pypi/tiktoken?source=hash-mapping +size: 911935 +timestamp: 1764031187914 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda +sha256: e25c314b52764219f842b41aea2c98a059f06437392268f09b03561e4f6e5309 +md5: 7fc6affb9b01e567d2ef1d05b84aa6ed +depends: +- libgcc >=14 +- libzlib >=1.3.1,<2.0a0 +constrains: +- xorg-libx11 >=1.8.12,<2.0a0 +license: TCL +license_family: BSD +purls: [] +size: 3368666 +timestamp: 1769464148928 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.3-pyh8f84b5b_0.conda +sha256: 9ef8e47cf00e4d6dcc114eb32a1504cc18206300572ef14d76634ba29dfe1eb6 +md5: e5ce43272193b38c2e9037446c1d9206 +depends: +- python >=3.10 +- __unix +- python +license: MPL-2.0 and MIT +purls: +- pkg:pypi/tqdm?source=hash-mapping +size: 94132 +timestamp: 1770153424136 +- conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.2-pyhcf101f3_0.conda +sha256: 59d7851d32fddb5b510272e6557aa982edeb927d349648dac27f5bf01d18bb26 +md5: 4460f039b7dedf15f7df086446ca75ae +depends: +- typing_extensions >=4.14.0 +- python >=3.10 +- importlib-metadata >=3.6 +- python +constrains: +- pytest >=7 +license: MIT +license_family: MIT +purls: +- pkg:pypi/typeguard?source=hash-mapping +size: 38297 +timestamp: 1778779291237 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda +sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c +md5: edd329d7d3a4ab45dcf905899a7a6115 +depends: +- typing_extensions ==4.15.0 pyhcf101f3_0 +license: PSF-2.0 +license_family: PSF +purls: [] +size: 91383 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda +sha256: 8b90d2f19f9458b8c58a55e1fcdc1d90c1603a847a47654d8a454549413ba60a +md5: 53f5409c5cfd6c5a66417d68e3f0a864 +depends: +- python >=3.10 +- typing_extensions >=4.12.0 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/typing-inspection?source=hash-mapping +size: 20935 +timestamp: 1777105465795 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda +sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 +md5: 0caa1af407ecff61170c9437a808404d +depends: +- python >=3.10 +- python +license: PSF-2.0 +license_family: PSF +purls: +- pkg:pypi/typing-extensions?source=hash-mapping +size: 51692 +timestamp: 1756220668932 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda +sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c +md5: ad659d0a2b3e47e38d829aa8cad2d610 +license: LicenseRef-Public-Domain +purls: [] +size: 119135 +timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda +sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 +md5: cbb88288f74dbe6ada1c6c7d0a97223e +depends: +- backports.zstd >=1.0.0 +- brotli-python >=1.2.0 +- h2 >=4,<5 +- pysocks >=1.5.6,<2.0,!=1.5.7 +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/urllib3?source=hash-mapping +size: 103560 +timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/noarch/wheel-0.47.0-pyhd8ed1ab_0.conda +sha256: 9e156ffaefb8463437144326ada4b85d1de17961b9997ac5f1cbbaf747bd8bed +md5: d0e3b2f0030cf4fca58bde71d246e94c +depends: +- packaging >=24.0 +- python >=3.10 +license: MIT +license_family: MIT +purls: +- pkg:pypi/wheel?source=hash-mapping +size: 33491 +timestamp: 1776878563806 +- 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 +purls: [] +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 +purls: [] +size: 21039 +timestamp: 1762979038025 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda +sha256: 66265e943f32ce02396ad214e27cb35f5b0490b3bd4f064446390f9d67fa5d88 +md5: 032d8030e4a24fe1f72c74423a46fb88 +depends: +- libgcc >=14 +license: MIT +license_family: MIT +purls: [] +size: 88088 +timestamp: 1753484092643 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda +sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 +md5: ba3dcdc8584155c97c648ae9c044b7a3 +depends: +- python >=3.10 +- python +license: MIT +license_family: MIT +purls: +- pkg:pypi/zipp?source=compressed-mapping +size: 24190 +timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-ng-2.3.3-ha7cb516_1.conda +sha256: 638a3a41a4fbfed52d3c60c8ef5a3693b3f12a5b1a3f58fa29f5698d0a0702e2 +md5: f731af71c723065d91b4c01bb822641b +depends: +- libgcc >=14 +- libstdcxx >=14 +license: Zlib +license_family: Other +purls: [] +size: 121046 +timestamp: 1770167944449 +- 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 +purls: [] +size: 614429 +timestamp: 1764777145593 diff --git a/modules/nf-core/multiqcsav/environment.yml b/modules/nf-core/multiqcsav/environment.yml index b95a2972..b190a347 100644 --- a/modules/nf-core/multiqcsav/environment.yml +++ b/modules/nf-core/multiqcsav/environment.yml @@ -5,9 +5,9 @@ channels: - bioconda dependencies: # renovate: datasource=conda depName=bioconda/multiqc - - bioconda::multiqc=1.34 + - bioconda::multiqc=1.35 # renovate: datasource=conda depName=bioconda/multiqc_sav - bioconda::multiqc_sav=0.2.0 - - pip=25.3 + - pip=26.1.1 - pip: - interop==1.9.0 diff --git a/modules/nf-core/multiqcsav/main.nf b/modules/nf-core/multiqcsav/main.nf index 5d25de8f..09846f59 100644 --- a/modules/nf-core/multiqcsav/main.nf +++ b/modules/nf-core/multiqcsav/main.nf @@ -4,8 +4,8 @@ process MULTIQCSAV { 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/45/4590c19f294469392d1bd2689eb9d4a06f18d20f64c5dbc0bbc17473c9941b4e/data' - : 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:644a84cef31cc4aa'}" + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c1/c1311ac2bfb96d77487985fce321b25bbea85f574f9932b827ed6cafe7f75963/data' + : 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9b10d606ce2f36b6'}" input: tuple val(meta), path(xml), path(interop_bin, stageAs: "InterOp/*"), path(extra_multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) diff --git a/modules/nf-core/multiqcsav/meta.yml b/modules/nf-core/multiqcsav/meta.yml index 1bef87b5..7c3130ad 100644 --- a/modules/nf-core/multiqcsav/meta.yml +++ b/modules/nf-core/multiqcsav/meta.yml @@ -140,24 +140,24 @@ maintainers: containers: conda: linux/amd64: - lock_file: modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-644a84cef31cc4aa_1.txt + lock_file: modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt linux/arm64: - lock_file: modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-039d1ec6b47ba325_1.txt + lock_file: modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt docker: linux/amd64: - name: community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:644a84cef31cc4aa - build_id: bd-644a84cef31cc4aa_1 - scan_id: sc-253553e37f233660_1 + name: community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9b10d606ce2f36b6 + build_id: bd-9b10d606ce2f36b6_1 + scan_id: sc-e07d8899984fea53_1 linux/arm64: - name: community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:039d1ec6b47ba325 - build_id: bd-039d1ec6b47ba325_1 - scan_id: sc-1c30a1d921d59ec5_1 + name: community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:077315907ed11315 + build_id: bd-077315907ed11315_1 + scan_id: sc-bd28ba4987c53bbe_1 singularity: linux/amd64: - name: oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9ebe780f2738c655 - build_id: bd-9ebe780f2738c655_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/45/4590c19f294469392d1bd2689eb9d4a06f18d20f64c5dbc0bbc17473c9941b4e/data + name: oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:a26da1aa4e8d32a6 + build_id: bd-a26da1aa4e8d32a6_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c1/c1311ac2bfb96d77487985fce321b25bbea85f574f9932b827ed6cafe7f75963/data linux/arm64: - name: oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:fc57bb53140baade - build_id: bd-fc57bb53140baade_1 - https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b0/b047611068a4009d62d8352e8bb4ab27fa993708a82c029f115e6758b2e44bec/data + name: oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:d1ed21d66511158d + build_id: bd-d1ed21d66511158d_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/05/053f6d8c55b57e04b654070a3bd6eaa90685590158019d35c16092d301b80cb1/data diff --git a/modules/nf-core/multiqcsav/tests/main.nf.test.snap b/modules/nf-core/multiqcsav/tests/main.nf.test.snap index f0a8f3f4..603248d1 100644 --- a/modules/nf-core/multiqcsav/tests/main.nf.test.snap +++ b/modules/nf-core/multiqcsav/tests/main.nf.test.snap @@ -120,7 +120,7 @@ [ "MULTIQCSAV", "multiqc", - "1.34" + "1.35" ] ], "versions_interop": [ @@ -180,7 +180,7 @@ [ "MULTIQCSAV", "multiqc", - "1.34" + "1.35" ] ], "versions_interop": [ diff --git a/modules/nf-core/riker/multi/environment.yml b/modules/nf-core/riker/multi/environment.yml new file mode 100644 index 00000000..31a43156 --- /dev/null +++ b/modules/nf-core/riker/multi/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::riker=0.2.0 diff --git a/modules/nf-core/riker/multi/main.nf b/modules/nf-core/riker/multi/main.nf new file mode 100644 index 00000000..51a3e5fd --- /dev/null +++ b/modules/nf-core/riker/multi/main.nf @@ -0,0 +1,81 @@ +process RIKER_MULTI { + 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/5b/5bf9ec40db8ba058b6ff37a94ea398f37b766858b3e584016e93643f7dde9f63/data' : + 'community.wave.seqera.io/library/riker:0.2.0--20857cea9478b433' }" + + input: + tuple val(meta), path(bam), path(bai), path(baits), path(targets) + tuple val(meta2), path(fasta), path(fai) + + output: + tuple val(meta), path("*.alignment-metrics.txt") , optional: true, emit: alignment_metrics + tuple val(meta), path("*.base-distribution-by-cycle.txt") , optional: true, emit: base_dist + tuple val(meta), path("*.mean-quality-by-cycle.txt") , optional: true, emit: mean_qual + tuple val(meta), path("*.quality-score-distribution.txt") , optional: true, emit: qual_dist + tuple val(meta), path("*.error-mismatch.txt") , optional: true, emit: error_mismatch + tuple val(meta), path("*.error-overlap.txt") , optional: true, emit: error_overlap + tuple val(meta), path("*.error-indel.txt") , optional: true, emit: error_indel + tuple val(meta), path("*.gcbias-detail.txt") , optional: true, emit: gcbias_detail + tuple val(meta), path("*.gcbias-summary.txt") , optional: true, emit: gcbias_summary + tuple val(meta), path("*.hybcap-metrics.txt") , optional: true, emit: hybcap_metrics + tuple val(meta), path("*.hybcap-per-target.txt") , optional: true, emit: hybcap_per_target + tuple val(meta), path("*.hybcap-per-base.txt*") , optional: true, emit: hybcap_per_base + tuple val(meta), path("*.isize-metrics.txt") , optional: true, emit: isize_metrics + tuple val(meta), path("*.isize-histogram.txt") , optional: true, emit: isize_histogram + tuple val(meta), path("*.wgs-metrics.txt") , optional: true, emit: wgs_metrics + tuple val(meta), path("*.wgs-coverage.txt") , optional: true, emit: wgs_coverage + tuple val(meta), path("*.pdf") , optional: true, emit: pdf + tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def ref = fasta ? "-r ${fasta}" : '' + if ((baits as Boolean) ^ (targets as Boolean)) { + error "RIKER_MULTI: both 'baits' and 'targets' must be provided together, or neither" + } + def hybcap_opts = (baits && targets) ? "--hybcap::baits ${baits} --hybcap::targets ${targets}" : '' + """ + riker multi \\ + -i ${bam} \\ + ${ref} \\ + -o ${prefix} \\ + --threads ${task.cpus} \\ + ${hybcap_opts} \\ + ${args} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.alignment-metrics.txt + touch ${prefix}.base-distribution-by-cycle.txt + touch ${prefix}.mean-quality-by-cycle.txt + touch ${prefix}.quality-score-distribution.txt + touch ${prefix}.error-mismatch.txt + touch ${prefix}.error-overlap.txt + touch ${prefix}.error-indel.txt + touch ${prefix}.gcbias-detail.txt + touch ${prefix}.gcbias-summary.txt + touch ${prefix}.hybcap-metrics.txt + touch ${prefix}.hybcap-per-target.txt + touch ${prefix}.hybcap-per-base.txt + touch ${prefix}.isize-metrics.txt + touch ${prefix}.isize-histogram.txt + touch ${prefix}.wgs-metrics.txt + touch ${prefix}.wgs-coverage.txt + touch ${prefix}.base-distribution-by-cycle.pdf + touch ${prefix}.gcbias-chart.pdf + touch ${prefix}.isize-histogram.pdf + touch ${prefix}.mean-quality-by-cycle.pdf + touch ${prefix}.quality-score-distribution.pdf + touch ${prefix}.wgs-coverage.pdf + """ +} diff --git a/modules/nf-core/riker/multi/meta.yml b/modules/nf-core/riker/multi/meta.yml new file mode 100644 index 00000000..93066a98 --- /dev/null +++ b/modules/nf-core/riker/multi/meta.yml @@ -0,0 +1,267 @@ +name: riker_multi +description: | + Run multiple riker collectors in a single BAM pass using riker multi. Specify + tools via ext.args (e.g. '--tools alignment basic isize'). The wgs and gcbias + tools require a reference FASTA; the hybcap tool requires baits and targets. +keywords: + - bam + - qc + - metrics + - multi + - alignment + - insert size + - gc bias + - coverage +tools: + - riker: + description: | + Fast Rust CLI toolkit for sequencing QC metrics. Ports key QC metrics tools + from Picard with cleaner output and better performance. + homepage: https://github.com/fulcrumgenomics/riker + documentation: https://github.com/fulcrumgenomics/riker + licence: ["MIT"] + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Aligned reads in BAM, CRAM, or SAM format + pattern: "*.{bam,cram,sam}" + ontologies: + - edam: "http://edamontology.org/format_2572" # BAM + - edam: "http://edamontology.org/format_3462" # CRAM + - bai: + type: file + description: Index for the BAM/CRAM file + pattern: "*.{bai,crai}" + ontologies: + - edam: "http://edamontology.org/format_3327" # BAI + - baits: + type: file + description: Bait interval file (IntervalList or BED). Required when running the hybcap tool. Optional otherwise. + pattern: "*.{interval_list,bed}" + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - targets: + type: file + description: Target interval file (IntervalList or BED). Required when running the hybcap tool. Optional otherwise. + pattern: "*.{interval_list,bed}" + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference genome FASTA file. Required when running wgs, gcbias, or error tools. + pattern: "*.{fa,fasta,fna}" + ontologies: + - edam: "http://edamontology.org/format_1929" # FASTA + - fai: + type: file + description: Index for the reference FASTA file + pattern: "*.fai" + ontologies: + - edam: "http://edamontology.org/format_3326" # FASTA index +output: + alignment_metrics: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.alignment-metrics.txt": + type: file + description: Alignment summary metrics (alignment tool) + pattern: "*.alignment-metrics.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + base_dist: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.base-distribution-by-cycle.txt": + type: file + description: Base distribution by cycle (basic tool) + pattern: "*.base-distribution-by-cycle.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + mean_qual: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.mean-quality-by-cycle.txt": + type: file + description: Mean quality by cycle (basic tool) + pattern: "*.mean-quality-by-cycle.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + qual_dist: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.quality-score-distribution.txt": + type: file + description: Quality score distribution (basic tool) + pattern: "*.quality-score-distribution.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + error_mismatch: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.error-mismatch.txt": + type: file + description: Base mismatch error metrics (error tool) + pattern: "*.error-mismatch.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + error_overlap: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.error-overlap.txt": + type: file + description: Read overlap error metrics (error tool) + pattern: "*.error-overlap.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + error_indel: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.error-indel.txt": + type: file + description: Indel error metrics (error tool) + pattern: "*.error-indel.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + gcbias_detail: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.gcbias-detail.txt": + type: file + description: Per-GC-bin detail metrics (gcbias tool) + pattern: "*.gcbias-detail.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + gcbias_summary: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.gcbias-summary.txt": + type: file + description: GC bias summary metrics (gcbias tool) + pattern: "*.gcbias-summary.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + hybcap_metrics: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.hybcap-metrics.txt": + type: file + description: Hybrid capture summary metrics (hybcap tool) + pattern: "*.hybcap-metrics.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + hybcap_per_target: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.hybcap-per-target.txt": + type: file + description: Per-target coverage metrics (hybcap tool, optional) + pattern: "*.hybcap-per-target.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + hybcap_per_base: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.hybcap-per-base.txt*": + type: file + description: Per-base coverage values (hybcap tool, optional) + pattern: "*.hybcap-per-base.txt{,.gz}" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + isize_metrics: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.isize-metrics.txt": + type: file + description: Insert size summary metrics (isize tool) + pattern: "*.isize-metrics.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + isize_histogram: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.isize-histogram.txt": + type: file + description: Insert size histogram (isize tool) + pattern: "*.isize-histogram.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + wgs_metrics: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.wgs-metrics.txt": + type: file + description: Whole-genome coverage summary metrics (wgs tool) + pattern: "*.wgs-metrics.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + wgs_coverage: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.wgs-coverage.txt": + type: file + description: Per-depth coverage histogram (wgs tool) + pattern: "*.wgs-coverage.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + pdf: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.pdf": + type: file + description: PDF plots from any tool that generates them + pattern: "*.pdf" + ontologies: + - edam: "http://edamontology.org/format_3508" # PDF + versions_riker: + - - ${task.process}: + type: string + description: The name of the process + - riker: + type: string + description: The name of the tool + - riker --version 2>&1 | sed 's/riker //': + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - riker: + type: string + description: The name of the tool + - riker --version 2>&1 | sed 's/riker //': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@emmcauley" +maintainers: + - "@emmcauley" diff --git a/modules/nf-core/riker/multi/tests/main.nf.test b/modules/nf-core/riker/multi/tests/main.nf.test new file mode 100644 index 00000000..616c9db3 --- /dev/null +++ b/modules/nf-core/riker/multi/tests/main.nf.test @@ -0,0 +1,344 @@ +nextflow_process { + + name "Test Process RIKER_MULTI" + script "../main.nf" + process "RIKER_MULTI" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "riker" + tag "riker/multi" + + test("sarscov2 - paired_end - bam - alignment basic isize") { + + when { + params { + module_args = '--tools alignment basic isize' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + [], + [] + ] + input[1] = [[],[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("sarscov2 - paired_end - bam - wgs gcbias") { + + when { + params { + module_args = '--tools wgs gcbias' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + [], + [] + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("sarscov2 - paired_end - bam - wgs gcbias alignment basic isize") { + + when { + params { + module_args = '--tools wgs gcbias alignment basic isize' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + [], + [] + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("homo_sapiens - paired_end - cram - alignment basic isize") { + + when { + params { + module_args = '--tools alignment basic isize' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), + [], + [] + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("sarscov2 - paired_end - bam - hybcap") { + + when { + params { + module_args = '--tools hybcap' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("sarscov2 - paired_end - bam - error") { + + when { + params { + module_args = '--tools error --error::stratify-by bq isize gc' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + [], + [] + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("sarscov2 - paired_end - bam - error alignment") { + + when { + params { + module_args = '--tools error alignment --error::stratify-by bq isize gc' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + [], + [] + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("sarscov2 - paired_end - bam - all tools") { + + when { + params { + module_args = '--tools alignment basic isize wgs gcbias hybcap error --error::stratify-by bq isize gc' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf"])).match() } + ) + } + } + + test("sarscov2 - paired_end - bam - baits without targets fails") { + + when { + params { + module_args = '--tools hybcap' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), + [] + ] + input[1] = [[],[],[]] + """ + } + } + + then { + assert process.failed + } + } + + test("sarscov2 - paired_end - bam - targets without baits fails") { + + when { + params { + module_args = '--tools hybcap' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + [], + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) + ] + input[1] = [[],[],[]] + """ + } + } + + then { + assert process.failed + } + } + + test("sarscov2 - paired_end - bam - stub") { + + options "-stub" + + when { + params { + module_args = '--tools alignment basic isize' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + 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), + [], + [] + ] + input[1] = [[],[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/riker/multi/tests/main.nf.test.snap b/modules/nf-core/riker/multi/tests/main.nf.test.snap new file mode 100644 index 00000000..2d1f4b3d --- /dev/null +++ b/modules/nf-core/riker/multi/tests/main.nf.test.snap @@ -0,0 +1,1244 @@ +{ + "sarscov2 - paired_end - bam - alignment basic isize": { + "content": [ + { + "alignment_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,ef2421780f4e1127dac0ae3d6702d33f" + ] + ], + "base_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.base-distribution-by-cycle.txt:md5,921d4ed3fc1ddb54b8e7c616d78e0736" + ] + ], + "error_indel": [ + + ], + "error_mismatch": [ + + ], + "error_overlap": [ + + ], + "gcbias_detail": [ + + ], + "gcbias_summary": [ + + ], + "hybcap_metrics": [ + + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-histogram.txt:md5,68742e205c83b880802c3c5bbe7e882c" + ] + ], + "isize_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-metrics.txt:md5,c3bef6653b685c99e373a1dfccedc52d" + ] + ], + "mean_qual": [ + [ + { + "id": "test", + "single_end": false + }, + "test.mean-quality-by-cycle.txt:md5,476932952a367fe567eba75d6ff51630" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.base-distribution-by-cycle.pdf", + "test.isize-histogram.pdf", + "test.mean-quality-by-cycle.pdf", + "test.quality-score-distribution.pdf" + ] + ] + ], + "qual_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.quality-score-distribution.txt:md5,d5f17682727e31f05dc8b29b7c06b3ab" + ] + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + + ], + "wgs_metrics": [ + + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:39:13.290706" + }, + "sarscov2 - paired_end - bam - hybcap": { + "content": [ + { + "alignment_metrics": [ + + ], + "base_dist": [ + + ], + "error_indel": [ + + ], + "error_mismatch": [ + + ], + "error_overlap": [ + + ], + "gcbias_detail": [ + + ], + "gcbias_summary": [ + + ], + "hybcap_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-metrics.txt:md5,65d0a112bd3508d6c3b5328c8fcfcbdb" + ] + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + + ], + "isize_metrics": [ + + ], + "mean_qual": [ + + ], + "pdf": [ + + ], + "qual_dist": [ + + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + + ], + "wgs_metrics": [ + + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:40:59.193433" + }, + "sarscov2 - paired_end - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.base-distribution-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-per-target.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-per-base.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "16": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.base-distribution-by-cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.gcbias-chart.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.isize-histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.mean-quality-by-cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.quality-score-distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.wgs-coverage.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "17": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.mean-quality-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + "test.quality-score-distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-mismatch.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-overlap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-indel.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-detail.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "alignment_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "base_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.base-distribution-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "error_indel": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-indel.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "error_mismatch": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-mismatch.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "error_overlap": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-overlap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gcbias_detail": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-detail.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gcbias_summary": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "hybcap_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "hybcap_per_base": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-per-base.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "hybcap_per_target": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-per-target.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "isize_histogram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "isize_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "mean_qual": [ + [ + { + "id": "test", + "single_end": false + }, + "test.mean-quality-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.base-distribution-by-cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.gcbias-chart.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.isize-histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.mean-quality-by-cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.quality-score-distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", + "test.wgs-coverage.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "qual_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.quality-score-distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "wgs_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-05-27T12:11:02.975991" + }, + "sarscov2 - paired_end - bam - wgs gcbias alignment basic isize": { + "content": [ + { + "alignment_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,ef2421780f4e1127dac0ae3d6702d33f" + ] + ], + "base_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.base-distribution-by-cycle.txt:md5,921d4ed3fc1ddb54b8e7c616d78e0736" + ] + ], + "error_indel": [ + + ], + "error_mismatch": [ + + ], + "error_overlap": [ + + ], + "gcbias_detail": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-detail.txt:md5,44cd58d1a0bd81ca8ea5d3fa7c07e4db" + ] + ], + "gcbias_summary": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-summary.txt:md5,dd6d6d34bd4bdfdd815c452a68efa0e0" + ] + ], + "hybcap_metrics": [ + + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-histogram.txt:md5,68742e205c83b880802c3c5bbe7e882c" + ] + ], + "isize_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-metrics.txt:md5,c3bef6653b685c99e373a1dfccedc52d" + ] + ], + "mean_qual": [ + [ + { + "id": "test", + "single_end": false + }, + "test.mean-quality-by-cycle.txt:md5,476932952a367fe567eba75d6ff51630" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.base-distribution-by-cycle.pdf", + "test.gcbias-chart.pdf", + "test.isize-histogram.pdf", + "test.mean-quality-by-cycle.pdf", + "test.quality-score-distribution.pdf", + "test.wgs-coverage.pdf" + ] + ] + ], + "qual_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.quality-score-distribution.txt:md5,d5f17682727e31f05dc8b29b7c06b3ab" + ] + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-coverage.txt:md5,8fd648b0045ff06fc3ba46772e33255c" + ] + ], + "wgs_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-metrics.txt:md5,d7bb5636d4abeefe85f5ca2a6674adb2" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:40:06.58392" + }, + "sarscov2 - paired_end - bam - error": { + "content": [ + { + "alignment_metrics": [ + + ], + "base_dist": [ + + ], + "error_indel": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-indel.txt:md5,9626acfbfc0c901c8a2999df3796cae0" + ] + ], + "error_mismatch": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-mismatch.txt:md5,e5a53c4bd345321a872e94752eabae18" + ] + ], + "error_overlap": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-overlap.txt:md5,4426d9733ae3e59dc2496b0c247c22f2" + ] + ], + "gcbias_detail": [ + + ], + "gcbias_summary": [ + + ], + "hybcap_metrics": [ + + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + + ], + "isize_metrics": [ + + ], + "mean_qual": [ + + ], + "pdf": [ + + ], + "qual_dist": [ + + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + + ], + "wgs_metrics": [ + + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:41:26.083098" + }, + "homo_sapiens - paired_end - cram - alignment basic isize": { + "content": [ + { + "alignment_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,2e8b897e737afd500c17de8526ea055b" + ] + ], + "base_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.base-distribution-by-cycle.txt:md5,995374424608c109ad6603e6b56adf87" + ] + ], + "error_indel": [ + + ], + "error_mismatch": [ + + ], + "error_overlap": [ + + ], + "gcbias_detail": [ + + ], + "gcbias_summary": [ + + ], + "hybcap_metrics": [ + + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-histogram.txt:md5,fc8e1ced54e36439132de087895d85fc" + ] + ], + "isize_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-metrics.txt:md5,5abd96d5d46783ff122b110b95b7eedd" + ] + ], + "mean_qual": [ + [ + { + "id": "test", + "single_end": false + }, + "test.mean-quality-by-cycle.txt:md5,70c31ea94a4a6be25a12a1a2221b7ffa" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.base-distribution-by-cycle.pdf", + "test.isize-histogram.pdf", + "test.mean-quality-by-cycle.pdf", + "test.quality-score-distribution.pdf" + ] + ] + ], + "qual_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.quality-score-distribution.txt:md5,1e4ceaf9de78390f1f542eec5dc7275f" + ] + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + + ], + "wgs_metrics": [ + + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:40:33.177675" + }, + "sarscov2 - paired_end - bam - all tools": { + "content": [ + { + "alignment_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,ef2421780f4e1127dac0ae3d6702d33f" + ] + ], + "base_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.base-distribution-by-cycle.txt:md5,921d4ed3fc1ddb54b8e7c616d78e0736" + ] + ], + "error_indel": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-indel.txt:md5,9626acfbfc0c901c8a2999df3796cae0" + ] + ], + "error_mismatch": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-mismatch.txt:md5,e5a53c4bd345321a872e94752eabae18" + ] + ], + "error_overlap": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-overlap.txt:md5,4426d9733ae3e59dc2496b0c247c22f2" + ] + ], + "gcbias_detail": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-detail.txt:md5,44cd58d1a0bd81ca8ea5d3fa7c07e4db" + ] + ], + "gcbias_summary": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-summary.txt:md5,dd6d6d34bd4bdfdd815c452a68efa0e0" + ] + ], + "hybcap_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.hybcap-metrics.txt:md5,65d0a112bd3508d6c3b5328c8fcfcbdb" + ] + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-histogram.txt:md5,68742e205c83b880802c3c5bbe7e882c" + ] + ], + "isize_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.isize-metrics.txt:md5,c3bef6653b685c99e373a1dfccedc52d" + ] + ], + "mean_qual": [ + [ + { + "id": "test", + "single_end": false + }, + "test.mean-quality-by-cycle.txt:md5,476932952a367fe567eba75d6ff51630" + ] + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.base-distribution-by-cycle.pdf", + "test.gcbias-chart.pdf", + "test.isize-histogram.pdf", + "test.mean-quality-by-cycle.pdf", + "test.quality-score-distribution.pdf", + "test.wgs-coverage.pdf" + ] + ] + ], + "qual_dist": [ + [ + { + "id": "test", + "single_end": false + }, + "test.quality-score-distribution.txt:md5,d5f17682727e31f05dc8b29b7c06b3ab" + ] + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-coverage.txt:md5,8fd648b0045ff06fc3ba46772e33255c" + ] + ], + "wgs_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-metrics.txt:md5,d7bb5636d4abeefe85f5ca2a6674adb2" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:42:18.58754" + }, + "sarscov2 - paired_end - bam - error alignment": { + "content": [ + { + "alignment_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,ef2421780f4e1127dac0ae3d6702d33f" + ] + ], + "base_dist": [ + + ], + "error_indel": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-indel.txt:md5,9626acfbfc0c901c8a2999df3796cae0" + ] + ], + "error_mismatch": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-mismatch.txt:md5,e5a53c4bd345321a872e94752eabae18" + ] + ], + "error_overlap": [ + [ + { + "id": "test", + "single_end": false + }, + "test.error-overlap.txt:md5,4426d9733ae3e59dc2496b0c247c22f2" + ] + ], + "gcbias_detail": [ + + ], + "gcbias_summary": [ + + ], + "hybcap_metrics": [ + + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + + ], + "isize_metrics": [ + + ], + "mean_qual": [ + + ], + "pdf": [ + + ], + "qual_dist": [ + + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + + ], + "wgs_metrics": [ + + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:41:52.632206" + }, + "sarscov2 - paired_end - bam - wgs gcbias": { + "content": [ + { + "alignment_metrics": [ + + ], + "base_dist": [ + + ], + "error_indel": [ + + ], + "error_mismatch": [ + + ], + "error_overlap": [ + + ], + "gcbias_detail": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-detail.txt:md5,44cd58d1a0bd81ca8ea5d3fa7c07e4db" + ] + ], + "gcbias_summary": [ + [ + { + "id": "test", + "single_end": false + }, + "test.gcbias-summary.txt:md5,dd6d6d34bd4bdfdd815c452a68efa0e0" + ] + ], + "hybcap_metrics": [ + + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + + ], + "isize_metrics": [ + + ], + "mean_qual": [ + + ], + "pdf": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.gcbias-chart.pdf", + "test.wgs-coverage.pdf" + ] + ] + ], + "qual_dist": [ + + ], + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.2.0" + ] + ], + "wgs_coverage": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-coverage.txt:md5,8fd648b0045ff06fc3ba46772e33255c" + ] + ], + "wgs_metrics": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-metrics.txt:md5,d7bb5636d4abeefe85f5ca2a6674adb2" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-06-04T11:39:40.228372" + } +} \ No newline at end of file diff --git a/modules/nf-core/riker/multi/tests/nextflow.config b/modules/nf-core/riker/multi/tests/nextflow.config new file mode 100644 index 00000000..83152a66 --- /dev/null +++ b/modules/nf-core/riker/multi/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: 'RIKER_MULTI' { + ext.args = params.module_args + } +} From c39c9a3999eb1949a9a2e6d97d84f15ba94f6ac2 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Fri, 5 Jun 2026 13:46:37 +0200 Subject: [PATCH 04/62] replace all of picard with riker --- README.md | 2 +- assets/schema_input.json | 6 - assets/schema_sampleinfo.json | 6 - conf/modules.config | 7 - docs/images/metro_map_dark.md | 4 +- docs/images/metro_map_dark.svg | 2 +- docs/images/metro_map_light.md | 4 +- docs/images/metro_map_light.svg | 2 +- docs/output.md | 9 - docs/usage.md | 45 +- main.nf | 21 +- modules.json | 21 +- .../picard/collecthsmetrics/environment.yml | 8 - .../nf-core/picard/collecthsmetrics/main.nf | 68 -- .../nf-core/picard/collecthsmetrics/meta.yml | 129 ---- .../picard-collecthsmetrics.diff | 62 -- .../collecthsmetrics/tests/main.nf.test | 221 ------ .../collecthsmetrics/tests/main.nf.test.snap | 639 ------------------ .../collectmultiplemetrics/environment.yml | 8 - .../picard/collectmultiplemetrics/main.nf | 60 -- .../picard/collectmultiplemetrics/meta.yml | 103 --- .../picard-collectmultiplemetrics.diff | 49 -- .../collectmultiplemetrics/tests/main.nf.test | 186 ----- .../tests/main.nf.test.snap | 242 ------- .../picard/collectwgsmetrics/environment.yml | 9 - .../nf-core/picard/collectwgsmetrics/main.nf | 51 -- .../nf-core/picard/collectwgsmetrics/meta.yml | 102 --- .../picard-collectwgsmetrics.diff | 41 -- .../collectwgsmetrics/tests/main.nf.test | 138 ---- .../collectwgsmetrics/tests/main.nf.test.snap | 94 --- modules/nf-core/riker/multi/main.nf | 29 +- modules/nf-core/riker/multi/riker-multi.diff | 55 ++ subworkflows/local/bam_qc/main.nf | 67 +- tests/subworkflows/local/bam_qc/main.nf.test | 49 +- tests/workflows/preprocessing.nf.test | 21 +- workflows/preprocessing.nf | 10 +- 36 files changed, 115 insertions(+), 2455 deletions(-) delete mode 100644 modules/nf-core/picard/collecthsmetrics/environment.yml delete mode 100644 modules/nf-core/picard/collecthsmetrics/main.nf delete mode 100644 modules/nf-core/picard/collecthsmetrics/meta.yml delete mode 100644 modules/nf-core/picard/collecthsmetrics/picard-collecthsmetrics.diff delete mode 100644 modules/nf-core/picard/collecthsmetrics/tests/main.nf.test delete mode 100644 modules/nf-core/picard/collecthsmetrics/tests/main.nf.test.snap delete mode 100644 modules/nf-core/picard/collectmultiplemetrics/environment.yml delete mode 100644 modules/nf-core/picard/collectmultiplemetrics/main.nf delete mode 100644 modules/nf-core/picard/collectmultiplemetrics/meta.yml delete mode 100644 modules/nf-core/picard/collectmultiplemetrics/picard-collectmultiplemetrics.diff delete mode 100644 modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test delete mode 100644 modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap delete mode 100644 modules/nf-core/picard/collectwgsmetrics/environment.yml delete mode 100644 modules/nf-core/picard/collectwgsmetrics/main.nf delete mode 100644 modules/nf-core/picard/collectwgsmetrics/meta.yml delete mode 100644 modules/nf-core/picard/collectwgsmetrics/picard-collectwgsmetrics.diff delete mode 100644 modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test delete mode 100644 modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test.snap create mode 100644 modules/nf-core/riker/multi/riker-multi.diff diff --git a/README.md b/README.md index d6aca64a..e22cdb60 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Steps include: - Alignment using either [`bwa`](https://github.com/lh3/bwa), [`bwa-mem2`](https://github.com/bwa-mem2/bwa-mem2), [`bowtie2`](https://github.com/BenLangmead/bowtie2), [`dragmap`](https://github.com/Illumina/DRAGMAP), [`snap`](https://github.com/amplab/snap) or [`strobe`](https://github.com/ksahlin/strobealign) for DNA-seq and [`STAR`](https://github.com/alexdobin/STAR) for RNA-seq - Duplicate marking using [`bamsormadup`](https://gitlab.com/german.tischler/biobambam2) or [`samtools markdup`](http://www.htslib.org/doc/samtools-markdup.html) - Coverage analysis using [`mosdepth`](https://github.com/brentp/mosdepth) and [`samtools coverage`](http://www.htslib.org/doc/samtools-coverage.html) -- Alignment QC using [`samtools flagstat`](http://www.htslib.org/doc/samtools-flagstat.html), [`samtools stats`](http://www.htslib.org/doc/samtools-stats.html), [`samtools idxstats`](http://www.htslib.org/doc/samtools-idxstats.html) and [`picard CollectHsMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectHsMetrics), [`picard CollectWgsMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectWgsMetrics), [`picard CollectMultipleMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectMultipleMetrics) +- Alignment QC using [`samtools flagstat`](http://www.htslib.org/doc/samtools-flagstat.html), [`samtools stats`](http://www.htslib.org/doc/samtools-stats.html), [`samtools idxstats`](http://www.htslib.org/doc/samtools-idxstats.html) and [`riker multi`](https://github.com/fulcrumgenomics/riker) - QC aggregation using [`multiqc`](https://multiqc.info/) diff --git a/assets/schema_input.json b/assets/schema_input.json index 8f666f27..248fed5a 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -89,12 +89,6 @@ "description": "Whether to run coverage analysis for the sample", "default": true }, - "disable_picard_metrics": { - "meta": ["disable_picard_metrics"], - "type": "boolean", - "description": "Whether to disable Picard metrics calculation. This can be used to speed up processing if Picard is not needed.", - "default": true - }, "roi": { "meta": ["roi"], "type": "string", diff --git a/assets/schema_sampleinfo.json b/assets/schema_sampleinfo.json index 092cc130..c1938956 100644 --- a/assets/schema_sampleinfo.json +++ b/assets/schema_sampleinfo.json @@ -129,12 +129,6 @@ "description": "Whether to run coverage analysis for the sample", "default": true }, - "disable_picard_metrics": { - "meta": ["disable_picard_metrics"], - "type": "boolean", - "description": "Whether to disable Picard metrics calculation. This can be used to speed up processing if Picard is not needed.", - "default": true - }, "roi": { "meta": ["roi"], "type": "string", diff --git a/conf/modules.config b/conf/modules.config index 95978df0..d98252e1 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -257,13 +257,6 @@ process { memory = 1.GB } - //// Picard - withName: '.*BAM_QC:PICARD_.*$' { - cpus = 1 - memory = { 16.GB * task.attempt } - ext.args = "--MAX_RECORDS_IN_RAM 50000000" - } - withName: '.*MD5SUM' { cpus = 1 memory = 128.MB diff --git a/docs/images/metro_map_dark.md b/docs/images/metro_map_dark.md index 65349f39..b3c4b3b6 100644 --- a/docs/images/metro_map_dark.md +++ b/docs/images/metro_map_dark.md @@ -39,7 +39,7 @@ graph TD SAMTOOLS_COV -->|qc| MULTIQC_LIBRARY CRAM_OUT -->|qc| SAMTOOLS_QC - CRAM_OUT -->|qc| PICARD + CRAM_OUT -->|qc| RIKER SAMTOOLS_QC -->|qc| MULTIQC_LIBRARY - PICARD -->|qc| MULTIQC_LIBRARY + RIKER -->|qc| MULTIQC_LIBRARY ``` diff --git a/docs/images/metro_map_dark.svg b/docs/images/metro_map_dark.svg index 0f452bc5..8b88840b 100644 --- a/docs/images/metro_map_dark.svg +++ b/docs/images/metro_map_dark.svg @@ -87,7 +87,7 @@ MOSDEPTH SAMTOOLS_COV SAMTOOLS_QC -PICARD +RIKER MULTIQC_LIBRARY diff --git a/docs/images/metro_map_light.md b/docs/images/metro_map_light.md index 5cd6a5b0..eb93ce46 100644 --- a/docs/images/metro_map_light.md +++ b/docs/images/metro_map_light.md @@ -39,7 +39,7 @@ graph TD SAMTOOLS_COV -->|qc| MULTIQC_LIBRARY CRAM_OUT -->|qc| SAMTOOLS_QC - CRAM_OUT -->|qc| PICARD + CRAM_OUT -->|qc| RIKER SAMTOOLS_QC -->|qc| MULTIQC_LIBRARY - PICARD -->|qc| MULTIQC_LIBRARY + RIKER -->|qc| MULTIQC_LIBRARY ``` diff --git a/docs/images/metro_map_light.svg b/docs/images/metro_map_light.svg index ac3be697..c6487f66 100644 --- a/docs/images/metro_map_light.svg +++ b/docs/images/metro_map_light.svg @@ -92,7 +92,7 @@ MOSDEPTH SAMTOOLS_COV SAMTOOLS_QC -PICARD +RIKER MULTIQC_LIBRARY diff --git a/docs/output.md b/docs/output.md index 119dd95e..23e7abd8 100644 --- a/docs/output.md +++ b/docs/output.md @@ -16,15 +16,6 @@ A separate directory will be created in the output directory for each sample con Output files - `SAMPLE` - - `SAMPLE.CollectHsMetrics.coverage_metrics`: The coverage metrics calculated by `picard CollectHsMetrics` - - `SAMPLE.CollectMultipleMetrics.alignment_summary_metrics`: The alignment summary metrics calculated by `picard CollectMultipleMetrics` - - `SAMPLE.CollectMultipleMetrics.base_distribution_by_cycle_metrics`: The base distribution by cycle metrics calculated by `picard CollectMultipleMetrics` - - `SAMPLE.CollectMultipleMetrics.base_distribution_by_cycle.pdf`: PDF file containing the base distribution by cycle metrics - - `SAMPLE.CollectMultipleMetrics.quality_by_cycle_metrics`: The quality by cycle metrics calculated by `picard CollectMultipleMetrics` - - `SAMPLE.CollectMultipleMetrics.quality_by_cycle.pdf`: PDF file containing the quality by cycle metrics - - `SAMPLE.CollectMultipleMetrics.quality_distribution_metrics`: The quality by distribution metrics calculated by `picard CollectMultipleMetrics` - - `SAMPLE.CollectMultipleMetrics.quality_distribution.pdf`: PDF file containing the quality distribution metrics - - `SAMPLE.CollectMultipleMetrics.read_length_histogram.pdf`: A histogram detailing the read lengths made with `picard CollectMultipleMetrics` - `SAMPLE.coverage.txt`: The coverage metrics calculated by `samtools coverage` - `SAMPLE.cram`: The CRAM file generated by the aligner - `SAMPLE.cram.crai`: The index of the CRAM file diff --git a/docs/usage.md b/docs/usage.md index f59c809a..09ab7485 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -32,7 +32,6 @@ A `fastq` samplesheet file consisting of paired-end data may look something like adapter_R1: AGATCGGAAGAGCACACGTCTGAACTCCTTA adapter_R2: AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT run_coverage: true - disable_picard_metrics: false roi: null tag: WES sample_type: DNA @@ -42,28 +41,27 @@ A `fastq` samplesheet file consisting of paired-end data may look something like Following table shows the fields that are used by the `fastq` samplesheet: -| Column | Description | Required | -| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | -| `id` | Unique sample identifier | :heavy_check_mark: | -| `samplename` | The sample name corresponding to the sample in the Fastq file(s) | :heavy_check_mark: | -| `genome` | The genome build to use for the analysis. Currently supports `GRCh38`, `GRCm39` and `GRCz11` | :heavy_check_mark: (unless `organism` is given) | -| `organism` | Full name of the organism. Currently supports `Homo sapiens`, `Mus musculus` and `Danio rerio` | :heavy_check_mark: (unless `genome` is given) | -| `library` | Sample library name | :x: | -| `tag` | The tag used by the sample. Can be one of `WES`, `WGS`, `SeqCap` and `coPGT-M` | :x: | -| `aligner` | The aligner to use for this sample. Can be one of these: `bowtie2`, `bwamem`, `bwamem2`, `dragmap`, `strobe` and `snap`. Set to `false` to output fastq. | :heavy_check_mark: | -| `markdup` | Markdup algorithm to use for duplicate marking. Can be set to `bamsormadup`, `samtools` or `false` | :x: | -| `umi_aware` | Whether UMI-aware processing should be used. Only applies when `markdup` is set to `samtools` | :x: | -| `skip_trimming` | Skip adapter trimming step | :x: | -| `trim_front` | Number of bases to trim from the front of reads | :x: | -| `trim_tail` | Number of bases to trim from the tail of reads | :x: | -| `adapter_R1` | Adapter sequence for read 1 | :x: | -| `adapter_R2` | Adapter sequence for read 2 | :x: | -| `run_coverage` | Run coverage analysis | :x: | -| `disable_picard_metrics` | Disable Picard metrics collection | :x: | -| `roi` | The path to a BED file containing Regions Of Interest for coverage analysis | :x: | -| `sample_type` | Sample type (e.g., `DNA`, `RNA`) | :x: | -| `fastq_1` | FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :heavy_check_mark: | -| `fastq_2` | FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :x: | +| Column | Description | Required | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| `id` | Unique sample identifier | :heavy_check_mark: | +| `samplename` | The sample name corresponding to the sample in the Fastq file(s) | :heavy_check_mark: | +| `genome` | The genome build to use for the analysis. Currently supports `GRCh38`, `GRCm39` and `GRCz11` | :heavy_check_mark: (unless `organism` is given) | +| `organism` | Full name of the organism. Currently supports `Homo sapiens`, `Mus musculus` and `Danio rerio` | :heavy_check_mark: (unless `genome` is given) | +| `library` | Sample library name | :x: | +| `tag` | The tag used by the sample. Can be one of `WES`, `WGS`, `SeqCap` and `coPGT-M` | :x: | +| `aligner` | The aligner to use for this sample. Can be one of these: `bowtie2`, `bwamem`, `bwamem2`, `dragmap`, `strobe` and `snap`. Set to `false` to output fastq. | :heavy_check_mark: | +| `markdup` | Markdup algorithm to use for duplicate marking. Can be set to `bamsormadup`, `samtools` or `false` | :x: | +| `umi_aware` | Whether UMI-aware processing should be used. Only applies when `markdup` is set to `samtools` | :x: | +| `skip_trimming` | Skip adapter trimming step | :x: | +| `trim_front` | Number of bases to trim from the front of reads | :x: | +| `trim_tail` | Number of bases to trim from the tail of reads | :x: | +| `adapter_R1` | Adapter sequence for read 1 | :x: | +| `adapter_R2` | Adapter sequence for read 2 | :x: | +| `run_coverage` | Run coverage analysis | :x: | +| `roi` | The path to a BED file containing Regions Of Interest for coverage analysis | :x: | +| `sample_type` | Sample type (e.g., `DNA`, `RNA`) | :x: | +| `fastq_1` | FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :heavy_check_mark: | +| `fastq_2` | FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :x: | An [example samplesheet](../tests/inputs/test.yml) has been provided with the pipeline. @@ -108,7 +106,6 @@ A `flowcell` sample info JSON/YML file consisting for one sequencing run may loo adapter_R1: AGATCGGAAGAGCACACGTCTGAACTCCTTA adapter_R2: AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT run_coverage: true - disable_picard_metrics: false roi: null tag: WES sample_type: DNA diff --git a/main.nf b/main.nf index 8d7667e2..1f097a99 100644 --- a/main.nf +++ b/main.nf @@ -195,10 +195,6 @@ workflow { samtools_stats = PREPROCESSING.out.samtools_stats samtools_flagstat = PREPROCESSING.out.samtools_flagstat samtools_idxstats = PREPROCESSING.out.samtools_idxstats - picard_multiplemetrics = PREPROCESSING.out.picard_multiplemetrics - picard_multiplemetrics_pdf = PREPROCESSING.out.picard_multiplemetrics_pdf - picard_wgsmetrics = PREPROCESSING.out.picard_wgsmetrics - picard_hsmetrics = PREPROCESSING.out.picard_hsmetrics md5sums = PREPROCESSING.out.md5sums multiqc_report = PREPROCESSING.out.multiqc_report multiqc_data = PREPROCESSING.out.multiqc_data @@ -360,22 +356,7 @@ output { return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") } } - picard_multiplemetrics { - path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } - } - picard_multiplemetrics_pdf { - path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } - } - picard_wgsmetrics { - path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } - } - picard_hsmetrics { + riker_metrics { path { meta, _file -> return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") } diff --git a/modules.json b/modules.json index 3d86c345..e51505dd 100644 --- a/modules.json +++ b/modules.json @@ -76,28 +76,11 @@ "git_sha": "98403d15b0e50edae1f3fec5eae5e24982f1fade", "installed_by": ["modules"] }, - "picard/collecthsmetrics": { - "branch": "master", - "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", - "installed_by": ["modules"], - "patch": "modules/nf-core/picard/collecthsmetrics/picard-collecthsmetrics.diff" - }, - "picard/collectmultiplemetrics": { - "branch": "master", - "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", - "installed_by": ["modules"], - "patch": "modules/nf-core/picard/collectmultiplemetrics/picard-collectmultiplemetrics.diff" - }, - "picard/collectwgsmetrics": { - "branch": "master", - "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", - "installed_by": ["modules"], - "patch": "modules/nf-core/picard/collectwgsmetrics/picard-collectwgsmetrics.diff" - }, "riker/multi": { "branch": "master", "git_sha": "b2523041e2b941afdfbd5b3b6bc099437495f70d", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/riker/multi/riker-multi.diff" }, "samtools/convert": { "branch": "master", diff --git a/modules/nf-core/picard/collecthsmetrics/environment.yml b/modules/nf-core/picard/collecthsmetrics/environment.yml deleted file mode 100644 index b4ac4fe0..00000000 --- a/modules/nf-core/picard/collecthsmetrics/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: - # renovate: datasource=conda depName=bioconda/picard - - bioconda::picard=3.4.0 diff --git a/modules/nf-core/picard/collecthsmetrics/main.nf b/modules/nf-core/picard/collecthsmetrics/main.nf deleted file mode 100644 index 17a2736c..00000000 --- a/modules/nf-core/picard/collecthsmetrics/main.nf +++ /dev/null @@ -1,68 +0,0 @@ -process PICARD_COLLECTHSMETRICS { - tag "${meta.id}" - label 'process_single' - - 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/08/0861295baa7c01fc593a9da94e82b44a729dcaf8da92be8e565da109aa549b25/data' - : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" - - input: - tuple val(meta), path(bam), path(bai), path(bait_intervals, stageAs: "bait/*"), path(target_intervals, stageAs: "target/*") ,path(fasta) ,path(fai) ,path(dict) - - output: - tuple val(meta), path("*_metrics"), emit: metrics - tuple val("${task.process}"), val('picard'), eval("picard CollectHsMetrics --version 2>&1 | sed -n 's/.*Version://p'"), topic: versions, emit: versions_picard - - 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_SEQUENCE ${fasta}" : "" - - def avail_mem = 3072 - if (!task.memory) { - log.info('[Picard CollectHsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') - } - else { - avail_mem = (task.memory.mega * 0.8).intValue() - } - - def bait_interval_list = bait_intervals - def bait_intervallist_cmd = "" - if (bait_intervals =~ /.(bed|bed.gz)$/) { - bait_interval_list = bait_intervals.toString().replaceAll(/.(bed|bed.gz)$/, ".interval_list") - bait_intervallist_cmd = "picard -Xmx${avail_mem}M BedToIntervalList --INPUT ${bait_intervals} --OUTPUT ${bait_interval_list} --SEQUENCE_DICTIONARY ${dict} --TMP_DIR ." - } - - def target_interval_list = target_intervals - def target_intervallist_cmd = "" - if (target_intervals =~ /.(bed|bed.gz)$/) { - target_interval_list = target_intervals.toString().replaceAll(/.(bed|bed.gz)$/, ".interval_list") - target_intervallist_cmd = "picard -Xmx${avail_mem}M BedToIntervalList --INPUT ${target_intervals} --OUTPUT ${target_interval_list} --SEQUENCE_DICTIONARY ${dict} --TMP_DIR ." - } - """ - export TMP=\$PWD - ${bait_intervallist_cmd} - ${target_intervallist_cmd} - - picard \\ - -Xmx${avail_mem}M \\ - CollectHsMetrics \\ - ${args} \\ - ${reference} \\ - --BAIT_INTERVALS ${bait_interval_list} \\ - --TARGET_INTERVALS ${target_interval_list} \\ - --INPUT ${bam} \\ - --OUTPUT ${prefix}.CollectHsMetrics.coverage_metrics \\ - --TMP_DIR . - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.CollectHsMetrics.coverage_metrics - """ -} diff --git a/modules/nf-core/picard/collecthsmetrics/meta.yml b/modules/nf-core/picard/collecthsmetrics/meta.yml deleted file mode 100644 index 89bc502c..00000000 --- a/modules/nf-core/picard/collecthsmetrics/meta.yml +++ /dev/null @@ -1,129 +0,0 @@ -name: picard_collecthsmetrics -description: Collects hybrid-selection (HS) metrics for a SAM or BAM file. -keywords: - - alignment - - metrics - - statistics - - insert - - hybrid-selection - - quality - - bam -tools: - - picard: - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ - tool_dev_url: https://github.com/broadinstitute/picard/ - licence: ["MIT"] - identifier: biotools:picard_tools -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: An aligned BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - ontologies: [] - - bai: - type: file - description: Optional aligned BAM/CRAM/SAM file index - pattern: "*.{bai,crai,sai}" - ontologies: [] - - bait_intervals: - type: file - description: An interval file that contains the locations of the baits used. - pattern: "*.{interval_list,bed,bed.gz}" - ontologies: [] - - target_intervals: - type: file - description: An interval file that contains the locations of the targets. - pattern: "*.{interval_list,bed,bed.gz}" - ontologies: [] - - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - ref: - type: file - description: | - A reference file to calculate dropout metrics measuring reduced representation of reads. - Optional input. - pattern: "*.{fa,fa.gz,fasta,fasta.gz,fna,fna.gz}" - ontologies: [] - - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - ref_fai: - type: file - description: Index of reference file. Only needed when reference is supplied. - pattern: "*.fai" - ontologies: [] - - - meta4: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - ref_dict: - type: file - description: Sequence dictionary of FASTA file. Only needed when bed interval - lists are supplied. - pattern: "*.dict" - ontologies: [] - - - meta5: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - ref_gzi: - type: file - description: Index of reference file. Only needed when gzipped reference is supplied. - pattern: "*.gzi" - ontologies: [] -output: - metrics: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*_metrics": - type: file - description: Alignment metrics files generated by picard - pattern: "*_{metrics}" - ontologies: [] - versions_picard: - - - ${task.process}: - type: string - description: The process the versions were collected from - - picard: - type: string - description: The tool name - - "picard CollectHsMetrics --version 2>&1 | sed -n 's/.*Version://p'": - 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 - - picard: - type: string - description: The tool name - - "picard CollectHsMetrics --version 2>&1 | sed -n 's/.*Version://p'": - type: string - description: The command used to generate the version of the tool -authors: - - "@projectoriented" - - "@matthdsm" -maintainers: - - "@projectoriented" - - "@matthdsm" diff --git a/modules/nf-core/picard/collecthsmetrics/picard-collecthsmetrics.diff b/modules/nf-core/picard/collecthsmetrics/picard-collecthsmetrics.diff deleted file mode 100644 index f9b0281a..00000000 --- a/modules/nf-core/picard/collecthsmetrics/picard-collecthsmetrics.diff +++ /dev/null @@ -1,62 +0,0 @@ -Changes in component 'nf-core/picard/collecthsmetrics' -'modules/nf-core/picard/collecthsmetrics/environment.yml' is unchanged -'modules/nf-core/picard/collecthsmetrics/meta.yml' is unchanged -Changes in 'picard/collecthsmetrics/main.nf': ---- modules/nf-core/picard/collecthsmetrics/main.nf -+++ modules/nf-core/picard/collecthsmetrics/main.nf -@@ -8,11 +8,7 @@ - : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" - - input: -- tuple val(meta), path(bam), path(bai), path(bait_intervals, stageAs: "baits/*"), path(target_intervals, stageAs: 'targets/*') -- tuple val(meta2), path(ref) -- tuple val(meta3), path(ref_fai) -- tuple val(meta4), path(ref_dict) -- tuple val(meta5), path(ref_gzi) -+ tuple val(meta), path(bam), path(bai), path(bait_intervals, stageAs: "bait/*"), path(target_intervals, stageAs: "target/*") ,path(fasta) ,path(fai) ,path(dict) - - output: - tuple val(meta), path("*_metrics"), emit: metrics -@@ -24,7 +20,7 @@ - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" -- def reference = ref ? "--REFERENCE_SEQUENCE ${ref}" : "" -+ def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" - - def avail_mem = 3072 - if (!task.memory) { -@@ -38,16 +34,17 @@ - def bait_intervallist_cmd = "" - if (bait_intervals =~ /.(bed|bed.gz)$/) { - bait_interval_list = bait_intervals.toString().replaceAll(/.(bed|bed.gz)$/, ".interval_list") -- bait_intervallist_cmd = "picard -Xmx${avail_mem}M BedToIntervalList --INPUT ${bait_intervals} --OUTPUT ${bait_interval_list} --SEQUENCE_DICTIONARY ${ref_dict} --TMP_DIR ." -+ bait_intervallist_cmd = "picard -Xmx${avail_mem}M BedToIntervalList --INPUT ${bait_intervals} --OUTPUT ${bait_interval_list} --SEQUENCE_DICTIONARY ${dict} --TMP_DIR ." - } - - def target_interval_list = target_intervals - def target_intervallist_cmd = "" - if (target_intervals =~ /.(bed|bed.gz)$/) { - target_interval_list = target_intervals.toString().replaceAll(/.(bed|bed.gz)$/, ".interval_list") -- target_intervallist_cmd = "picard -Xmx${avail_mem}M BedToIntervalList --INPUT ${target_intervals} --OUTPUT ${target_interval_list} --SEQUENCE_DICTIONARY ${ref_dict} --TMP_DIR ." -+ target_intervallist_cmd = "picard -Xmx${avail_mem}M BedToIntervalList --INPUT ${target_intervals} --OUTPUT ${target_interval_list} --SEQUENCE_DICTIONARY ${dict} --TMP_DIR ." - } - """ -+ export TMP=\$PWD - ${bait_intervallist_cmd} - ${target_intervallist_cmd} - -@@ -59,7 +56,8 @@ - --BAIT_INTERVALS ${bait_interval_list} \\ - --TARGET_INTERVALS ${target_interval_list} \\ - --INPUT ${bam} \\ -- --OUTPUT ${prefix}.CollectHsMetrics.coverage_metrics -+ --OUTPUT ${prefix}.CollectHsMetrics.coverage_metrics \\ -+ --TMP_DIR . - """ - - stub: - -'modules/nf-core/picard/collecthsmetrics/tests/main.nf.test.snap' is unchanged -'modules/nf-core/picard/collecthsmetrics/tests/main.nf.test' is unchanged -************************************************************ diff --git a/modules/nf-core/picard/collecthsmetrics/tests/main.nf.test b/modules/nf-core/picard/collecthsmetrics/tests/main.nf.test deleted file mode 100644 index d7366111..00000000 --- a/modules/nf-core/picard/collecthsmetrics/tests/main.nf.test +++ /dev/null @@ -1,221 +0,0 @@ -nextflow_process { - - name "Test Process PICARD_COLLECTHSMETRICS" - script "../main.nf" - process "PICARD_COLLECTHSMETRICS" - - tag "modules" - tag "modules_nfcore" - tag "picard" - tag "picard/collecthsmetrics" - - test("sarscov2 - bam") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) - ] - input[1] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] - input[2] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)] - input[3] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.dict', checkIfExists: true)] - input[4] = [[:],[]] - """ - } - } - - then { - def size = path(process.out.metrics[0][1]).size() - def lines = path(process.out.metrics[0][1]).readLines()[0..100] - lines.remove(3) // remove timestamp - assertAll( - { assert process.success }, - { assert snapshot( - file(process.out.metrics[0][1]).name, - size, - lines, - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("sarscov2 - bam - gzippedfa") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) - ] - input[1] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true)] - input[2] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz.fai', checkIfExists: true)] - input[3] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.dict', checkIfExists: true)] - input[4] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz.gzi', checkIfExists: true)] - """ - } - } - - then { - def size = path(process.out.metrics[0][1]).size() - def lines = path(process.out.metrics[0][1]).readLines()[0..100] - lines.remove(3) // remove timestamp - assertAll( - { assert process.success }, - { assert snapshot( - file(process.out.metrics[0][1]).name, - size, - lines, - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("sarscov2 - bam - stub") { - options "-stub" - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) - ] - input[1] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] - input[2] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)] - input[3] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.dict', checkIfExists: true)] - input[4] = [[:],[]] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - } - - test("sarscov2 - bam - nofasta") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) - ] - input[1] = [[:],[]] - input[2] = [[:],[]] - input[3] = [[:],[]] - input[4] = [[:],[]] - """ - } - } - - then { - def size = path(process.out.metrics[0][1]).size() - def lines = path(process.out.metrics[0][1]).readLines()[0..100] - lines.remove(3) // remove timestamp - assertAll( - { assert process.success }, - { assert snapshot( - file(process.out.metrics[0][1]).name, - size, - lines, - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("sarscov2 - bam - bed") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/baits.bed', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/test.bed', checkIfExists: true) - ] - - input[1] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] - input[2] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)] - input[3] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.dict', checkIfExists: true)] - input[4] = [[:],[]] - """ - } - } - - then { - def size = path(process.out.metrics[0][1]).size() - def lines = path(process.out.metrics[0][1]).readLines()[0..100] - lines.remove(3) // remove timestamp - assertAll( - { assert process.success }, - { assert snapshot( - file(process.out.metrics[0][1]).name, - size, - lines, - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("sarscov2 - bam - samebed") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/baits.bed', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/bed/baits.bed', checkIfExists: true) - ] - - input[1] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)] - input[2] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)] - input[3] = [[id:'genome'], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.dict', checkIfExists: true)] - input[4] = [[:],[]] - """ - } - } - - then { - def size = path(process.out.metrics[0][1]).size() - def lines = path(process.out.metrics[0][1]).readLines()[0..100] - lines.remove(3) // remove timestamp - assertAll( - { assert process.success }, - { assert snapshot( - file(process.out.metrics[0][1]).name, - size, - lines, - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } -} diff --git a/modules/nf-core/picard/collecthsmetrics/tests/main.nf.test.snap b/modules/nf-core/picard/collecthsmetrics/tests/main.nf.test.snap deleted file mode 100644 index 43385314..00000000 --- a/modules/nf-core/picard/collecthsmetrics/tests/main.nf.test.snap +++ /dev/null @@ -1,639 +0,0 @@ -{ - "sarscov2 - bam - nofasta": { - "content": [ - "test.CollectHsMetrics.coverage_metrics", - 3548, - [ - "## htsjdk.samtools.metrics.StringHeader", - "# CollectHsMetrics --BAIT_INTERVALS baits/baits.interval_list --TARGET_INTERVALS targets/targets.interval_list --INPUT test.paired_end.sorted.bam --OUTPUT test.CollectHsMetrics.coverage_metrics --METRIC_ACCUMULATION_LEVEL ALL_READS --NEAR_DISTANCE 250 --MINIMUM_MAPPING_QUALITY 20 --MINIMUM_BASE_QUALITY 20 --CLIP_OVERLAPPING_READS true --INCLUDE_INDELS false --COVERAGE_CAP 200 --SAMPLE_SIZE 10000 --ALLELE_FRACTION 0.001 --ALLELE_FRACTION 0.005 --ALLELE_FRACTION 0.01 --ALLELE_FRACTION 0.02 --ALLELE_FRACTION 0.05 --ALLELE_FRACTION 0.1 --ALLELE_FRACTION 0.2 --ALLELE_FRACTION 0.3 --ALLELE_FRACTION 0.5 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", - "## htsjdk.samtools.metrics.StringHeader", - "", - "## METRICS CLASS\tpicard.analysis.directed.HsMetrics", - "BAIT_SET\tBAIT_TERRITORY\tBAIT_DESIGN_EFFICIENCY\tON_BAIT_BASES\tNEAR_BAIT_BASES\tOFF_BAIT_BASES\tPCT_SELECTED_BASES\tPCT_OFF_BAIT\tON_BAIT_VS_SELECTED\tMEAN_BAIT_COVERAGE\tPCT_USABLE_BASES_ON_BAIT\tPCT_USABLE_BASES_ON_TARGET\tFOLD_ENRICHMENT\tHS_LIBRARY_SIZE\tHS_PENALTY_10X\tHS_PENALTY_20X\tHS_PENALTY_30X\tHS_PENALTY_40X\tHS_PENALTY_50X\tHS_PENALTY_100X\tTARGET_TERRITORY\tGENOME_SIZE\tTOTAL_READS\tPF_READS\tPF_BASES\tPF_UNIQUE_READS\tPF_UQ_READS_ALIGNED\tPF_BASES_ALIGNED\tPF_UQ_BASES_ALIGNED\tON_TARGET_BASES\tPCT_PF_READS\tPCT_PF_UQ_READS\tPCT_PF_UQ_READS_ALIGNED\tMEAN_TARGET_COVERAGE\tMEDIAN_TARGET_COVERAGE\tMAX_TARGET_COVERAGE\tMIN_TARGET_COVERAGE\tZERO_CVG_TARGETS_PCT\tPCT_EXC_DUPE\tPCT_EXC_ADAPTER\tPCT_EXC_MAPQ\tPCT_EXC_BASEQ\tPCT_EXC_OVERLAP\tPCT_EXC_OFF_TARGET\tFOLD_80_BASE_PENALTY\tPCT_TARGET_BASES_1X\tPCT_TARGET_BASES_2X\tPCT_TARGET_BASES_10X\tPCT_TARGET_BASES_20X\tPCT_TARGET_BASES_30X\tPCT_TARGET_BASES_40X\tPCT_TARGET_BASES_50X\tPCT_TARGET_BASES_100X\tPCT_TARGET_BASES_250X\tPCT_TARGET_BASES_500X\tPCT_TARGET_BASES_1000X\tPCT_TARGET_BASES_2500X\tPCT_TARGET_BASES_5000X\tPCT_TARGET_BASES_10000X\tPCT_TARGET_BASES_25000X\tPCT_TARGET_BASES_50000X\tPCT_TARGET_BASES_100000X\tAT_DROPOUT\tGC_DROPOUT\tHET_SNP_SENSITIVITY\tHET_SNP_Q\tSAMPLE\tLIBRARY\tREAD_GROUP", - "baits\t158\t0.594937\t725\t3985\t22691\t0.171892\t0.828108\t0.153928\t4.588608\t0.026225\t0.000181\t4.995204\t\t0\t0\t0\t0\t0\t0\t94\t29829\t200\t200\t27645\t200\t197\t27401\t27401\t5\t1\t1\t0.985\t0.053191\t0\t1\t0\t0.75\t0\t0\t0.005438\t0.054487\t0.259516\t0.680377\t?\t0.053191\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0.015734\t0\t\t\t", - "", - "## HISTOGRAM\tjava.lang.Integer", - "coverage_or_base_quality\thigh_quality_coverage_count\tunfiltered_baseq_count", - "0\t89\t0", - "1\t5\t0", - "2\t0\t0", - "3\t0\t0", - "4\t0\t0", - "5\t0\t0", - "6\t0\t0", - "7\t0\t0", - "8\t0\t0", - "9\t0\t0", - "10\t0\t0", - "11\t0\t0", - "12\t0\t0", - "13\t0\t0", - "14\t0\t5", - "15\t0\t0", - "16\t0\t0", - "17\t0\t0", - "18\t0\t0", - "19\t0\t0", - "20\t0\t0", - "21\t0\t1", - "22\t0\t0", - "23\t0\t0", - "24\t0\t0", - "25\t0\t0", - "26\t0\t0", - "27\t0\t0", - "28\t0\t0", - "29\t0\t0", - "30\t0\t0", - "31\t0\t0", - "32\t0\t1", - "33\t0\t0", - "34\t0\t0", - "35\t0\t0", - "36\t0\t3", - "37\t0\t0", - "38\t0\t0", - "39\t0\t0", - "40\t0\t0", - "41\t0\t0", - "42\t0\t0", - "43\t0\t0", - "44\t0\t0", - "45\t0\t0", - "46\t0\t0", - "47\t0\t0", - "48\t0\t0", - "49\t0\t0", - "50\t0\t0", - "51\t0\t0", - "52\t0\t0", - "53\t0\t0", - "54\t0\t0", - "55\t0\t0", - "56\t0\t0", - "57\t0\t0", - "58\t0\t0", - "59\t0\t0", - "60\t0\t0", - "61\t0\t0", - "62\t0\t0", - "63\t0\t0", - "64\t0\t0", - "65\t0\t0", - "66\t0\t0", - "67\t0\t0", - "68\t0\t0", - "69\t0\t0", - "70\t0\t0", - "71\t0\t0", - "72\t0\t0", - "73\t0\t0", - "74\t0\t0", - "75\t0\t0", - "76\t0\t0", - "77\t0\t0", - "78\t0\t0", - "79\t0\t0", - "80\t0\t0", - "81\t0\t0", - "82\t0\t0", - "83\t0\t0", - "84\t0\t0", - "85\t0\t0", - "86\t0\t0", - "87\t0\t0", - "88\t0\t0", - "89\t0\t0" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTHSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-01-05T17:03:29.566021877", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - }, - "sarscov2 - bam - stub": { - "content": [ - { - "metrics": [ - [ - { - "id": "test", - "single_end": false - }, - "test.CollectHsMetrics.coverage_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_picard": [ - [ - "PICARD_COLLECTHSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-19T17:36:03.822502867", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "sarscov2 - bam - gzippedfa": { - "content": [ - "test.CollectHsMetrics.coverage_metrics", - 3601, - [ - "## htsjdk.samtools.metrics.StringHeader", - "# CollectHsMetrics --BAIT_INTERVALS baits/baits.interval_list --TARGET_INTERVALS targets/targets.interval_list --INPUT test.paired_end.sorted.bam --OUTPUT test.CollectHsMetrics.coverage_metrics --REFERENCE_SEQUENCE genome.fasta.gz --METRIC_ACCUMULATION_LEVEL ALL_READS --NEAR_DISTANCE 250 --MINIMUM_MAPPING_QUALITY 20 --MINIMUM_BASE_QUALITY 20 --CLIP_OVERLAPPING_READS true --INCLUDE_INDELS false --COVERAGE_CAP 200 --SAMPLE_SIZE 10000 --ALLELE_FRACTION 0.001 --ALLELE_FRACTION 0.005 --ALLELE_FRACTION 0.01 --ALLELE_FRACTION 0.02 --ALLELE_FRACTION 0.05 --ALLELE_FRACTION 0.1 --ALLELE_FRACTION 0.2 --ALLELE_FRACTION 0.3 --ALLELE_FRACTION 0.5 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", - "## htsjdk.samtools.metrics.StringHeader", - "", - "## METRICS CLASS\tpicard.analysis.directed.HsMetrics", - "BAIT_SET\tBAIT_TERRITORY\tBAIT_DESIGN_EFFICIENCY\tON_BAIT_BASES\tNEAR_BAIT_BASES\tOFF_BAIT_BASES\tPCT_SELECTED_BASES\tPCT_OFF_BAIT\tON_BAIT_VS_SELECTED\tMEAN_BAIT_COVERAGE\tPCT_USABLE_BASES_ON_BAIT\tPCT_USABLE_BASES_ON_TARGET\tFOLD_ENRICHMENT\tHS_LIBRARY_SIZE\tHS_PENALTY_10X\tHS_PENALTY_20X\tHS_PENALTY_30X\tHS_PENALTY_40X\tHS_PENALTY_50X\tHS_PENALTY_100X\tTARGET_TERRITORY\tGENOME_SIZE\tTOTAL_READS\tPF_READS\tPF_BASES\tPF_UNIQUE_READS\tPF_UQ_READS_ALIGNED\tPF_BASES_ALIGNED\tPF_UQ_BASES_ALIGNED\tON_TARGET_BASES\tPCT_PF_READS\tPCT_PF_UQ_READS\tPCT_PF_UQ_READS_ALIGNED\tMEAN_TARGET_COVERAGE\tMEDIAN_TARGET_COVERAGE\tMAX_TARGET_COVERAGE\tMIN_TARGET_COVERAGE\tZERO_CVG_TARGETS_PCT\tPCT_EXC_DUPE\tPCT_EXC_ADAPTER\tPCT_EXC_MAPQ\tPCT_EXC_BASEQ\tPCT_EXC_OVERLAP\tPCT_EXC_OFF_TARGET\tFOLD_80_BASE_PENALTY\tPCT_TARGET_BASES_1X\tPCT_TARGET_BASES_2X\tPCT_TARGET_BASES_10X\tPCT_TARGET_BASES_20X\tPCT_TARGET_BASES_30X\tPCT_TARGET_BASES_40X\tPCT_TARGET_BASES_50X\tPCT_TARGET_BASES_100X\tPCT_TARGET_BASES_250X\tPCT_TARGET_BASES_500X\tPCT_TARGET_BASES_1000X\tPCT_TARGET_BASES_2500X\tPCT_TARGET_BASES_5000X\tPCT_TARGET_BASES_10000X\tPCT_TARGET_BASES_25000X\tPCT_TARGET_BASES_50000X\tPCT_TARGET_BASES_100000X\tAT_DROPOUT\tGC_DROPOUT\tHET_SNP_SENSITIVITY\tHET_SNP_Q\tSAMPLE\tLIBRARY\tREAD_GROUP", - "baits\t158\t0.594937\t725\t3985\t22691\t0.171892\t0.828108\t0.153928\t4.588608\t0.026225\t0.000181\t4.995204\t\t0\t0\t0\t0\t0\t0\t94\t29829\t200\t200\t27645\t200\t197\t27401\t27401\t5\t1\t1\t0.985\t0.053191\t0\t1\t0\t0.75\t0\t0\t0.005438\t0.054487\t0.259516\t0.680377\t?\t0.053191\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t76.595745\t23.404255\t0.015734\t0\t\t\t", - "", - "## HISTOGRAM\tjava.lang.Integer", - "coverage_or_base_quality\thigh_quality_coverage_count\tunfiltered_baseq_count", - "0\t89\t0", - "1\t5\t0", - "2\t0\t0", - "3\t0\t0", - "4\t0\t0", - "5\t0\t0", - "6\t0\t0", - "7\t0\t0", - "8\t0\t0", - "9\t0\t0", - "10\t0\t0", - "11\t0\t0", - "12\t0\t0", - "13\t0\t0", - "14\t0\t5", - "15\t0\t0", - "16\t0\t0", - "17\t0\t0", - "18\t0\t0", - "19\t0\t0", - "20\t0\t0", - "21\t0\t1", - "22\t0\t0", - "23\t0\t0", - "24\t0\t0", - "25\t0\t0", - "26\t0\t0", - "27\t0\t0", - "28\t0\t0", - "29\t0\t0", - "30\t0\t0", - "31\t0\t0", - "32\t0\t1", - "33\t0\t0", - "34\t0\t0", - "35\t0\t0", - "36\t0\t3", - "37\t0\t0", - "38\t0\t0", - "39\t0\t0", - "40\t0\t0", - "41\t0\t0", - "42\t0\t0", - "43\t0\t0", - "44\t0\t0", - "45\t0\t0", - "46\t0\t0", - "47\t0\t0", - "48\t0\t0", - "49\t0\t0", - "50\t0\t0", - "51\t0\t0", - "52\t0\t0", - "53\t0\t0", - "54\t0\t0", - "55\t0\t0", - "56\t0\t0", - "57\t0\t0", - "58\t0\t0", - "59\t0\t0", - "60\t0\t0", - "61\t0\t0", - "62\t0\t0", - "63\t0\t0", - "64\t0\t0", - "65\t0\t0", - "66\t0\t0", - "67\t0\t0", - "68\t0\t0", - "69\t0\t0", - "70\t0\t0", - "71\t0\t0", - "72\t0\t0", - "73\t0\t0", - "74\t0\t0", - "75\t0\t0", - "76\t0\t0", - "77\t0\t0", - "78\t0\t0", - "79\t0\t0", - "80\t0\t0", - "81\t0\t0", - "82\t0\t0", - "83\t0\t0", - "84\t0\t0", - "85\t0\t0", - "86\t0\t0", - "87\t0\t0", - "88\t0\t0", - "89\t0\t0" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTHSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-01-05T17:03:04.382110367", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - }, - "sarscov2 - bam - samebed": { - "content": [ - "test.CollectHsMetrics.coverage_metrics", - 3586, - [ - "## htsjdk.samtools.metrics.StringHeader", - "# CollectHsMetrics --BAIT_INTERVALS baits/baits.interval_list --TARGET_INTERVALS targets/baits.interval_list --INPUT test.paired_end.sorted.bam --OUTPUT test.CollectHsMetrics.coverage_metrics --REFERENCE_SEQUENCE genome.fasta --METRIC_ACCUMULATION_LEVEL ALL_READS --NEAR_DISTANCE 250 --MINIMUM_MAPPING_QUALITY 20 --MINIMUM_BASE_QUALITY 20 --CLIP_OVERLAPPING_READS true --INCLUDE_INDELS false --COVERAGE_CAP 200 --SAMPLE_SIZE 10000 --ALLELE_FRACTION 0.001 --ALLELE_FRACTION 0.005 --ALLELE_FRACTION 0.01 --ALLELE_FRACTION 0.02 --ALLELE_FRACTION 0.05 --ALLELE_FRACTION 0.1 --ALLELE_FRACTION 0.2 --ALLELE_FRACTION 0.3 --ALLELE_FRACTION 0.5 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", - "## htsjdk.samtools.metrics.StringHeader", - "", - "## METRICS CLASS\tpicard.analysis.directed.HsMetrics", - "BAIT_SET\tBAIT_TERRITORY\tBAIT_DESIGN_EFFICIENCY\tON_BAIT_BASES\tNEAR_BAIT_BASES\tOFF_BAIT_BASES\tPCT_SELECTED_BASES\tPCT_OFF_BAIT\tON_BAIT_VS_SELECTED\tMEAN_BAIT_COVERAGE\tPCT_USABLE_BASES_ON_BAIT\tPCT_USABLE_BASES_ON_TARGET\tFOLD_ENRICHMENT\tHS_LIBRARY_SIZE\tHS_PENALTY_10X\tHS_PENALTY_20X\tHS_PENALTY_30X\tHS_PENALTY_40X\tHS_PENALTY_50X\tHS_PENALTY_100X\tTARGET_TERRITORY\tGENOME_SIZE\tTOTAL_READS\tPF_READS\tPF_BASES\tPF_UNIQUE_READS\tPF_UQ_READS_ALIGNED\tPF_BASES_ALIGNED\tPF_UQ_BASES_ALIGNED\tON_TARGET_BASES\tPCT_PF_READS\tPCT_PF_UQ_READS\tPCT_PF_UQ_READS_ALIGNED\tMEAN_TARGET_COVERAGE\tMEDIAN_TARGET_COVERAGE\tMAX_TARGET_COVERAGE\tMIN_TARGET_COVERAGE\tZERO_CVG_TARGETS_PCT\tPCT_EXC_DUPE\tPCT_EXC_ADAPTER\tPCT_EXC_MAPQ\tPCT_EXC_BASEQ\tPCT_EXC_OVERLAP\tPCT_EXC_OFF_TARGET\tFOLD_80_BASE_PENALTY\tPCT_TARGET_BASES_1X\tPCT_TARGET_BASES_2X\tPCT_TARGET_BASES_10X\tPCT_TARGET_BASES_20X\tPCT_TARGET_BASES_30X\tPCT_TARGET_BASES_40X\tPCT_TARGET_BASES_50X\tPCT_TARGET_BASES_100X\tPCT_TARGET_BASES_250X\tPCT_TARGET_BASES_500X\tPCT_TARGET_BASES_1000X\tPCT_TARGET_BASES_2500X\tPCT_TARGET_BASES_5000X\tPCT_TARGET_BASES_10000X\tPCT_TARGET_BASES_25000X\tPCT_TARGET_BASES_50000X\tPCT_TARGET_BASES_100000X\tAT_DROPOUT\tGC_DROPOUT\tHET_SNP_SENSITIVITY\tHET_SNP_Q\tSAMPLE\tLIBRARY\tREAD_GROUP", - "baits\t158\t1\t725\t3985\t22691\t0.171892\t0.828108\t0.153928\t4.588608\t0.026225\t0.013782\t4.995204\t\t0\t0\t0\t0\t0\t0\t158\t29829\t200\t200\t27645\t200\t197\t27401\t27401\t381\t1\t1\t0.985\t2.411392\t2\t3\t2\t0\t0\t0\t0.005438\t0.054487\t0.259516\t0.666655\t1.205696\t1\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t7.018506\t0\t0.394337\t2\t\t\t", - "", - "## HISTOGRAM\tjava.lang.Integer", - "coverage_or_base_quality\thigh_quality_coverage_count\tunfiltered_baseq_count", - "0\t0\t0", - "1\t0\t0", - "2\t93\t0", - "3\t65\t0", - "4\t0\t0", - "5\t0\t0", - "6\t0\t0", - "7\t0\t0", - "8\t0\t0", - "9\t0\t0", - "10\t0\t0", - "11\t0\t0", - "12\t0\t0", - "13\t0\t0", - "14\t0\t28", - "15\t0\t0", - "16\t0\t0", - "17\t0\t0", - "18\t0\t0", - "19\t0\t0", - "20\t0\t0", - "21\t0\t9", - "22\t0\t0", - "23\t0\t0", - "24\t0\t0", - "25\t0\t0", - "26\t0\t0", - "27\t0\t20", - "28\t0\t0", - "29\t0\t0", - "30\t0\t0", - "31\t0\t0", - "32\t0\t90", - "33\t0\t0", - "34\t0\t0", - "35\t0\t0", - "36\t0\t262", - "37\t0\t0", - "38\t0\t0", - "39\t0\t0", - "40\t0\t0", - "41\t0\t0", - "42\t0\t0", - "43\t0\t0", - "44\t0\t0", - "45\t0\t0", - "46\t0\t0", - "47\t0\t0", - "48\t0\t0", - "49\t0\t0", - "50\t0\t0", - "51\t0\t0", - "52\t0\t0", - "53\t0\t0", - "54\t0\t0", - "55\t0\t0", - "56\t0\t0", - "57\t0\t0", - "58\t0\t0", - "59\t0\t0", - "60\t0\t0", - "61\t0\t0", - "62\t0\t0", - "63\t0\t0", - "64\t0\t0", - "65\t0\t0", - "66\t0\t0", - "67\t0\t0", - "68\t0\t0", - "69\t0\t0", - "70\t0\t0", - "71\t0\t0", - "72\t0\t0", - "73\t0\t0", - "74\t0\t0", - "75\t0\t0", - "76\t0\t0", - "77\t0\t0", - "78\t0\t0", - "79\t0\t0", - "80\t0\t0", - "81\t0\t0", - "82\t0\t0", - "83\t0\t0", - "84\t0\t0", - "85\t0\t0", - "86\t0\t0", - "87\t0\t0", - "88\t0\t0", - "89\t0\t0" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTHSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-01-05T17:13:22.872920293", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - }, - "sarscov2 - bam": { - "content": [ - "test.CollectHsMetrics.coverage_metrics", - 3598, - [ - "## htsjdk.samtools.metrics.StringHeader", - "# CollectHsMetrics --BAIT_INTERVALS baits/baits.interval_list --TARGET_INTERVALS targets/targets.interval_list --INPUT test.paired_end.sorted.bam --OUTPUT test.CollectHsMetrics.coverage_metrics --REFERENCE_SEQUENCE genome.fasta --METRIC_ACCUMULATION_LEVEL ALL_READS --NEAR_DISTANCE 250 --MINIMUM_MAPPING_QUALITY 20 --MINIMUM_BASE_QUALITY 20 --CLIP_OVERLAPPING_READS true --INCLUDE_INDELS false --COVERAGE_CAP 200 --SAMPLE_SIZE 10000 --ALLELE_FRACTION 0.001 --ALLELE_FRACTION 0.005 --ALLELE_FRACTION 0.01 --ALLELE_FRACTION 0.02 --ALLELE_FRACTION 0.05 --ALLELE_FRACTION 0.1 --ALLELE_FRACTION 0.2 --ALLELE_FRACTION 0.3 --ALLELE_FRACTION 0.5 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", - "## htsjdk.samtools.metrics.StringHeader", - "", - "## METRICS CLASS\tpicard.analysis.directed.HsMetrics", - "BAIT_SET\tBAIT_TERRITORY\tBAIT_DESIGN_EFFICIENCY\tON_BAIT_BASES\tNEAR_BAIT_BASES\tOFF_BAIT_BASES\tPCT_SELECTED_BASES\tPCT_OFF_BAIT\tON_BAIT_VS_SELECTED\tMEAN_BAIT_COVERAGE\tPCT_USABLE_BASES_ON_BAIT\tPCT_USABLE_BASES_ON_TARGET\tFOLD_ENRICHMENT\tHS_LIBRARY_SIZE\tHS_PENALTY_10X\tHS_PENALTY_20X\tHS_PENALTY_30X\tHS_PENALTY_40X\tHS_PENALTY_50X\tHS_PENALTY_100X\tTARGET_TERRITORY\tGENOME_SIZE\tTOTAL_READS\tPF_READS\tPF_BASES\tPF_UNIQUE_READS\tPF_UQ_READS_ALIGNED\tPF_BASES_ALIGNED\tPF_UQ_BASES_ALIGNED\tON_TARGET_BASES\tPCT_PF_READS\tPCT_PF_UQ_READS\tPCT_PF_UQ_READS_ALIGNED\tMEAN_TARGET_COVERAGE\tMEDIAN_TARGET_COVERAGE\tMAX_TARGET_COVERAGE\tMIN_TARGET_COVERAGE\tZERO_CVG_TARGETS_PCT\tPCT_EXC_DUPE\tPCT_EXC_ADAPTER\tPCT_EXC_MAPQ\tPCT_EXC_BASEQ\tPCT_EXC_OVERLAP\tPCT_EXC_OFF_TARGET\tFOLD_80_BASE_PENALTY\tPCT_TARGET_BASES_1X\tPCT_TARGET_BASES_2X\tPCT_TARGET_BASES_10X\tPCT_TARGET_BASES_20X\tPCT_TARGET_BASES_30X\tPCT_TARGET_BASES_40X\tPCT_TARGET_BASES_50X\tPCT_TARGET_BASES_100X\tPCT_TARGET_BASES_250X\tPCT_TARGET_BASES_500X\tPCT_TARGET_BASES_1000X\tPCT_TARGET_BASES_2500X\tPCT_TARGET_BASES_5000X\tPCT_TARGET_BASES_10000X\tPCT_TARGET_BASES_25000X\tPCT_TARGET_BASES_50000X\tPCT_TARGET_BASES_100000X\tAT_DROPOUT\tGC_DROPOUT\tHET_SNP_SENSITIVITY\tHET_SNP_Q\tSAMPLE\tLIBRARY\tREAD_GROUP", - "baits\t158\t0.594937\t725\t3985\t22691\t0.171892\t0.828108\t0.153928\t4.588608\t0.026225\t0.000181\t4.995204\t\t0\t0\t0\t0\t0\t0\t94\t29829\t200\t200\t27645\t200\t197\t27401\t27401\t5\t1\t1\t0.985\t0.053191\t0\t1\t0\t0.75\t0\t0\t0.005438\t0.054487\t0.259516\t0.680377\t?\t0.053191\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t76.595745\t23.404255\t0.015734\t0\t\t\t", - "", - "## HISTOGRAM\tjava.lang.Integer", - "coverage_or_base_quality\thigh_quality_coverage_count\tunfiltered_baseq_count", - "0\t89\t0", - "1\t5\t0", - "2\t0\t0", - "3\t0\t0", - "4\t0\t0", - "5\t0\t0", - "6\t0\t0", - "7\t0\t0", - "8\t0\t0", - "9\t0\t0", - "10\t0\t0", - "11\t0\t0", - "12\t0\t0", - "13\t0\t0", - "14\t0\t5", - "15\t0\t0", - "16\t0\t0", - "17\t0\t0", - "18\t0\t0", - "19\t0\t0", - "20\t0\t0", - "21\t0\t1", - "22\t0\t0", - "23\t0\t0", - "24\t0\t0", - "25\t0\t0", - "26\t0\t0", - "27\t0\t0", - "28\t0\t0", - "29\t0\t0", - "30\t0\t0", - "31\t0\t0", - "32\t0\t1", - "33\t0\t0", - "34\t0\t0", - "35\t0\t0", - "36\t0\t3", - "37\t0\t0", - "38\t0\t0", - "39\t0\t0", - "40\t0\t0", - "41\t0\t0", - "42\t0\t0", - "43\t0\t0", - "44\t0\t0", - "45\t0\t0", - "46\t0\t0", - "47\t0\t0", - "48\t0\t0", - "49\t0\t0", - "50\t0\t0", - "51\t0\t0", - "52\t0\t0", - "53\t0\t0", - "54\t0\t0", - "55\t0\t0", - "56\t0\t0", - "57\t0\t0", - "58\t0\t0", - "59\t0\t0", - "60\t0\t0", - "61\t0\t0", - "62\t0\t0", - "63\t0\t0", - "64\t0\t0", - "65\t0\t0", - "66\t0\t0", - "67\t0\t0", - "68\t0\t0", - "69\t0\t0", - "70\t0\t0", - "71\t0\t0", - "72\t0\t0", - "73\t0\t0", - "74\t0\t0", - "75\t0\t0", - "76\t0\t0", - "77\t0\t0", - "78\t0\t0", - "79\t0\t0", - "80\t0\t0", - "81\t0\t0", - "82\t0\t0", - "83\t0\t0", - "84\t0\t0", - "85\t0\t0", - "86\t0\t0", - "87\t0\t0", - "88\t0\t0", - "89\t0\t0" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTHSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-01-05T17:02:47.615784738", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - }, - "sarscov2 - bam - bed": { - "content": [ - "test.CollectHsMetrics.coverage_metrics", - 3595, - [ - "## htsjdk.samtools.metrics.StringHeader", - "# CollectHsMetrics --BAIT_INTERVALS baits/baits.interval_list --TARGET_INTERVALS targets/test.interval_list --INPUT test.paired_end.sorted.bam --OUTPUT test.CollectHsMetrics.coverage_metrics --REFERENCE_SEQUENCE genome.fasta --METRIC_ACCUMULATION_LEVEL ALL_READS --NEAR_DISTANCE 250 --MINIMUM_MAPPING_QUALITY 20 --MINIMUM_BASE_QUALITY 20 --CLIP_OVERLAPPING_READS true --INCLUDE_INDELS false --COVERAGE_CAP 200 --SAMPLE_SIZE 10000 --ALLELE_FRACTION 0.001 --ALLELE_FRACTION 0.005 --ALLELE_FRACTION 0.01 --ALLELE_FRACTION 0.02 --ALLELE_FRACTION 0.05 --ALLELE_FRACTION 0.1 --ALLELE_FRACTION 0.2 --ALLELE_FRACTION 0.3 --ALLELE_FRACTION 0.5 --VERBOSITY INFO --QUIET false --VALIDATION_STRINGENCY STRICT --COMPRESSION_LEVEL 5 --MAX_RECORDS_IN_RAM 500000 --CREATE_INDEX false --CREATE_MD5_FILE false --help false --version false --showHidden false --USE_JDK_DEFLATER false --USE_JDK_INFLATER false", - "## htsjdk.samtools.metrics.StringHeader", - "", - "## METRICS CLASS\tpicard.analysis.directed.HsMetrics", - "BAIT_SET\tBAIT_TERRITORY\tBAIT_DESIGN_EFFICIENCY\tON_BAIT_BASES\tNEAR_BAIT_BASES\tOFF_BAIT_BASES\tPCT_SELECTED_BASES\tPCT_OFF_BAIT\tON_BAIT_VS_SELECTED\tMEAN_BAIT_COVERAGE\tPCT_USABLE_BASES_ON_BAIT\tPCT_USABLE_BASES_ON_TARGET\tFOLD_ENRICHMENT\tHS_LIBRARY_SIZE\tHS_PENALTY_10X\tHS_PENALTY_20X\tHS_PENALTY_30X\tHS_PENALTY_40X\tHS_PENALTY_50X\tHS_PENALTY_100X\tTARGET_TERRITORY\tGENOME_SIZE\tTOTAL_READS\tPF_READS\tPF_BASES\tPF_UNIQUE_READS\tPF_UQ_READS_ALIGNED\tPF_BASES_ALIGNED\tPF_UQ_BASES_ALIGNED\tON_TARGET_BASES\tPCT_PF_READS\tPCT_PF_UQ_READS\tPCT_PF_UQ_READS_ALIGNED\tMEAN_TARGET_COVERAGE\tMEDIAN_TARGET_COVERAGE\tMAX_TARGET_COVERAGE\tMIN_TARGET_COVERAGE\tZERO_CVG_TARGETS_PCT\tPCT_EXC_DUPE\tPCT_EXC_ADAPTER\tPCT_EXC_MAPQ\tPCT_EXC_BASEQ\tPCT_EXC_OVERLAP\tPCT_EXC_OFF_TARGET\tFOLD_80_BASE_PENALTY\tPCT_TARGET_BASES_1X\tPCT_TARGET_BASES_2X\tPCT_TARGET_BASES_10X\tPCT_TARGET_BASES_20X\tPCT_TARGET_BASES_30X\tPCT_TARGET_BASES_40X\tPCT_TARGET_BASES_50X\tPCT_TARGET_BASES_100X\tPCT_TARGET_BASES_250X\tPCT_TARGET_BASES_500X\tPCT_TARGET_BASES_1000X\tPCT_TARGET_BASES_2500X\tPCT_TARGET_BASES_5000X\tPCT_TARGET_BASES_10000X\tPCT_TARGET_BASES_25000X\tPCT_TARGET_BASES_50000X\tPCT_TARGET_BASES_100000X\tAT_DROPOUT\tGC_DROPOUT\tHET_SNP_SENSITIVITY\tHET_SNP_Q\tSAMPLE\tLIBRARY\tREAD_GROUP", - "baits\t158\t0.594937\t725\t3985\t22691\t0.171892\t0.828108\t0.153928\t4.588608\t0.026225\t0.000181\t4.995204\t\t0\t0\t0\t0\t0\t0\t94\t29829\t200\t200\t27645\t200\t197\t27401\t27401\t5\t1\t1\t0.985\t0.053191\t0\t1\t0\t0.75\t0\t0\t0.005438\t0.054487\t0.259516\t0.680377\t?\t0.053191\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t76.595745\t23.404255\t0.015734\t0\t\t\t", - "", - "## HISTOGRAM\tjava.lang.Integer", - "coverage_or_base_quality\thigh_quality_coverage_count\tunfiltered_baseq_count", - "0\t89\t0", - "1\t5\t0", - "2\t0\t0", - "3\t0\t0", - "4\t0\t0", - "5\t0\t0", - "6\t0\t0", - "7\t0\t0", - "8\t0\t0", - "9\t0\t0", - "10\t0\t0", - "11\t0\t0", - "12\t0\t0", - "13\t0\t0", - "14\t0\t5", - "15\t0\t0", - "16\t0\t0", - "17\t0\t0", - "18\t0\t0", - "19\t0\t0", - "20\t0\t0", - "21\t0\t1", - "22\t0\t0", - "23\t0\t0", - "24\t0\t0", - "25\t0\t0", - "26\t0\t0", - "27\t0\t0", - "28\t0\t0", - "29\t0\t0", - "30\t0\t0", - "31\t0\t0", - "32\t0\t1", - "33\t0\t0", - "34\t0\t0", - "35\t0\t0", - "36\t0\t3", - "37\t0\t0", - "38\t0\t0", - "39\t0\t0", - "40\t0\t0", - "41\t0\t0", - "42\t0\t0", - "43\t0\t0", - "44\t0\t0", - "45\t0\t0", - "46\t0\t0", - "47\t0\t0", - "48\t0\t0", - "49\t0\t0", - "50\t0\t0", - "51\t0\t0", - "52\t0\t0", - "53\t0\t0", - "54\t0\t0", - "55\t0\t0", - "56\t0\t0", - "57\t0\t0", - "58\t0\t0", - "59\t0\t0", - "60\t0\t0", - "61\t0\t0", - "62\t0\t0", - "63\t0\t0", - "64\t0\t0", - "65\t0\t0", - "66\t0\t0", - "67\t0\t0", - "68\t0\t0", - "69\t0\t0", - "70\t0\t0", - "71\t0\t0", - "72\t0\t0", - "73\t0\t0", - "74\t0\t0", - "75\t0\t0", - "76\t0\t0", - "77\t0\t0", - "78\t0\t0", - "79\t0\t0", - "80\t0\t0", - "81\t0\t0", - "82\t0\t0", - "83\t0\t0", - "84\t0\t0", - "85\t0\t0", - "86\t0\t0", - "87\t0\t0", - "88\t0\t0", - "89\t0\t0" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTHSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-01-05T17:13:02.812282052", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - } -} \ No newline at end of file diff --git a/modules/nf-core/picard/collectmultiplemetrics/environment.yml b/modules/nf-core/picard/collectmultiplemetrics/environment.yml deleted file mode 100644 index b4ac4fe0..00000000 --- a/modules/nf-core/picard/collectmultiplemetrics/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: - # renovate: datasource=conda depName=bioconda/picard - - bioconda::picard=3.4.0 diff --git a/modules/nf-core/picard/collectmultiplemetrics/main.nf b/modules/nf-core/picard/collectmultiplemetrics/main.nf deleted file mode 100644 index e470007d..00000000 --- a/modules/nf-core/picard/collectmultiplemetrics/main.nf +++ /dev/null @@ -1,60 +0,0 @@ -process PICARD_COLLECTMULTIPLEMETRICS { - tag "${meta.id}" - label 'process_single' - - 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/08/0861295baa7c01fc593a9da94e82b44a729dcaf8da92be8e565da109aa549b25/data' - : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" - - input: - tuple val(meta) , path(bam), path(bai), path(intervals), path(fasta) ,path(fai), path(dict) - - output: - tuple val(meta), path("*_metrics"), emit: metrics - tuple val(meta), path("*.pdf"), emit: pdf, optional: true - tuple val("${task.process}"), val('picard'), eval("picard CollectMultipleMetrics --version 2>&1 | sed -n 's/.*Version://p'"), topic: versions, emit: versions_picard - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def intervals_cmd = intervals ? "--INTERVALS ${intervals.join(',')}" : "" - def reference_cmd = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" - def avail_mem = 3072 - if (!task.memory) { - log.info('[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') - } - else { - avail_mem = (task.memory.mega * 0.8).intValue() - } - """ - export TMP=\$PWD - picard \\ - -Xmx${avail_mem}M \\ - CollectMultipleMetrics \\ - ${args} \\ - --INPUT ${bam} \\ - --OUTPUT ${prefix}.CollectMultipleMetrics \\ - --TMP_DIR . \\ - ${reference_cmd} \\ - ${intervals_cmd} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.CollectMultipleMetrics.alignment_summary_metrics - touch ${prefix}.CollectMultipleMetrics.insert_size_metrics - touch ${prefix}.CollectMultipleMetrics.quality_distribution.pdf - touch ${prefix}.CollectMultipleMetrics.base_distribution_by_cycle_metrics - touch ${prefix}.CollectMultipleMetrics.quality_by_cycle_metrics - touch ${prefix}.CollectMultipleMetrics.read_length_histogram.pdf - touch ${prefix}.CollectMultipleMetrics.base_distribution_by_cycle.pdf - touch ${prefix}.CollectMultipleMetrics.quality_by_cycle.pdf - touch ${prefix}.CollectMultipleMetrics.insert_size_histogram.pdf - touch ${prefix}.CollectMultipleMetrics.quality_distribution_metrics - """ -} diff --git a/modules/nf-core/picard/collectmultiplemetrics/meta.yml b/modules/nf-core/picard/collectmultiplemetrics/meta.yml deleted file mode 100644 index 213d600b..00000000 --- a/modules/nf-core/picard/collectmultiplemetrics/meta.yml +++ /dev/null @@ -1,103 +0,0 @@ -name: picard_collectmultiplemetrics -description: Collect multiple metrics from a BAM file -keywords: - - alignment - - metrics - - statistics - - insert - - quality - - bam -tools: - - picard: - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ - licence: ["MIT"] - identifier: biotools:picard_tools -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: SAM/BAM/CRAM file - pattern: "*.{sam,bam,cram}" - ontologies: [] - - bai: - type: file - description: Optional SAM/BAM/CRAM file index - pattern: "*.{sai,bai,crai}" - ontologies: [] - - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome'] - - fasta: - type: file - description: Genome fasta file - ontologies: [] - - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome'] - - fai: - type: file - description: Index of FASTA file. Only needed when fasta is supplied. - pattern: "*.fai" - ontologies: [] -output: - metrics: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*_metrics": - type: file - description: Alignment metrics files generated by picard - pattern: "*_{metrics}" - ontologies: [] - pdf: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.pdf": - type: file - description: PDF plots of metrics - pattern: "*.{pdf}" - ontologies: [] - versions_picard: - - - ${task.process}: - type: string - description: The process the versions were collected from - - picard: - type: string - description: The tool name - - "picard CollectMultipleMetrics --version 2>&1 | sed -n 's/.*Version://p'": - 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 - - picard: - type: string - description: The tool name - - "picard CollectMultipleMetrics --version 2>&1 | sed -n 's/.*Version://p'": - type: string - description: The command used to generate the version of the tool - -authors: - - "@drpatelh" -maintainers: - - "@drpatelh" diff --git a/modules/nf-core/picard/collectmultiplemetrics/picard-collectmultiplemetrics.diff b/modules/nf-core/picard/collectmultiplemetrics/picard-collectmultiplemetrics.diff deleted file mode 100644 index 780c0862..00000000 --- a/modules/nf-core/picard/collectmultiplemetrics/picard-collectmultiplemetrics.diff +++ /dev/null @@ -1,49 +0,0 @@ -Changes in component 'nf-core/picard/collectmultiplemetrics' -'modules/nf-core/picard/collectmultiplemetrics/environment.yml' is unchanged -'modules/nf-core/picard/collectmultiplemetrics/meta.yml' is unchanged -Changes in 'picard/collectmultiplemetrics/main.nf': ---- modules/nf-core/picard/collectmultiplemetrics/main.nf -+++ modules/nf-core/picard/collectmultiplemetrics/main.nf -@@ -8,9 +8,7 @@ - : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" - - input: -- tuple val(meta), path(bam), path(bai) -- tuple val(meta2), path(fasta) -- tuple val(meta3), path(fai) -+ tuple val(meta) , path(bam), path(bai), path(intervals), path(fasta) ,path(fai), path(dict) - - output: - tuple val(meta), path("*_metrics"), emit: metrics -@@ -23,7 +21,8 @@ - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" -- def reference = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" -+ def intervals_cmd = intervals ? "--INTERVALS ${intervals.join(',')}" : "" -+ def reference_cmd = fasta ? "--REFERENCE_SEQUENCE ${fasta}" : "" - def avail_mem = 3072 - if (!task.memory) { - log.info('[Picard CollectMultipleMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') -@@ -32,13 +31,16 @@ - avail_mem = (task.memory.mega * 0.8).intValue() - } - """ -+ export TMP=\$PWD - picard \\ - -Xmx${avail_mem}M \\ - CollectMultipleMetrics \\ - ${args} \\ - --INPUT ${bam} \\ - --OUTPUT ${prefix}.CollectMultipleMetrics \\ -- ${reference} -+ --TMP_DIR . \\ -+ ${reference_cmd} \\ -+ ${intervals_cmd} - """ - - stub: - -'modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap' is unchanged -'modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test' is unchanged -************************************************************ diff --git a/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test b/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test deleted file mode 100644 index 0037acab..00000000 --- a/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test +++ /dev/null @@ -1,186 +0,0 @@ - -nextflow_process { - - name "Test Process PICARD_COLLECTMULTIPLEMETRICS" - script "../main.nf" - process "PICARD_COLLECTMULTIPLEMETRICS" - - tag "modules" - tag "modules_nfcore" - tag "picard" - tag "picard/collectmultiplemetrics" - - test("test-picard-collectmultiplemetrics") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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) - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [[id:'genome'],[]] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.metrics[0][1].collect { file(it).name }.toSorted(), - process.out.pdf[0][1].collect { file(it).name }.toSorted(), - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("test-picard-collectmultiplemetrics-nofasta") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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) - ] - input[1] = [[id:'genome'],[]] - input[2] = [[id:'genome'],[]] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.metrics[0][1].collect { file(it).name }.toSorted(), - process.out.pdf[0][1].collect { file(it).name }.toSorted(), - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("test-picard-collectmultiplemetrics-cram") { - - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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) - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - process.out.metrics[0][1].collect { file(it).name }.toSorted(), - process.out.pdf[0][1].collect { file(it).name }.toSorted(), - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("test-picard-collectmultiplemetrics - stub") { - options "-stub" - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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) - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [[id:'genome'],[]] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - } - - test("test-picard-collectmultiplemetrics-nofasta - stub") { - options "-stub" - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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) - ] - input[1] = [[id:'genome'],[]] - input[2] = [[id:'genome'],[]] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - } - - test("test-picard-collectmultiplemetrics-cram - stub") { - options "-stub" - when { - process { - """ - input[0] = [ - [ id:'test', single_end:false ], // meta map - 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) - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - } -} diff --git a/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap b/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap deleted file mode 100644 index 393ed100..00000000 --- a/modules/nf-core/picard/collectmultiplemetrics/tests/main.nf.test.snap +++ /dev/null @@ -1,242 +0,0 @@ -{ - "test-picard-collectmultiplemetrics": { - "content": [ - [ - "test.CollectMultipleMetrics.alignment_summary_metrics", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", - "test.CollectMultipleMetrics.insert_size_metrics", - "test.CollectMultipleMetrics.quality_by_cycle_metrics", - "test.CollectMultipleMetrics.quality_distribution_metrics" - ], - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", - "test.CollectMultipleMetrics.insert_size_histogram.pdf", - "test.CollectMultipleMetrics.quality_by_cycle.pdf", - "test.CollectMultipleMetrics.quality_distribution.pdf", - "test.CollectMultipleMetrics.read_length_histogram.pdf" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTMULTIPLEMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-02T10:22:21.230301646", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - }, - "test-picard-collectmultiplemetrics - stub": { - "content": [ - { - "metrics": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.alignment_summary_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.insert_size_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_distribution_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "pdf": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.insert_size_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.read_length_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "versions_picard": [ - [ - "PICARD_COLLECTMULTIPLEMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-20T10:32:38.701455244", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "test-picard-collectmultiplemetrics-nofasta - stub": { - "content": [ - { - "metrics": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.alignment_summary_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.insert_size_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_distribution_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "pdf": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.insert_size_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.read_length_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "versions_picard": [ - [ - "PICARD_COLLECTMULTIPLEMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-20T10:32:48.923918624", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "test-picard-collectmultiplemetrics-cram": { - "content": [ - [ - "test.CollectMultipleMetrics.alignment_summary_metrics", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", - "test.CollectMultipleMetrics.insert_size_metrics", - "test.CollectMultipleMetrics.quality_by_cycle_metrics", - "test.CollectMultipleMetrics.quality_distribution_metrics" - ], - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", - "test.CollectMultipleMetrics.insert_size_histogram.pdf", - "test.CollectMultipleMetrics.quality_by_cycle.pdf", - "test.CollectMultipleMetrics.quality_distribution.pdf", - "test.CollectMultipleMetrics.read_length_histogram.pdf" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTMULTIPLEMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-02T10:23:52.23446844", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - }, - "test-picard-collectmultiplemetrics-nofasta": { - "content": [ - [ - "test.CollectMultipleMetrics.alignment_summary_metrics", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", - "test.CollectMultipleMetrics.insert_size_metrics", - "test.CollectMultipleMetrics.quality_by_cycle_metrics", - "test.CollectMultipleMetrics.quality_distribution_metrics" - ], - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", - "test.CollectMultipleMetrics.insert_size_histogram.pdf", - "test.CollectMultipleMetrics.quality_by_cycle.pdf", - "test.CollectMultipleMetrics.quality_distribution.pdf", - "test.CollectMultipleMetrics.read_length_histogram.pdf" - ], - { - "versions_picard": [ - [ - "PICARD_COLLECTMULTIPLEMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-02T10:23:27.387621193", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - } - }, - "test-picard-collectmultiplemetrics-cram - stub": { - "content": [ - { - "metrics": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.alignment_summary_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.insert_size_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_by_cycle_metrics:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_distribution_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "pdf": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.insert_size_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_by_cycle.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.quality_distribution.pdf:md5,d41d8cd98f00b204e9800998ecf8427e", - "test.CollectMultipleMetrics.read_length_histogram.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "versions_picard": [ - [ - "PICARD_COLLECTMULTIPLEMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-20T10:32:57.11686549", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - } -} \ No newline at end of file diff --git a/modules/nf-core/picard/collectwgsmetrics/environment.yml b/modules/nf-core/picard/collectwgsmetrics/environment.yml deleted file mode 100644 index 186d4a4b..00000000 --- a/modules/nf-core/picard/collectwgsmetrics/environment.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -# 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/picard - - bioconda::picard=3.4.0 - - conda-forge::r-base=4.4.1 diff --git a/modules/nf-core/picard/collectwgsmetrics/main.nf b/modules/nf-core/picard/collectwgsmetrics/main.nf deleted file mode 100644 index 538f77be..00000000 --- a/modules/nf-core/picard/collectwgsmetrics/main.nf +++ /dev/null @@ -1,51 +0,0 @@ -process PICARD_COLLECTWGSMETRICS { - tag "${meta.id}" - label 'process_single' - - 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/08/0861295baa7c01fc593a9da94e82b44a729dcaf8da92be8e565da109aa549b25/data' - : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" - - input: - tuple val(meta), path(bam), path(bai) ,path(fasta) ,path(fai), path(dict) - path intervallist - - output: - tuple val(meta), path("*_metrics"), emit: metrics - tuple val("${task.process}"), val('picard'), eval("picard CollectWgsMetrics --version 2>&1 | sed -n 's/.*Version://p'"), topic: versions, emit: versions_picard - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def avail_mem = 3072 - def interval = intervallist ? "--INTERVALS ${intervallist}" : '' - if (!task.memory) { - log.info('[Picard CollectWgsMetrics] Available memory not known - defaulting to 3GB. Specify process memory requirements to change this.') - } - else { - avail_mem = (task.memory.mega * 0.8).intValue() - } - """ - export TMP=\$PWD - picard \\ - -Xmx${avail_mem}M \\ - CollectWgsMetrics \\ - ${args} \\ - --INPUT ${bam} \\ - --OUTPUT ${prefix}.CollectWgsMetrics.coverage_metrics \\ - --REFERENCE_SEQUENCE ${fasta} \\ - --TMP_DIR . \\ - ${interval} - - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.CollectWgsMetrics.coverage_metrics - """ -} diff --git a/modules/nf-core/picard/collectwgsmetrics/meta.yml b/modules/nf-core/picard/collectwgsmetrics/meta.yml deleted file mode 100644 index c5afe2e7..00000000 --- a/modules/nf-core/picard/collectwgsmetrics/meta.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: picard_collectwgsmetrics -description: Collect metrics about coverage and performance of whole genome sequencing - (WGS) experiments. -keywords: - - alignment - - metrics - - statistics - - quality - - bam -tools: - - picard: - description: | - A set of command line tools (in Java) for manipulating high-throughput sequencing (HTS) - data and formats such as SAM/BAM/CRAM and VCF. - homepage: https://broadinstitute.github.io/picard/ - documentation: https://broadinstitute.github.io/picard/ - licence: ["MIT"] - identifier: biotools:picard_tools -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Aligned reads file - pattern: "*.{bam, cram}" - ontologies: [] - - bai: - type: file - description: (Optional) Aligned reads file index - pattern: "*.{bai,crai}" - ontologies: [] - - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - fasta: - type: file - description: Genome fasta file - pattern: "*.{fa,fasta,fna}" - ontologies: [] - - - meta3: - type: map - description: | - Groovy Map containing reference information - e.g. [ id:'genome' ] - - fai: - type: file - description: Genome fasta file index - pattern: "*.{fai}" - ontologies: [] - - intervallist: - type: file - description: Picard Interval List. Defines which contigs to include. Can be generated - from a BED file with GATK BedToIntervalList. - ontologies: [] -output: - metrics: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*_metrics": - type: file - description: Alignment metrics files generated by picard - pattern: "*_{metrics}" - ontologies: [] - versions_picard: - - - ${task.process}: - type: string - description: The process the versions were collected from - - picard: - type: string - description: The tool name - - "picard CollectWgsMetrics --version 2>&1 | sed -n 's/.*Version://p'": - 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 - - picard: - type: string - description: The tool name - - "picard CollectWgsMetrics --version 2>&1 | sed -n 's/.*Version://p'": - type: string - description: The command used to generate the version of the tool -authors: - - "@drpatelh" - - "@flowuenne" - - "@lassefolkersen" - - "@ramprasadn" -maintainers: - - "@drpatelh" - - "@flowuenne" - - "@lassefolkersen" - - "@ramprasadn" diff --git a/modules/nf-core/picard/collectwgsmetrics/picard-collectwgsmetrics.diff b/modules/nf-core/picard/collectwgsmetrics/picard-collectwgsmetrics.diff deleted file mode 100644 index 5de262d0..00000000 --- a/modules/nf-core/picard/collectwgsmetrics/picard-collectwgsmetrics.diff +++ /dev/null @@ -1,41 +0,0 @@ -Changes in component 'nf-core/picard/collectwgsmetrics' -'modules/nf-core/picard/collectwgsmetrics/environment.yml' is unchanged -'modules/nf-core/picard/collectwgsmetrics/meta.yml' is unchanged -Changes in 'picard/collectwgsmetrics/main.nf': ---- modules/nf-core/picard/collectwgsmetrics/main.nf -+++ modules/nf-core/picard/collectwgsmetrics/main.nf -@@ -8,10 +8,8 @@ - : 'community.wave.seqera.io/library/picard:3.4.0--e9963040df0a9bf6'}" - - input: -- tuple val(meta), path(bam), path(bai) -- tuple val(meta2), path(fasta) -- tuple val(meta3), path(fai) -- path intervallist -+ tuple val(meta), path(bam), path(bai) ,path(fasta) ,path(fai), path(dict) -+ path intervallist - - output: - tuple val(meta), path("*_metrics"), emit: metrics -@@ -32,6 +30,7 @@ - avail_mem = (task.memory.mega * 0.8).intValue() - } - """ -+ export TMP=\$PWD - picard \\ - -Xmx${avail_mem}M \\ - CollectWgsMetrics \\ -@@ -39,7 +38,9 @@ - --INPUT ${bam} \\ - --OUTPUT ${prefix}.CollectWgsMetrics.coverage_metrics \\ - --REFERENCE_SEQUENCE ${fasta} \\ -+ --TMP_DIR . \\ - ${interval} -+ - """ - - stub: - -'modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test.snap' is unchanged -'modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test' is unchanged -************************************************************ diff --git a/modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test b/modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test deleted file mode 100644 index 1bda5980..00000000 --- a/modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test +++ /dev/null @@ -1,138 +0,0 @@ - -nextflow_process { - - name "Test Process PICARD_COLLECTWGSMETRICS" - script "../main.nf" - process "PICARD_COLLECTWGSMETRICS" - - tag "modules" - tag "modules_nfcore" - tag "picard" - tag "picard/collectwgsmetrics" - - test("test-picard-collectwgsmetrics") { - - when { - process { - """ - input[0] = [ [ id:'test', single_end:false ], // meta map - 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), - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) - ] - input[3] = [] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - file(process.out.metrics[0][1]).text.contains('coverage high_quality_coverage_count'), - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("test-picard-collectwgsmetrics-with-interval") { - - when { - process { - """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - [] - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) - ] - input[3] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true) - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot( - file(process.out.metrics[0][1]).text.contains('coverage high_quality_coverage_count'), - process.out.findAll { key, val -> key.startsWith("versions") } - ).match()} - ) - } - } - - test("test-picard-collectwgsmetrics - stub") { - options "-stub" - when { - process { - """ - input[0] = [ [ id:'test', single_end:false ], // meta map - 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), - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) - ] - input[3] = [] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - } - - test("test-picard-collectwgsmetrics-with-interval - stub") { - options "-stub" - when { - process { - """ - input[0] = [ [ id:'test', single_end:false ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - [] - ] - input[1] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) - ] - input[2] = [ - [id:'genome'], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) - ] - input[3] = file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true) - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - } -} diff --git a/modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test.snap b/modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test.snap deleted file mode 100644 index 79f1145f..00000000 --- a/modules/nf-core/picard/collectwgsmetrics/tests/main.nf.test.snap +++ /dev/null @@ -1,94 +0,0 @@ -{ - "test-picard-collectwgsmetrics-with-interval - stub": { - "content": [ - { - "metrics": [ - [ - { - "id": "test", - "single_end": false - }, - "test.CollectWgsMetrics.coverage_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_picard": [ - [ - "PICARD_COLLECTWGSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-20T10:35:04.636691319", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "test-picard-collectwgsmetrics-with-interval": { - "content": [ - false, - { - "versions_picard": [ - [ - "PICARD_COLLECTWGSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-20T10:34:45.059411647", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "test-picard-collectwgsmetrics - stub": { - "content": [ - { - "metrics": [ - [ - { - "id": "test", - "single_end": false - }, - "test.CollectWgsMetrics.coverage_metrics:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_picard": [ - [ - "PICARD_COLLECTWGSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-20T10:34:54.347278951", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - }, - "test-picard-collectwgsmetrics": { - "content": [ - false, - { - "versions_picard": [ - [ - "PICARD_COLLECTWGSMETRICS", - "picard", - "3.4.0" - ] - ] - } - ], - "timestamp": "2026-02-20T10:34:25.744978033", - "meta": { - "nf-test": "0.9.4", - "nextflow": "25.10.4" - } - } -} \ No newline at end of file diff --git a/modules/nf-core/riker/multi/main.nf b/modules/nf-core/riker/multi/main.nf index 51a3e5fd..96eb42cb 100644 --- a/modules/nf-core/riker/multi/main.nf +++ b/modules/nf-core/riker/multi/main.nf @@ -8,40 +8,17 @@ process RIKER_MULTI { 'community.wave.seqera.io/library/riker:0.2.0--20857cea9478b433' }" input: - tuple val(meta), path(bam), path(bai), path(baits), path(targets) - tuple val(meta2), path(fasta), path(fai) + tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) output: - tuple val(meta), path("*.alignment-metrics.txt") , optional: true, emit: alignment_metrics - tuple val(meta), path("*.base-distribution-by-cycle.txt") , optional: true, emit: base_dist - tuple val(meta), path("*.mean-quality-by-cycle.txt") , optional: true, emit: mean_qual - tuple val(meta), path("*.quality-score-distribution.txt") , optional: true, emit: qual_dist - tuple val(meta), path("*.error-mismatch.txt") , optional: true, emit: error_mismatch - tuple val(meta), path("*.error-overlap.txt") , optional: true, emit: error_overlap - tuple val(meta), path("*.error-indel.txt") , optional: true, emit: error_indel - tuple val(meta), path("*.gcbias-detail.txt") , optional: true, emit: gcbias_detail - tuple val(meta), path("*.gcbias-summary.txt") , optional: true, emit: gcbias_summary - tuple val(meta), path("*.hybcap-metrics.txt") , optional: true, emit: hybcap_metrics - tuple val(meta), path("*.hybcap-per-target.txt") , optional: true, emit: hybcap_per_target - tuple val(meta), path("*.hybcap-per-base.txt*") , optional: true, emit: hybcap_per_base - tuple val(meta), path("*.isize-metrics.txt") , optional: true, emit: isize_metrics - tuple val(meta), path("*.isize-histogram.txt") , optional: true, emit: isize_histogram - tuple val(meta), path("*.wgs-metrics.txt") , optional: true, emit: wgs_metrics - tuple val(meta), path("*.wgs-coverage.txt") , optional: true, emit: wgs_coverage - tuple val(meta), path("*.pdf") , optional: true, emit: pdf + tuple val(meta), path("*.{txt,pdf}"), emit: metrics tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker - when: - task.ext.when == null || task.ext.when - script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def ref = fasta ? "-r ${fasta}" : '' - if ((baits as Boolean) ^ (targets as Boolean)) { - error "RIKER_MULTI: both 'baits' and 'targets' must be provided together, or neither" - } - def hybcap_opts = (baits && targets) ? "--hybcap::baits ${baits} --hybcap::targets ${targets}" : '' + def hybcap_opts = roi ? "--hybcap::baits ${roi} --hybcap::targets ${roi}" : '' """ riker multi \\ -i ${bam} \\ diff --git a/modules/nf-core/riker/multi/riker-multi.diff b/modules/nf-core/riker/multi/riker-multi.diff new file mode 100644 index 00000000..9cd57068 --- /dev/null +++ b/modules/nf-core/riker/multi/riker-multi.diff @@ -0,0 +1,55 @@ +Changes in component 'nf-core/riker/multi' +'modules/nf-core/riker/multi/environment.yml' is unchanged +'modules/nf-core/riker/multi/meta.yml' is unchanged +Changes in 'riker/multi/main.nf': +--- modules/nf-core/riker/multi/main.nf ++++ modules/nf-core/riker/multi/main.nf +@@ -8,40 +8,17 @@ + 'community.wave.seqera.io/library/riker:0.2.0--20857cea9478b433' }" + + input: +- tuple val(meta), path(bam), path(bai), path(baits), path(targets) +- tuple val(meta2), path(fasta), path(fai) ++ tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) + + output: +- tuple val(meta), path("*.alignment-metrics.txt") , optional: true, emit: alignment_metrics +- tuple val(meta), path("*.base-distribution-by-cycle.txt") , optional: true, emit: base_dist +- tuple val(meta), path("*.mean-quality-by-cycle.txt") , optional: true, emit: mean_qual +- tuple val(meta), path("*.quality-score-distribution.txt") , optional: true, emit: qual_dist +- tuple val(meta), path("*.error-mismatch.txt") , optional: true, emit: error_mismatch +- tuple val(meta), path("*.error-overlap.txt") , optional: true, emit: error_overlap +- tuple val(meta), path("*.error-indel.txt") , optional: true, emit: error_indel +- tuple val(meta), path("*.gcbias-detail.txt") , optional: true, emit: gcbias_detail +- tuple val(meta), path("*.gcbias-summary.txt") , optional: true, emit: gcbias_summary +- tuple val(meta), path("*.hybcap-metrics.txt") , optional: true, emit: hybcap_metrics +- tuple val(meta), path("*.hybcap-per-target.txt") , optional: true, emit: hybcap_per_target +- tuple val(meta), path("*.hybcap-per-base.txt*") , optional: true, emit: hybcap_per_base +- tuple val(meta), path("*.isize-metrics.txt") , optional: true, emit: isize_metrics +- tuple val(meta), path("*.isize-histogram.txt") , optional: true, emit: isize_histogram +- tuple val(meta), path("*.wgs-metrics.txt") , optional: true, emit: wgs_metrics +- tuple val(meta), path("*.wgs-coverage.txt") , optional: true, emit: wgs_coverage +- tuple val(meta), path("*.pdf") , optional: true, emit: pdf ++ tuple val(meta), path("*.{txt,pdf}"), emit: metrics + tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker +- +- when: +- task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def ref = fasta ? "-r ${fasta}" : '' +- if ((baits as Boolean) ^ (targets as Boolean)) { +- error "RIKER_MULTI: both 'baits' and 'targets' must be provided together, or neither" +- } +- def hybcap_opts = (baits && targets) ? "--hybcap::baits ${baits} --hybcap::targets ${targets}" : '' ++ def hybcap_opts = roi ? "--hybcap::baits ${roi} --hybcap::targets ${roi}" : '' + """ + riker multi \\ + -i ${bam} \\ + +'modules/nf-core/riker/multi/tests/main.nf.test.snap' is unchanged +'modules/nf-core/riker/multi/tests/nextflow.config' is unchanged +'modules/nf-core/riker/multi/tests/main.nf.test' is unchanged +************************************************************ diff --git a/subworkflows/local/bam_qc/main.nf b/subworkflows/local/bam_qc/main.nf index fb2452b2..e38493d4 100644 --- a/subworkflows/local/bam_qc/main.nf +++ b/subworkflows/local/bam_qc/main.nf @@ -1,64 +1,35 @@ // samtools modules -include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' -include { SAMTOOLS_IDXSTATS } from '../../../modules/nf-core/samtools/idxstats/main' -include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/main' +include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' +include { SAMTOOLS_IDXSTATS } from '../../../modules/nf-core/samtools/idxstats/main' +include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/main' -// picard modules -include { PICARD_COLLECTMULTIPLEMETRICS } from '../../../modules/nf-core/picard/collectmultiplemetrics/main' -include { PICARD_COLLECTHSMETRICS } from '../../../modules/nf-core/picard/collecthsmetrics/main' -include { PICARD_COLLECTWGSMETRICS } from '../../../modules/nf-core/picard/collectwgsmetrics/main' +// riker modules +include { RIKER_MULTI } from '../../../modules/nf-core/riker/multi/main' workflow BAM_QC { take: - ch_bam_bai_roi_fasta_fai_dict // channel: [ val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai), path(dict)] + ch_bam_bai_roi_fasta_fai // channel: [ val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai)] main: - ch_bam_bai_roi_fasta_fai_dict - .map { meta, bam, bai, _roi, fasta, fai, _dict -> + ch_bam_bai_roi_fasta_fai + .map { meta, bam, bai, _roi, fasta, fai -> return [meta, bam, bai, fasta, fai] } .set { ch_bam_bai_fasta_fai } SAMTOOLS_STATS(ch_bam_bai_fasta_fai) - SAMTOOLS_FLAGSTAT(ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> return [meta, bam, bai] }) - SAMTOOLS_IDXSTATS(ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> return [meta, bam, bai] }) + SAMTOOLS_FLAGSTAT(ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> + return [meta, bam, bai] + }) + SAMTOOLS_IDXSTATS(ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> + return [meta, bam, bai] + }) - ch_picard_hsmetrics = channel.empty() - ch_picard_multiplemetrics = channel.empty() - ch_picard_multiplemetrics_pdf = channel.empty() - ch_picard_wgsmetrics = channel.empty() - - ch_bam_bai_roi_fasta_fai_dict - .filter { meta, _bam, _bai, _roi, _fasta, _fai, _dict -> - !meta.disable_picard_metrics - } - .set { ch_picard } - - PICARD_COLLECTMULTIPLEMETRICS(ch_picard) - ch_picard_multiplemetrics = PICARD_COLLECTMULTIPLEMETRICS.out.metrics - ch_picard_multiplemetrics_pdf = PICARD_COLLECTMULTIPLEMETRICS.out.pdf - - ch_picard - .branch { meta, bam, bai, roi, fasta, fai, dict -> - hsmetrics: roi != [] - return [meta, bam, bai, roi, roi, fasta, fai, dict] - wgsmetrics: roi == [] - return [meta, bam, bai, fasta, fai, dict] - } - .set { ch_picard_coverage } - - PICARD_COLLECTWGSMETRICS(ch_picard_coverage.wgsmetrics, []) - ch_picard_wgsmetrics = PICARD_COLLECTWGSMETRICS.out.metrics - - PICARD_COLLECTHSMETRICS(ch_picard_coverage.hsmetrics) - ch_picard_hsmetrics = PICARD_COLLECTHSMETRICS.out.metrics + RIKER_MULTI(ch_bam_bai_roi_fasta_fai) emit: - samtools_stats = SAMTOOLS_STATS.out.stats - samtools_flagstat = SAMTOOLS_FLAGSTAT.out.flagstat - samtools_idxstats = SAMTOOLS_IDXSTATS.out.idxstats - picard_multiplemetrics = ch_picard_multiplemetrics - picard_multiplemetrics_pdf = ch_picard_multiplemetrics_pdf - picard_wgsmetrics = ch_picard_wgsmetrics - picard_hsmetrics = ch_picard_hsmetrics + samtools_stats = SAMTOOLS_STATS.out.stats + samtools_flagstat = SAMTOOLS_FLAGSTAT.out.flagstat + samtools_idxstats = SAMTOOLS_IDXSTATS.out.idxstats + riker_metrics = RIKER_MULTI.out.metrics } diff --git a/tests/subworkflows/local/bam_qc/main.nf.test b/tests/subworkflows/local/bam_qc/main.nf.test index acb2f53a..8bab3253 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test +++ b/tests/subworkflows/local/bam_qc/main.nf.test @@ -15,7 +15,7 @@ nextflow_workflow { """ // [meta, bam, bai, roi, fasta, fai, dict] input[0] = Channel.of([ - [ id:'test', single_end:false, disable_picard_metrics:false ], + [ id:'test', single_end:false ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), @@ -30,12 +30,7 @@ nextflow_workflow { then { assert workflow.success assert snapshot( - sanitizeOutput(workflow.out, unstableKeys:[ - "picard_wgsmetrics", - "picard_multiplemetrics_pdf", - "picard_multiplemetrics", - "picard_hsmetrics" - ]) + sanitizeOutput(workflow.out, unstableKeys:[]) ).match() } @@ -47,7 +42,7 @@ nextflow_workflow { """ // [meta, bam, bai, roi, fasta, fai, dict] input[0] = Channel.of([ - [ id:'test', single_end:false, disable_picard_metrics:false ], + [ id:'test', single_end:false ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), [], @@ -62,43 +57,7 @@ nextflow_workflow { then { assert workflow.success assert snapshot( - sanitizeOutput(workflow.out, unstableKeys:[ - "picard_wgsmetrics", - "picard_multiplemetrics_pdf", - "picard_multiplemetrics", - "picard_hsmetrics" - ]) - ).match() - } - } - - test("Bam QC - Samtools") { - when { - workflow { - """ - // [meta, bam, bai, roi, fasta, fai, dict] - input[0] = Channel.of([ - [ id:'test', single_end:false, disable_picard_metrics:true ], - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", checkIfExists: true), - ]) - """ - } - } - - then { - assert workflow.success - assert snapshot( - sanitizeOutput(workflow.out, unstableKeys:[ - "picard_wgsmetrics", - "picard_multiplemetrics_pdf", - "picard_multiplemetrics", - "picard_hsmetrics" - ]) + sanitizeOutput(workflow.out, unstableKeys:[]) ).match() } } diff --git a/tests/workflows/preprocessing.nf.test b/tests/workflows/preprocessing.nf.test index c2770b1a..874aec15 100644 --- a/tests/workflows/preprocessing.nf.test +++ b/tests/workflows/preprocessing.nf.test @@ -76,10 +76,6 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", - "picard_hsmetrics", - "picard_multiplemetrics", - "picard_multiplemetrics_pdf", - "picard_wgsmetrics", "samtools_coverage", "samtools_flagstat", "samtools_stats" @@ -157,10 +153,6 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", - "picard_hsmetrics", - "picard_multiplemetrics", - "picard_multiplemetrics_pdf", - "picard_wgsmetrics", "samtools_coverage", "samtools_flagstat", "samtools_stats" @@ -169,11 +161,9 @@ nextflow_workflow { } } - test("preprocessing - fastq - bwa - bamsormadup - roi - no coverage/no picard") { + test("preprocessing - fastq - bwa - bamsormadup - roi - no coverage") { when { params { - run_coverage = false - disable_picard_metrics = true } workflow { """ @@ -190,7 +180,6 @@ nextflow_workflow { aligner: "bwamem", markdup: "bamsormadup", run_coverage: false, - disable_picard_metrics: true, roi: "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed" ], //fastq_1 @@ -243,10 +232,6 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", - "picard_hsmetrics", - "picard_multiplemetrics", - "picard_multiplemetrics_pdf", - "picard_wgsmetrics", "samtools_coverage", "samtools_flagstat", "samtools_stats" @@ -316,10 +301,6 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", - "picard_hsmetrics", - "picard_multiplemetrics", - "picard_multiplemetrics_pdf", - "picard_wgsmetrics", "samtools_coverage", "samtools_flagstat", "samtools_stats" diff --git a/workflows/preprocessing.nf b/workflows/preprocessing.nf index 46c93597..e69f1f10 100644 --- a/workflows/preprocessing.nf +++ b/workflows/preprocessing.nf @@ -326,10 +326,7 @@ workflow PREPROCESSING { BAM_QC.out.samtools_stats, BAM_QC.out.samtools_flagstat, BAM_QC.out.samtools_idxstats, - BAM_QC.out.picard_multiplemetrics, - BAM_QC.out.picard_wgsmetrics, - BAM_QC.out.picard_wgsmetrics, - BAM_QC.out.picard_hsmetrics, + BAM_QC.out.riker_metrics, ) /* @@ -449,10 +446,7 @@ workflow PREPROCESSING { samtools_stats = BAM_QC.out.samtools_stats samtools_flagstat = BAM_QC.out.samtools_flagstat samtools_idxstats = BAM_QC.out.samtools_idxstats - picard_multiplemetrics = BAM_QC.out.picard_multiplemetrics - picard_multiplemetrics_pdf = BAM_QC.out.picard_multiplemetrics_pdf - picard_wgsmetrics = BAM_QC.out.picard_wgsmetrics - picard_hsmetrics = BAM_QC.out.picard_hsmetrics + riker_metrics = BAM_QC.out.riker_metrics md5sums = MD5SUM.out.checksum multiqcsav_report = MULTIQCSAV.out.report.toList() multiqcsav_data = MULTIQCSAV.out.data.toList() From 0eb3b7f070b0ac59056d8ee0b600436fd4f707a6 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:23:17 +0200 Subject: [PATCH 05/62] fix issues --- main.nf | 1 + tests/subworkflows/local/bam_qc/main.nf.test | 6 ++---- workflows/preprocessing.nf | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index 1f097a99..401e4f29 100644 --- a/main.nf +++ b/main.nf @@ -195,6 +195,7 @@ workflow { samtools_stats = PREPROCESSING.out.samtools_stats samtools_flagstat = PREPROCESSING.out.samtools_flagstat samtools_idxstats = PREPROCESSING.out.samtools_idxstats + riker_metrics = PREPROCESSING.out.riker_metrics md5sums = PREPROCESSING.out.md5sums multiqc_report = PREPROCESSING.out.multiqc_report multiqc_data = PREPROCESSING.out.multiqc_data diff --git a/tests/subworkflows/local/bam_qc/main.nf.test b/tests/subworkflows/local/bam_qc/main.nf.test index 8bab3253..c210d73f 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test +++ b/tests/subworkflows/local/bam_qc/main.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - // [meta, bam, bai, roi, fasta, fai, dict] + // [meta, bam, bai, roi, fasta, fai] input[0] = Channel.of([ [ id:'test', single_end:false ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), @@ -21,7 +21,6 @@ nextflow_workflow { file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", checkIfExists: true), ]) """ } @@ -40,7 +39,7 @@ nextflow_workflow { when { workflow { """ - // [meta, bam, bai, roi, fasta, fai, dict] + // [meta, bam, bai, roi, fasta, fai] input[0] = Channel.of([ [ id:'test', single_end:false ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), @@ -48,7 +47,6 @@ nextflow_workflow { [], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", checkIfExists: true), ]) """ } diff --git a/workflows/preprocessing.nf b/workflows/preprocessing.nf index e69f1f10..e7c5b9e4 100644 --- a/workflows/preprocessing.nf +++ b/workflows/preprocessing.nf @@ -316,7 +316,6 @@ workflow PREPROCESSING { meta.roi && meta.roi != [] ? file(meta.roi, checkIfExists: true) : [], getGenomeAttribute(meta.genome_data, "fasta"), getGenomeAttribute(meta.genome_data, "fai"), - getGenomeAttribute(meta.genome_data, "dict"), ] } .set { ch_bam_qc } From 3e67d631612acdf34febc613f3531c5a1ff87fcf Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Mon, 15 Jun 2026 08:47:57 +0200 Subject: [PATCH 06/62] bump riker, fix tests --- modules.json | 2 +- modules/nf-core/riker/multi/main.nf | 7 +- modules/nf-core/riker/multi/riker-multi.diff | 10 +- .../local/bam_qc/main.nf.test.snap | 177 +++------------ tests/workflows/preprocessing.nf.test.snap | 203 ++++-------------- 5 files changed, 85 insertions(+), 314 deletions(-) diff --git a/modules.json b/modules.json index e51505dd..4e1e1d7f 100644 --- a/modules.json +++ b/modules.json @@ -78,7 +78,7 @@ }, "riker/multi": { "branch": "master", - "git_sha": "b2523041e2b941afdfbd5b3b6bc099437495f70d", + "git_sha": "bdcc0aa910bb7dc54a7335e81608b7a03f0a9992", "installed_by": ["modules"], "patch": "modules/nf-core/riker/multi/riker-multi.diff" }, diff --git a/modules/nf-core/riker/multi/main.nf b/modules/nf-core/riker/multi/main.nf index 96eb42cb..0c70c3e7 100644 --- a/modules/nf-core/riker/multi/main.nf +++ b/modules/nf-core/riker/multi/main.nf @@ -4,8 +4,8 @@ process RIKER_MULTI { 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/5b/5bf9ec40db8ba058b6ff37a94ea398f37b766858b3e584016e93643f7dde9f63/data' : - 'community.wave.seqera.io/library/riker:0.2.0--20857cea9478b433' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/9b/9b1fa220679fac2077935260a88165214d8625b813ecb39cf129aecfba982c65/data' : + 'community.wave.seqera.io/library/riker:0.2.0--aa377939e8395424' }" input: tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) @@ -14,6 +14,9 @@ process RIKER_MULTI { tuple val(meta), path("*.{txt,pdf}"), emit: metrics tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/nf-core/riker/multi/riker-multi.diff b/modules/nf-core/riker/multi/riker-multi.diff index 9cd57068..11a621df 100644 --- a/modules/nf-core/riker/multi/riker-multi.diff +++ b/modules/nf-core/riker/multi/riker-multi.diff @@ -4,8 +4,8 @@ Changes in component 'nf-core/riker/multi' Changes in 'riker/multi/main.nf': --- modules/nf-core/riker/multi/main.nf +++ modules/nf-core/riker/multi/main.nf -@@ -8,40 +8,17 @@ - 'community.wave.seqera.io/library/riker:0.2.0--20857cea9478b433' }" +@@ -8,27 +8,10 @@ + 'community.wave.seqera.io/library/riker:0.2.0--aa377939e8395424' }" input: - tuple val(meta), path(bam), path(bai), path(baits), path(targets) @@ -32,11 +32,9 @@ Changes in 'riker/multi/main.nf': - tuple val(meta), path("*.pdf") , optional: true, emit: pdf + tuple val(meta), path("*.{txt,pdf}"), emit: metrics tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker -- -- when: -- task.ext.when == null || task.ext.when - script: + when: +@@ -38,10 +21,7 @@ def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def ref = fasta ? "-r ${fasta}" : '' diff --git a/tests/subworkflows/local/bam_qc/main.nf.test.snap b/tests/subworkflows/local/bam_qc/main.nf.test.snap index 0f1dea8d..ffa60858 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test.snap +++ b/tests/subworkflows/local/bam_qc/main.nf.test.snap @@ -2,110 +2,31 @@ "Bam QC - HSmetrics": { "content": [ { - "picard_hsmetrics": [ + "riker_metrics": [ [ { - "disable_picard_metrics": false, - "id": "test", - "single_end": false - }, - "test.CollectHsMetrics.coverage_metrics" - ] - ], - "picard_multiplemetrics": [ - [ - { - "disable_picard_metrics": false, "id": "test", "single_end": false }, [ - "test.CollectMultipleMetrics.alignment_summary_metrics", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", - "test.CollectMultipleMetrics.insert_size_metrics", - "test.CollectMultipleMetrics.quality_by_cycle_metrics", - "test.CollectMultipleMetrics.quality_distribution_metrics" + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,43dcb037a557e5cbf784f340cadc02e1", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] ] - ], - "picard_multiplemetrics_pdf": [ - [ - { - "disable_picard_metrics": false, - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", - "test.CollectMultipleMetrics.insert_size_histogram.pdf", - "test.CollectMultipleMetrics.quality_by_cycle.pdf", - "test.CollectMultipleMetrics.quality_distribution.pdf", - "test.CollectMultipleMetrics.read_length_histogram.pdf" - ] - ] - ], - "picard_wgsmetrics": [ - ], "samtools_flagstat": [ [ { "id": "test", - "single_end": false, - "disable_picard_metrics": false - }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" - ] - ], - "samtools_idxstats": [ - [ - { - "id": "test", - "single_end": false, - "disable_picard_metrics": false - }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" - ] - ], - "samtools_stats": [ - [ - { - "id": "test", - "single_end": false, - "disable_picard_metrics": false - }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" - ] - ] - } - ], - "timestamp": "2026-03-25T18:43:20.761133", - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" - } - }, - "Bam QC - Samtools": { - "content": [ - { - "picard_hsmetrics": [ - - ], - "picard_multiplemetrics": [ - - ], - "picard_multiplemetrics_pdf": [ - - ], - "picard_wgsmetrics": [ - - ], - "samtools_flagstat": [ - [ - { - "id": "test", - "single_end": false, - "disable_picard_metrics": true + "single_end": false }, "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" ] @@ -114,8 +35,7 @@ [ { "id": "test", - "single_end": false, - "disable_picard_metrics": true + "single_end": false }, "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] @@ -124,74 +44,47 @@ [ { "id": "test", - "single_end": false, - "disable_picard_metrics": true + "single_end": false }, "test.stats:md5,ff81063faa5cf509f16044c4160733b5" ] ] } ], - "timestamp": "2026-03-25T18:44:55.125939", + "timestamp": "2026-06-15T07:38:49.8639", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" + "nf-test": "0.9.5", + "nextflow": "26.04.3" } }, "Bam QC - WGSmetrics": { "content": [ { - "picard_hsmetrics": [ - - ], - "picard_multiplemetrics": [ + "riker_metrics": [ [ { - "disable_picard_metrics": false, "id": "test", "single_end": false }, [ - "test.CollectMultipleMetrics.alignment_summary_metrics", - "test.CollectMultipleMetrics.base_distribution_by_cycle_metrics", - "test.CollectMultipleMetrics.insert_size_metrics", - "test.CollectMultipleMetrics.quality_by_cycle_metrics", - "test.CollectMultipleMetrics.quality_distribution_metrics" + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] ] ], - "picard_multiplemetrics_pdf": [ - [ - { - "disable_picard_metrics": false, - "id": "test", - "single_end": false - }, - [ - "test.CollectMultipleMetrics.base_distribution_by_cycle.pdf", - "test.CollectMultipleMetrics.insert_size_histogram.pdf", - "test.CollectMultipleMetrics.quality_by_cycle.pdf", - "test.CollectMultipleMetrics.quality_distribution.pdf", - "test.CollectMultipleMetrics.read_length_histogram.pdf" - ] - ] - ], - "picard_wgsmetrics": [ - [ - { - "disable_picard_metrics": false, - "id": "test", - "single_end": false - }, - "test.CollectWgsMetrics.coverage_metrics" - ] - ], "samtools_flagstat": [ [ { "id": "test", - "single_end": false, - "disable_picard_metrics": false + "single_end": false }, "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" ] @@ -200,8 +93,7 @@ [ { "id": "test", - "single_end": false, - "disable_picard_metrics": false + "single_end": false }, "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] @@ -210,18 +102,17 @@ [ { "id": "test", - "single_end": false, - "disable_picard_metrics": false + "single_end": false }, "test.stats:md5,ff81063faa5cf509f16044c4160733b5" ] ] } ], - "timestamp": "2026-03-25T18:44:25.625109", + "timestamp": "2026-06-15T07:40:29.049547", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" + "nf-test": "0.9.5", + "nextflow": "26.04.3" } } } \ No newline at end of file diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index 5338b7c2..f3c693c4 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -459,105 +459,44 @@ "panelcoverage": [ ], - "picard_hsmetrics": [ + "riker_metrics": [ [ { "groupSize": 1, "groupTarget": { - "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", + "samplename": "sample1", "library": "test", - "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "tag": "WES", "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WES" - } - }, - "sample1.CollectHsMetrics.coverage_metrics" - ] - ], - "picard_multiplemetrics": [ - [ - { - "groupSize": 1, - "groupTarget": { "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", - "library": "test", "markdup": "bamsormadup", - "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, - "tag": "WES" - } - }, - [ - "sample1.CollectMultipleMetrics.alignment_summary_metrics", - "sample1.CollectMultipleMetrics.base_distribution_by_cycle_metrics", - "sample1.CollectMultipleMetrics.quality_by_cycle_metrics", - "sample1.CollectMultipleMetrics.quality_distribution_metrics" - ] - ] - ], - "picard_multiplemetrics_pdf": [ - [ - { - "groupSize": 1, - "groupTarget": { - "aligner": "bwamem", "genome": "GRCh38", "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WES" + "id": "sample1" } }, [ - "sample1.CollectMultipleMetrics.base_distribution_by_cycle.pdf", - "sample1.CollectMultipleMetrics.quality_by_cycle.pdf", - "sample1.CollectMultipleMetrics.quality_distribution.pdf", - "sample1.CollectMultipleMetrics.read_length_histogram.pdf" + "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", + "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", + "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", + "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", + "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", + "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", + "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" ] ] - ], - "picard_wgsmetrics": [ - ], "rna_junctions": [ @@ -712,10 +651,10 @@ ] } ], - "timestamp": "2026-05-19T14:56:03.18527", + "timestamp": "2026-06-15T08:36:58.835655", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "26.04.3" } }, "preprocessing - fastq - bwa - bamsormadup - roi - no coverage/no picard": { @@ -1469,101 +1408,42 @@ "panelcoverage": [ ], - "picard_hsmetrics": [ - - ], - "picard_multiplemetrics": [ + "riker_metrics": [ [ { "groupSize": 1, "groupTarget": { - "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", + "samplename": "sample1", "library": "test", - "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "tag": "WGS", "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WGS" - } - }, - [ - "sample1.CollectMultipleMetrics.alignment_summary_metrics", - "sample1.CollectMultipleMetrics.base_distribution_by_cycle_metrics", - "sample1.CollectMultipleMetrics.quality_by_cycle_metrics", - "sample1.CollectMultipleMetrics.quality_distribution_metrics" - ] - ] - ], - "picard_multiplemetrics_pdf": [ - [ - { - "groupSize": 1, - "groupTarget": { "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", - "library": "test", "markdup": "bamsormadup", - "organism": "Homo sapiens", "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", "single_end": false, - "tag": "WGS" - } - }, - [ - "sample1.CollectMultipleMetrics.base_distribution_by_cycle.pdf", - "sample1.CollectMultipleMetrics.quality_by_cycle.pdf", - "sample1.CollectMultipleMetrics.quality_distribution.pdf", - "sample1.CollectMultipleMetrics.read_length_histogram.pdf" - ] - ] - ], - "picard_wgsmetrics": [ - [ - { - "groupSize": 1, - "groupTarget": { - "aligner": "bwamem", "genome": "GRCh38", "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WGS" + "id": "sample1" } }, - "sample1.CollectWgsMetrics.coverage_metrics" + [ + "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", + "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", + "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", + "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", + "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", + "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", + "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" + ] ] ], "rna_junctions": [ @@ -1714,10 +1594,10 @@ ] } ], - "timestamp": "2026-05-19T14:59:02.416267", + "timestamp": "2026-06-15T08:38:36.674001", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "26.04.3" } }, "preprocessing - flowcell - bwa - bamsormadup - roi": { @@ -1756,7 +1636,6 @@ "adapter_R1": null, "adapter_R2": null, "run_coverage": true, - "disable_picard_metrics": true, "roi": null, "genome_data": { "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", @@ -1773,10 +1652,10 @@ ] } ], - "timestamp": "2026-05-19T12:26:24.789934", + "timestamp": "2026-06-15T08:43:48.791593", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "26.04.3" } } } \ No newline at end of file From 0721b32dd56afbb53b25952d7f591e1b3652f438 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Mon, 15 Jun 2026 09:28:46 +0200 Subject: [PATCH 07/62] fix snapshot --- tests/workflows/preprocessing.nf.test.snap | 529 +++++++++++---------- 1 file changed, 274 insertions(+), 255 deletions(-) diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index f3c693c4..29c6754d 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -657,7 +657,7 @@ "nextflow": "26.04.3" } }, - "preprocessing - fastq - bwa - bamsormadup - roi - no coverage/no picard": { + "preprocessing - fastq - bwa - bamsormadup - no roi": { "content": [ { "align_reports": [ @@ -669,7 +669,6 @@ "groupSize": 1, "groupTarget": { "aligner": "bwamem", - "disable_picard_metrics": true, "genome": "GRCh38", "genome_data": { "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", @@ -682,12 +681,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, + "run_coverage": true, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.cram", @@ -714,7 +712,6 @@ { "aligner": "bwamem", "count": 1, - "disable_picard_metrics": true, "genome": "GRCh38", "genome_data": { "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", @@ -735,12 +732,11 @@ "PU": "H5T2YDSX3.1", "SM": "sample1" }, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, + "run_coverage": true, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" }, "sample1.fastp.html" ] @@ -752,13 +748,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": false, - "disable_picard_metrics": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": true, "single_end": false, "readgroup": { "LB": "test", @@ -790,7 +784,6 @@ "groupSize": 1, "groupTarget": { "aligner": "bwamem", - "disable_picard_metrics": true, "genome": "GRCh38", "genome_data": { "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", @@ -803,34 +796,158 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, + "run_coverage": true, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.md5" ] ], "mosdepth_global": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "run_coverage": true, + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mosdepth.global.dist.txt:md5,4574a0f755903d7ab7aa07297cc1efee" + ] ], "mosdepth_per_base_bed": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "run_coverage": true, + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.per-base.bed.gz:md5,e5c10c94f3870f6ed2c75a904e9ade7f" + ] ], "mosdepth_per_base_csi": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "run_coverage": true, + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WGS" + } + }, + "sample1.per-base.bed.gz.csi" + ] ], "mosdepth_per_base_d4": [ ], "mosdepth_quantized_bed": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "run_coverage": true, + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.quantized.bed.gz:md5,d54d469a692c3fe4a4e1db02c08be518" + ] ], "mosdepth_quantized_csi": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "run_coverage": true, + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WGS" + } + }, + "sample1.quantized.bed.gz.csi" + ] ], "mosdepth_regions": [ @@ -842,7 +959,32 @@ ], "mosdepth_summary": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "run_coverage": true, + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mosdepth.summary.txt:md5,699b955719b06ff290edbe0692492213" + ] ], "mosdepth_thresholds_bed": [ @@ -887,17 +1029,43 @@ "panelcoverage": [ ], - "picard_hsmetrics": [ - - ], - "picard_multiplemetrics": [ - - ], - "picard_multiplemetrics_pdf": [ - - ], - "picard_wgsmetrics": [ - + "riker_metrics": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "run_coverage": true, + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + [ + "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", + "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", + "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", + "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", + "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", + "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", + "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", + "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" + ] + ] ], "rna_junctions": [ @@ -906,7 +1074,32 @@ ], "samtools_coverage": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "run_coverage": true, + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WGS" + } + }, + "sample1.coverage.txt" + ] ], "samtools_flagstat": [ [ @@ -914,7 +1107,6 @@ "groupSize": 1, "groupTarget": { "aligner": "bwamem", - "disable_picard_metrics": true, "genome": "GRCh38", "genome_data": { "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", @@ -927,12 +1119,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, + "run_coverage": true, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.flagstat" @@ -946,13 +1137,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": false, - "disable_picard_metrics": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": true, "single_end": false, "genome": "GRCh38", "genome_data": { @@ -974,7 +1163,6 @@ "groupSize": 1, "groupTarget": { "aligner": "bwamem", - "disable_picard_metrics": true, "genome": "GRCh38", "genome_data": { "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", @@ -987,12 +1175,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, + "run_coverage": true, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.stats" @@ -1006,13 +1193,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": false, - "disable_picard_metrics": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": true, "single_end": false, "genome": "GRCh38", "genome_data": { @@ -1030,13 +1215,13 @@ ] } ], - "timestamp": "2026-05-19T15:00:50.283164", + "timestamp": "2026-06-15T08:38:36.674001", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "26.04.3" } }, - "preprocessing - fastq - bwa - bamsormadup - no roi": { + "preprocessing - fastq - bwa - bamsormadup - roi - no coverage": { "content": [ { "align_reports": [ @@ -1060,11 +1245,12 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.cram", @@ -1111,11 +1297,12 @@ "PU": "H5T2YDSX3.1", "SM": "sample1" }, - "run_coverage": true, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" }, "sample1.fastp.html" ] @@ -1127,11 +1314,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "run_coverage": false, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "readgroup": { "LB": "test", @@ -1175,158 +1363,34 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.md5" ] ], "mosdepth_global": [ - [ - { - "groupSize": 1, - "groupTarget": { - "samplename": "sample1", - "library": "test", - "organism": "Homo sapiens", - "tag": "WGS", - "sample_type": "DNA", - "aligner": "bwamem", - "markdup": "bamsormadup", - "run_coverage": true, - "single_end": false, - "genome": "GRCh38", - "genome_data": { - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1" - } - }, - "sample1.mosdepth.global.dist.txt:md5,4574a0f755903d7ab7aa07297cc1efee" - ] + ], "mosdepth_per_base_bed": [ - [ - { - "groupSize": 1, - "groupTarget": { - "samplename": "sample1", - "library": "test", - "organism": "Homo sapiens", - "tag": "WGS", - "sample_type": "DNA", - "aligner": "bwamem", - "markdup": "bamsormadup", - "run_coverage": true, - "single_end": false, - "genome": "GRCh38", - "genome_data": { - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1" - } - }, - "sample1.per-base.bed.gz:md5,e5c10c94f3870f6ed2c75a904e9ade7f" - ] + ], "mosdepth_per_base_csi": [ - [ - { - "groupSize": 1, - "groupTarget": { - "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WGS" - } - }, - "sample1.per-base.bed.gz.csi" - ] + ], "mosdepth_per_base_d4": [ ], "mosdepth_quantized_bed": [ - [ - { - "groupSize": 1, - "groupTarget": { - "samplename": "sample1", - "library": "test", - "organism": "Homo sapiens", - "tag": "WGS", - "sample_type": "DNA", - "aligner": "bwamem", - "markdup": "bamsormadup", - "run_coverage": true, - "single_end": false, - "genome": "GRCh38", - "genome_data": { - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1" - } - }, - "sample1.quantized.bed.gz:md5,d54d469a692c3fe4a4e1db02c08be518" - ] + ], "mosdepth_quantized_csi": [ - [ - { - "groupSize": 1, - "groupTarget": { - "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WGS" - } - }, - "sample1.quantized.bed.gz.csi" - ] + ], "mosdepth_regions": [ @@ -1338,32 +1402,7 @@ ], "mosdepth_summary": [ - [ - { - "groupSize": 1, - "groupTarget": { - "samplename": "sample1", - "library": "test", - "organism": "Homo sapiens", - "tag": "WGS", - "sample_type": "DNA", - "aligner": "bwamem", - "markdup": "bamsormadup", - "run_coverage": true, - "single_end": false, - "genome": "GRCh38", - "genome_data": { - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1" - } - }, - "sample1.mosdepth.summary.txt:md5,699b955719b06ff290edbe0692492213" - ] + ], "mosdepth_thresholds_bed": [ @@ -1416,11 +1455,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "run_coverage": false, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -1453,32 +1493,7 @@ ], "samtools_coverage": [ - [ - { - "groupSize": 1, - "groupTarget": { - "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WGS" - } - }, - "sample1.coverage.txt" - ] + ], "samtools_flagstat": [ [ @@ -1498,11 +1513,12 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.flagstat" @@ -1516,11 +1532,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "run_coverage": false, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -1554,11 +1571,12 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.stats" @@ -1572,11 +1590,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "run_coverage": false, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -1594,7 +1613,7 @@ ] } ], - "timestamp": "2026-06-15T08:38:36.674001", + "timestamp": "2026-06-15T09:20:27.039822", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.3" From 28c81af6dc9c0012ec356dbd87d834488da7bed0 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 23 Jun 2026 09:33:12 +0200 Subject: [PATCH 08/62] fix tests --- tests/subworkflows/local/bam_qc/main.nf.test | 16 ++++++++++++++-- tests/workflows/preprocessing.nf.test | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tests/subworkflows/local/bam_qc/main.nf.test b/tests/subworkflows/local/bam_qc/main.nf.test index c210d73f..7ae1f8ea 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test +++ b/tests/subworkflows/local/bam_qc/main.nf.test @@ -29,7 +29,13 @@ nextflow_workflow { then { assert workflow.success assert snapshot( - sanitizeOutput(workflow.out, unstableKeys:[]) + sanitizeOutput(workflow.out, unstableKeys:[]).collectEntries { key, value -> + if (value.endsWith(".pdf")) { + [ key: file(value).name] + } else { + [ key: value ] + } + } ).match() } @@ -55,7 +61,13 @@ nextflow_workflow { then { assert workflow.success assert snapshot( - sanitizeOutput(workflow.out, unstableKeys:[]) + sanitizeOutput(workflow.out, unstableKeys:[]).collectEntries { key, value -> + if (value.endsWith(".pdf")) { + [ key: file(value).name] + } else { + [ key: value ] + } + } ).match() } } diff --git a/tests/workflows/preprocessing.nf.test b/tests/workflows/preprocessing.nf.test index 874aec15..4b1ffcd3 100644 --- a/tests/workflows/preprocessing.nf.test +++ b/tests/workflows/preprocessing.nf.test @@ -307,6 +307,8 @@ nextflow_workflow { ]).collectEntries { key, value -> if (key in ["demultiplex_logs", "demultiplex_reports"]) { [ key: value.sort() ] + } else if (value.endsWith(".pdf")) { + [ key: file(value).name] } else { [ key: value ] } From 5a54e0316828e891e2d18d67247e72a5663bf154 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Thu, 25 Jun 2026 13:55:49 +0200 Subject: [PATCH 09/62] bump riker --- modules.json | 2 +- modules/nf-core/riker/multi/environment.yml | 2 +- modules/nf-core/riker/multi/main.nf | 4 +- modules/nf-core/riker/multi/riker-multi.diff | 2 +- .../riker/multi/tests/main.nf.test.snap | 98 +++++++++---------- pixi.toml | 2 +- 6 files changed, 55 insertions(+), 55 deletions(-) diff --git a/modules.json b/modules.json index 4e1e1d7f..8076039f 100644 --- a/modules.json +++ b/modules.json @@ -78,7 +78,7 @@ }, "riker/multi": { "branch": "master", - "git_sha": "bdcc0aa910bb7dc54a7335e81608b7a03f0a9992", + "git_sha": "6e16b1007d65bc44121ee1a520364d7d72d761ac", "installed_by": ["modules"], "patch": "modules/nf-core/riker/multi/riker-multi.diff" }, diff --git a/modules/nf-core/riker/multi/environment.yml b/modules/nf-core/riker/multi/environment.yml index 31a43156..c35c65db 100644 --- a/modules/nf-core/riker/multi/environment.yml +++ b/modules/nf-core/riker/multi/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::riker=0.2.0 + - bioconda::riker=0.3.0 diff --git a/modules/nf-core/riker/multi/main.nf b/modules/nf-core/riker/multi/main.nf index 0c70c3e7..d4858e71 100644 --- a/modules/nf-core/riker/multi/main.nf +++ b/modules/nf-core/riker/multi/main.nf @@ -4,8 +4,8 @@ process RIKER_MULTI { 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/9b/9b1fa220679fac2077935260a88165214d8625b813ecb39cf129aecfba982c65/data' : - 'community.wave.seqera.io/library/riker:0.2.0--aa377939e8395424' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/62/62ce363fc85eaa178522adfc3ddbc4a145d7a4136981e060151886e34e7a55d5/data' : + 'community.wave.seqera.io/library/riker:0.3.0--56fa17ae2be0828f' }" input: tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) diff --git a/modules/nf-core/riker/multi/riker-multi.diff b/modules/nf-core/riker/multi/riker-multi.diff index 11a621df..8148ea37 100644 --- a/modules/nf-core/riker/multi/riker-multi.diff +++ b/modules/nf-core/riker/multi/riker-multi.diff @@ -5,7 +5,7 @@ Changes in 'riker/multi/main.nf': --- modules/nf-core/riker/multi/main.nf +++ modules/nf-core/riker/multi/main.nf @@ -8,27 +8,10 @@ - 'community.wave.seqera.io/library/riker:0.2.0--aa377939e8395424' }" + 'community.wave.seqera.io/library/riker:0.3.0--56fa17ae2be0828f' }" input: - tuple val(meta), path(bam), path(bai), path(baits), path(targets) diff --git a/modules/nf-core/riker/multi/tests/main.nf.test.snap b/modules/nf-core/riker/multi/tests/main.nf.test.snap index 2d1f4b3d..ddcb045c 100644 --- a/modules/nf-core/riker/multi/tests/main.nf.test.snap +++ b/modules/nf-core/riker/multi/tests/main.nf.test.snap @@ -98,7 +98,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -109,11 +109,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:14.218483", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:39:13.290706" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "sarscov2 - paired_end - bam - hybcap": { "content": [ @@ -173,7 +173,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -184,11 +184,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:34.577471", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:40:59.193433" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "sarscov2 - paired_end - bam - stub": { "content": [ @@ -285,7 +285,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "2": [ @@ -506,7 +506,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -529,11 +529,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:55.911661", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-05-27T12:11:02.975991" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "sarscov2 - paired_end - bam - wgs gcbias alignment basic isize": { "content": [ @@ -580,7 +580,7 @@ "id": "test", "single_end": false }, - "test.gcbias-summary.txt:md5,dd6d6d34bd4bdfdd815c452a68efa0e0" + "test.gcbias-summary.txt:md5,4915d05211aaae398fc0f29ab3cc79b8" ] ], "hybcap_metrics": [ @@ -648,7 +648,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -671,11 +671,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:24.050675", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:40:06.58392" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "sarscov2 - paired_end - bam - error": { "content": [ @@ -747,7 +747,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -758,11 +758,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:38.560042", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:41:26.083098" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "homo_sapiens - paired_end - cram - alignment basic isize": { "content": [ @@ -863,7 +863,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -874,11 +874,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:29.86666", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:40:33.177675" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "sarscov2 - paired_end - bam - all tools": { "content": [ @@ -943,7 +943,7 @@ "id": "test", "single_end": false }, - "test.gcbias-summary.txt:md5,dd6d6d34bd4bdfdd815c452a68efa0e0" + "test.gcbias-summary.txt:md5,4915d05211aaae398fc0f29ab3cc79b8" ] ], "hybcap_metrics": [ @@ -1017,7 +1017,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -1040,11 +1040,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:46.49651", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:42:18.58754" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "sarscov2 - paired_end - bam - error alignment": { "content": [ @@ -1122,7 +1122,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -1133,11 +1133,11 @@ ] } ], + "timestamp": "2026-06-25T12:52:42.518635", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:41:52.632206" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } }, "sarscov2 - paired_end - bam - wgs gcbias": { "content": [ @@ -1172,7 +1172,7 @@ "id": "test", "single_end": false }, - "test.gcbias-summary.txt:md5,dd6d6d34bd4bdfdd815c452a68efa0e0" + "test.gcbias-summary.txt:md5,4915d05211aaae398fc0f29ab3cc79b8" ] ], "hybcap_metrics": [ @@ -1212,7 +1212,7 @@ [ "RIKER_MULTI", "riker", - "0.2.0" + "0.3.0" ] ], "wgs_coverage": [ @@ -1235,10 +1235,10 @@ ] } ], + "timestamp": "2026-06-25T12:52:19.59208", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.2" - }, - "timestamp": "2026-06-04T11:39:40.228372" + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } } } \ No newline at end of file diff --git a/pixi.toml b/pixi.toml index a1241b2f..a3ceccbb 100644 --- a/pixi.toml +++ b/pixi.toml @@ -2,7 +2,7 @@ authors = ["Nicolas Vannieuwkerke "] channels = ["conda-forge", "bioconda"] name = "preprocessing" -platforms = ["linux-64", "osx-64", "osx-arm64"] +platforms = ["linux-64", "osx-arm64"] version = "0.1.0" [tasks] From 151647d8abb343a33b96b4d1dea316dd104a1b71 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Mon, 29 Jun 2026 11:03:40 +0200 Subject: [PATCH 10/62] fix dependencies --- main.nf | 2 +- pixi.lock | 2753 +++++++++++++++--------------------- pixi.toml | 2 +- workflows/preprocessing.nf | 2 +- 4 files changed, 1124 insertions(+), 1635 deletions(-) diff --git a/main.nf b/main.nf index 401e4f29..c618c6b7 100644 --- a/main.nf +++ b/main.nf @@ -28,7 +28,7 @@ params { input: Path // The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure. - outdir: Path + outdir: String // Email address for completion summary. email: String? diff --git a/pixi.lock b/pixi.lock index d7613388..072954e8 100644 --- a/pixi.lock +++ b/pixi.lock @@ -1,7 +1,6 @@ version: 7 platforms: - name: linux-64 - - name: osx-64 - name: osx-arm64 environments: default: @@ -10,7 +9,7 @@ environments: - url: https://conda.anaconda.org/bioconda/ packages: linux-64: - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-26.04.1-h2a3209d_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-26.04.4-h2a3209d_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/nf-core-4.0.2-pyhdfd78af_1.conda - conda: https://conda.anaconda.org/bioconda/noarch/nf-test-0.9.5-h2a3209d_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/piper-0.15.1-pyhdfd78af_0.conda @@ -19,7 +18,7 @@ environments: - conda: https://conda.anaconda.org/bioconda/noarch/refgenconf-0.13.1-pyhdfd78af_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/refgenie-0.13.0-pyhdfd78af_0.conda - 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/alsa-lib-1.2.16.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/biopython-1.87-py314h5bd0f2a_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 @@ -27,28 +26,28 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/coreutils-9.5-hd590300_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py314h7fe84b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.20.0-hcf29cc6_0.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/cryptography-49.0.0-py314h7fe84b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.21.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.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/git-2.54.0-pl5321h6d3cee1_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/git-2.54.0-pl5321h6d3cee1_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.1-h15599e2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_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.19.1-h0c24ade_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.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/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/libblas-3.11.0-8_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.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/libcurl-8.20.0-hcf29cc6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-hcf29cc6_0.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/libev-4.33-hd590300_2.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_1.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 @@ -60,29 +59,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.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.4.1-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.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.42-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-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/markupsafe-3.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.0-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-23.0.2-h53dfc1b_2.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/linux-64/openssl-3.6.3-h35e630c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py314hb4ffadd_0.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 @@ -92,15 +91,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_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/pydantic-core-2.46.4-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py314h1594a91_1.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/pynacl-1.6.2-py314h3129cac_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.5.1-py314h1bee95f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py314h0f05182_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.12.0-py314h42812f9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.13.0-py314h42812f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.2.2-py314h5bd0f2a_0.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 @@ -108,7 +107,7 @@ environments: - 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-libxi-1.8.3-hb03c661_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 @@ -120,12 +119,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arcp-0.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.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/backports.zstd-1.6.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.1.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-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.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda @@ -142,12 +141,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.50-pyhd8ed1ab_0.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/hpack-4.2.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/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/importlib_metadata-8.8.0-h8f7a5dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-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/importlib_metadata-9.0.0-h71f4f89_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.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 @@ -156,41 +155,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/logmuse-0.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pdiff-1.1.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pephubclient-0.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/peppy-0.40.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pipestat-0.13.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.9.1-pyhd8ed1ab_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/pyjwt-2.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/repo2rocrate-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.8-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rocrate-0.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/textual-6.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trogon-0.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.25.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.26.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -199,173 +198,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/yacman-1.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - osx-64: - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-26.04.1-h2a3209d_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/nf-core-4.0.2-pyhdfd78af_1.conda - - conda: https://conda.anaconda.org/bioconda/noarch/nf-test-0.9.5-h2a3209d_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/piper-0.15.1-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/pyfaidx-0.9.0.4-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/pyvcf3-1.0.3-pyhdfd78af_0.tar.bz2 - - conda: https://conda.anaconda.org/bioconda/noarch/refgenconf-0.13.1-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/bioconda/noarch/refgenie-0.13.0-pyhdfd78af_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/arcp-0.2.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.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/cattrs-26.1.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-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.3.3-pyhc90fa1f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/eido-0.2.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filetype-1.2.0-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.50-pyhd8ed1ab_0.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/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/importlib_metadata-8.8.0-h8f7a5dd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.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 - - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/logmuse-0.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pdiff-1.1.5-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pephubclient-0.4.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/peppy-0.40.8-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pipestat-0.13.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.9.1-pyhd8ed1ab_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/pyjwt-2.12.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314t.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/repo2rocrate-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-0.9.6-pyhd8ed1ab_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rocrate-0.15.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/textual-6.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/trogon-0.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.25.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ubiquerg-0.9.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/yacman-1.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/biopython-1.87-py314h58bf454_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.2.0-py314h6b56c8e_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py314h39a9432_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/coreutils-9.5-h10d778d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-48.0.0-py314hc7f1c69_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.20.0-h8f0b9e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/git-2.54.0-pl5321hc696ea9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.19.1-h5ea7634_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-7_he492b99_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-7_h9b27e0a_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.20.0-h8f0b9e4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-7_h859234e_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.5-h0d3cbff_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.4-py314h5af6b61_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-23.0.2-h18c9476_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h52bb76a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.3-py314h424dfac_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-12.2.0-py314ha8c422d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/prek-0.3.13-h19f9e61_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.2.2-py314h5a675f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.4-py314hbde8b1d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py314h9960d16_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-ha91e2d8_0_cp314t.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.30.0-py314hb58a449_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.15-py314h5a675f6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-2.1.2-py314h58bf454_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.3-h8bce59a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda osx-arm64: - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-26.04.1-h2a3209d_0.conda + - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-26.04.4-h2a3209d_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/nf-core-4.0.2-pyhdfd78af_1.conda - conda: https://conda.anaconda.org/bioconda/noarch/nf-test-0.9.5-h2a3209d_0.conda - conda: https://conda.anaconda.org/bioconda/noarch/piper-0.15.1-pyhdfd78af_0.conda @@ -375,15 +212,14 @@ environments: - conda: https://conda.anaconda.org/bioconda/noarch/refgenie-0.13.0-pyhdfd78af_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arcp-0.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.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/backports.zstd-1.6.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.1.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-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.3.3-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda @@ -394,12 +230,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.50-pyhd8ed1ab_0.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/hpack-4.2.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/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/importlib_metadata-8.8.0-h8f7a5dd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-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/importlib_metadata-9.0.0-h71f4f89_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.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 @@ -409,21 +245,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pdiff-1.1.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pephubclient-0.4.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/peppy-0.40.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pipestat-0.13.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.9.1-pyhd8ed1ab_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/pyjwt-2.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314t.conda @@ -431,20 +267,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/repo2rocrate-0.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-0.9.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.3.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.8-pyh8f84b5b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rocrate-0.15.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/textual-6.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/trogon-0.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.25.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.26.7-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -453,9 +289,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/yacman-1.0.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/biopython-1.87-py314ha0ac461_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h5133025_1.conda @@ -463,48 +299,49 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314hbcd5915_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coreutils-9.5-h93a5062_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-48.0.0-py314hb5a3885_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.20.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.54.0-pl5321hc9deb11_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-49.0.0-py314hb5a3885_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.21.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.54.0-pl5321hc9deb11_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.4-py314hb25f971_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.5.0-py314hb25f971_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-23.0.2-hfb9339a_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py314h3dd0261_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda @@ -513,29 +350,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314h8dbd3ad_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.4-py314h4bebe68_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py314h102c760_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h6c44a53_0_cp314t.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py314h079e141_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-he51be1b_0_cp314t.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314h3e57df4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-2026.5.1-py314h4ca4bc6_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py314h8dbd3ad_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.1.2-py314ha0ac461_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ujson-5.13.0-py314h3dd0261_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.2.2-py314ha0ac461_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda packages: - - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-26.04.1-h2a3209d_0.conda - sha256: 8e571134ec01aa022425252aa36d636a375d0d1f702574648e60051e2a5a6f56 - md5: 4e946ad85848a5b81a6ed53f8cc8766b + - conda: https://conda.anaconda.org/bioconda/noarch/nextflow-26.04.4-h2a3209d_0.conda + sha256: 63ade7aaa427ba4697d936bec9f015bfcc300791e7d68954f8d61c5ef5d2d423 + md5: cc7fb4aef26ceaa9dd7cd63b63ab3dee depends: - coreutils - curl - openjdk >=17,<=24 license: Apache-2.0 - size: 37253435 - timestamp: 1778509922928 + size: 37856734 + timestamp: 1781717543902 - conda: https://conda.anaconda.org/bioconda/noarch/nf-core-4.0.2-pyhdfd78af_1.conda sha256: a62019fbb74ba3bcb39ef037fb47b2e00a5bc1293b577468f1102137175e44cc md5: 4ab387e9266b5d792bfa86e28ef4dda8 @@ -666,18 +504,24 @@ packages: - openmp_impl <0.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + strong: + - _openmp_mutex >=4.5 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 + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.16.1-hb03c661_0.conda + sha256: cf93ca0f1f107e95a35969a4622684e08fcb8cf37f8cf4a1e9e424828386c921 + md5: 8904e09bda369377b3dd07e2ac828c5d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-or-later - license_family: GPL - size: 584660 - timestamp: 1768327524772 + license_family: LGPL + run_exports: + weak: + - alsa-lib >=1.2.16.1,<1.3.0a0 + size: 592377 + timestamp: 1781521980743 - conda: https://conda.anaconda.org/conda-forge/linux-64/biopython-1.87-py314h5bd0f2a_0.conda sha256: 587a44e02a3c46f6674b20e6d9bd4f36dc052786143957da1d9d162397553a25 md5: 27bceedf0be5136ca1378b98e5bb2877 @@ -688,6 +532,7 @@ packages: - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 license: LicenseRef-Biopython + run_exports: {} size: 3351435 timestamp: 1774882187073 - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda @@ -703,6 +548,7 @@ packages: - libbrotlicommon 1.2.0 hb03c661_1 license: MIT license_family: MIT + run_exports: {} size: 367376 timestamp: 1764017265553 - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda @@ -713,6 +559,9 @@ packages: - libgcc >=14 license: bzip2-1.0.6 license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 size: 260182 timestamp: 1771350215188 - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda @@ -723,6 +572,9 @@ packages: - libgcc >=14 license: MIT license_family: MIT + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 size: 207882 timestamp: 1765214722852 - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-h3394656_0.conda @@ -748,6 +600,9 @@ packages: - xorg-libxext >=1.3.6,<2.0a0 - xorg-libxrender >=0.9.12,<0.10.0a0 license: LGPL-2.1-only or MPL-1.1 + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 size: 978114 timestamp: 1741554591855 - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda @@ -762,6 +617,7 @@ packages: - python_abi 3.14.* *_cp314 license: MIT license_family: MIT + run_exports: {} size: 300271 timestamp: 1761203085220 - conda: https://conda.anaconda.org/conda-forge/linux-64/coreutils-9.5-hd590300_0.conda @@ -771,55 +627,62 @@ packages: - libgcc-ng >=12 license: GPL-3.0-or-later license_family: GPL + run_exports: {} size: 3014238 timestamp: 1711655132451 - - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-48.0.0-py314h7fe84b3_0.conda - sha256: 6ce32ae5829d21d3bca259f7e022d8a467d778ae1db548570a097d497c88012e - md5: 95d37edaeb19cc94ef1567a7e2abc1c9 + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + sha256: 1c8128f2ba8fccf627729968de7fe7504dbb775c829e533439c9ee52134800fd + md5: b1dd101231d277ad724c40c788f6fdd8 depends: - __glibc >=2.17,<3.0.a0 - cffi >=2.0 - libgcc >=14 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.7,<4.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 1926884 - timestamp: 1777966253398 - - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.20.0-hcf29cc6_0.conda - sha256: 24b6ccc111388df77c65c68b3f3cad9f066e11741469fa60052ad0773f941c6e - md5: cc1a446bff91be88b2fa1d629e4f348b + run_exports: {} + size: 1930691 + timestamp: 1781385496617 + - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.21.0-hcf29cc6_0.conda + sha256: db25befdce25abd42e8c8eafd6bf988b83618eec49e982d41e63429c28803ced + md5: 35caaabe13a4aa0fe77ea634c71478b8 depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.22.2,<1.23.0a0 - - libcurl 8.20.0 hcf29cc6_0 + - libcurl 8.21.0 hcf29cc6_0 - libgcc >=14 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.7,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT - size: 191489 - timestamp: 1777461498522 - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c - md5: 867127763fbe935bab59815b6e0b7b5c + run_exports: {} + size: 194657 + timestamp: 1782296550391 + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.1-h27c8c51_0.conda + sha256: 2e50bdcebdf70a865b81f2456bbc586386451ec601c60f2b6cd22b8c40a2d384 + md5: e0e050cfa9fa85fe39632ab11cb7f3e0 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 + run_exports: + weak: + - fontconfig >=2.18.1,<3.0a0 + - fonts-conda-ecosystem + size: 281880 + timestamp: 1780450077431 - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b md5: 8462b5322567212beeb025f3519fb3e2 @@ -827,6 +690,10 @@ packages: - libfreetype 2.14.3 ha770c72_0 - libfreetype6 2.14.3 h73754d4_0 license: GPL-2.0-only OR FTL + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 size: 173839 timestamp: 1774298173462 - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda @@ -836,15 +703,18 @@ packages: - libgcc-ng >=12 license: MIT license_family: MIT + run_exports: + weak: + - giflib >=5.2.2,<5.3.0a0 size: 77248 timestamp: 1712692454246 - - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.54.0-pl5321h6d3cee1_0.conda - sha256: 718eb36fe23cac36c7bbeeb21ea0078256c8790b0e949a4ebb322e8e1da6c405 - md5: 25396e7aade67a4d4413431559a47591 + - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.54.0-pl5321h6d3cee1_1.conda + sha256: bc98305103a2754f1b143bc525db9f2c2b0aee6ca278e909ee9eba28c1558c10 + md5: ef4ced80193d2a6d4cd92e4b46636b07 depends: - __glibc >=2.28,<3.0.a0 - libcurl >=8.20.0,<9.0a0 - - libexpat >=2.8.0,<3.0a0 + - libexpat >=2.8.1,<3.0a0 - libgcc >=14 - libiconv >=1.18,<2.0a0 - libzlib >=1.3.2,<2.0a0 @@ -852,19 +722,23 @@ packages: - pcre2 >=10.47,<10.48.0a0 - perl 5.* license: GPL-2.0-or-later and LGPL-2.1-or-later - size: 11369381 - timestamp: 1778072346246 - - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - sha256: 25ba37da5c39697a77fce2c9a15e48cf0a84f1464ad2aafbe53d8357a9f6cc8c - md5: 2cd94587f3a401ae05e03a6caf09539d + run_exports: {} + size: 11507059 + timestamp: 1780737102525 + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-hecca717_0.conda + sha256: 885fa7d1d7e2ad9ed0a700ee0d81ceb49de278253082d517959b22d6336eecce + md5: cf09e9fc938518e91d0706572cadf17a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 license: LGPL-2.0-or-later license_family: LGPL - size: 99596 - timestamp: 1755102025473 + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 100054 + timestamp: 1780454302233 - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-11.5.1-h15599e2_0.conda sha256: 3bf149eab76768ed10f95eba015ca996cd6be7dc666996a004c4a8340a57cd60 md5: b90a6ec73cc7d630981f78d4c7ca8fed @@ -882,6 +756,9 @@ packages: - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - harfbuzz >=11.5.1 size: 2427482 timestamp: 1758640288422 - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda @@ -893,6 +770,9 @@ packages: - libstdcxx-ng >=12 license: MIT license_family: MIT + run_exports: + weak: + - icu >=75.1,<76.0a0 size: 12129203 timestamp: 1720853576813 - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda @@ -902,11 +782,14 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=13 license: LGPL-2.1-or-later + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 size: 134088 timestamp: 1754905959823 - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 - md5: fb53fb07ce46a575c5d004bbc96032c2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + sha256: 9b07046870772f28740e3f6149f09ff222843733087a33c5540b169c6289652d + md5: 54157a1c8c0bb70f62dd0b17fba7e7f2 depends: - __glibc >=2.17,<3.0.a0 - keyutils >=1.6.3,<2.0a0 @@ -914,14 +797,17 @@ packages: - libedit >=3.1.20250104,<4.0a0 - libgcc >=14 - libstdcxx >=14 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.7,<4.0a0 license: MIT license_family: MIT - size: 1386730 - timestamp: 1769769569681 - - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_0.conda - sha256: eb89c6c39f2f6a93db55723dbb2f6bba8c8e63e6312bf1abf13e6e9ff45849c8 - md5: f92f984b558e6e6204014b16d212b271 + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1388990 + timestamp: 1781859420533 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda + sha256: 112b5b9462572d970f4abd2912f76a25ee7db158b1e7260163d91dd8a630db84 + md5: 8b3ce45e929cd8e8e5f4d18586b56d8b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -929,8 +815,11 @@ packages: - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT - size: 251086 - timestamp: 1778079286384 + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 251971 + timestamp: 1780211695895 - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c md5: 18335a698559cdbcd86150a48bf54ba6 @@ -941,6 +830,7 @@ packages: - binutils_impl_linux-64 2.45.1 license: GPL-3.0-only license_family: GPL + run_exports: {} size: 728002 timestamp: 1774197446916 - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda @@ -952,39 +842,48 @@ packages: - libstdcxx >=14 license: Apache-2.0 license_family: Apache + run_exports: + weak: + - lerc >=4.1.0,<5.0a0 size: 261513 timestamp: 1773113328888 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-7_h4a7cf45_openblas.conda - build_number: 7 - sha256: 081c850f99bc355821fac9c6e3727d40b3f8ce3beb50a5437cf03726b611ff39 - md5: 955b44e8b00b7f7ef4ce0130cef12394 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda + build_number: 8 + sha256: b2da6bfd72a1c9cb143ccf64bf5b28790cb4eb58bd1cb978f6537b2322f7d48b + md5: 00fc660ab1b2f5ca07e92b4900d10c79 depends: - libopenblas >=0.3.33,<0.3.34.0a0 - libopenblas >=0.3.33,<1.0a0 constrains: - - libcblas 3.11.0 7*_openblas - - blas 2.307 openblas - - liblapack 3.11.0 7*_openblas - - liblapacke 3.11.0 7*_openblas + - blas 2.308 openblas - mkl <2027 + - libcblas 3.11.0 8*_openblas + - liblapack 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas license: BSD-3-Clause license_family: BSD - size: 18716 - timestamp: 1778489854108 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-7_h0358290_openblas.conda - build_number: 7 - sha256: 956ae0bb1ec8b0c3663d75b151aceb0521b54e513bf97f621a035f9c87037970 - md5: 0675639dc24cb0032f199e7ff68e4633 + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 18804 + timestamp: 1779859100675 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda + build_number: 8 + sha256: 1a2bc77bb26520255904a3d9b1f40e6bf0bf9d8d3405c7709dd162282820915a + md5: 33a413f1095f8325e5c30fde3b0d2445 depends: - - libblas 3.11.0 7_h4a7cf45_openblas + - libblas 3.11.0 8_h4a7cf45_openblas constrains: - - liblapacke 3.11.0 7*_openblas - - blas 2.307 openblas - - liblapack 3.11.0 7*_openblas + - blas 2.308 openblas + - liblapacke 3.11.0 8*_openblas + - liblapack 3.11.0 8*_openblas license: BSD-3-Clause license_family: BSD - size: 18675 - timestamp: 1778489861559 + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 18778 + timestamp: 1779859107964 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 @@ -996,11 +895,14 @@ packages: - libzlib >=1.3.1,<2.0a0 license: Apache-2.0 license_family: Apache + run_exports: + weak: + - libcups >=2.3.3,<2.4.0a0 size: 4518030 timestamp: 1770902209173 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.20.0-hcf29cc6_0.conda - sha256: 75963a5dd913311f59a35dbd307592f4fa754c4808aff9c33edb430c415e38eb - md5: c3cc2864f82a944bc90a7beb4d3b0e88 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-hcf29cc6_0.conda + sha256: 93ab25f02666eb8696fa70d9c920f2e3b370742ee17e2758705038a72e11147f + md5: dcd79cabd5d435f48d75db3d81cb5874 depends: - __glibc >=2.17,<3.0.a0 - krb5 >=1.22.2,<1.23.0a0 @@ -1008,12 +910,15 @@ packages: - libnghttp2 >=1.68.1,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.7,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT - size: 468706 - timestamp: 1777461492876 + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 479582 + timestamp: 1782296544301 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 md5: 6c77a605a7a689d17d4819c0f8ac9a00 @@ -1022,6 +927,9 @@ packages: - libgcc >=14 license: MIT license_family: MIT + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 size: 73490 timestamp: 1761979956660 - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -1034,6 +942,9 @@ packages: - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 size: 134676 timestamp: 1738479519902 - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda @@ -1043,20 +954,24 @@ packages: - libgcc-ng >=12 license: BSD-2-Clause license_family: BSD + run_exports: + weak: + - libev >=4.33,<4.34.0a0 size: 112766 timestamp: 1702146165126 - - 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_1.conda + sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 + md5: b24d3c612f71e7aa74158d92106318b2 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 + run_exports: {} + size: 77856 + timestamp: 1781203599810 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -1065,6 +980,9 @@ packages: - libgcc >=14 license: MIT license_family: MIT + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 size: 58592 timestamp: 1769456073053 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda @@ -1073,6 +991,7 @@ packages: depends: - libfreetype6 >=2.14.3 license: GPL-2.0-only OR FTL + run_exports: {} size: 8049 timestamp: 1774298163029 - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda @@ -1086,6 +1005,7 @@ packages: constrains: - freetype >=2.14.3 license: GPL-2.0-only OR FTL + run_exports: {} size: 384575 timestamp: 1774298162622 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda @@ -1099,6 +1019,7 @@ packages: - libgomp 15.2.0 he0feb66_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + run_exports: {} size: 1041084 timestamp: 1778269013026 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda @@ -1108,6 +1029,9 @@ packages: - libgcc 15.2.0 he0feb66_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + run_exports: + strong: + - libgcc size: 27694 timestamp: 1778269016987 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda @@ -1119,6 +1043,7 @@ packages: - libgfortran-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + run_exports: {} size: 27655 timestamp: 1778269042954 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda @@ -1131,6 +1056,7 @@ packages: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + run_exports: {} size: 2483673 timestamp: 1778269025089 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.1-h0d30a3d_2.conda @@ -1146,6 +1072,9 @@ packages: constrains: - glib >2.66 license: LGPL-2.1-or-later + run_exports: + weak: + - libglib >=2.88.1,<3.0a0 size: 4754097 timestamp: 1778508800134 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda @@ -1155,6 +1084,9 @@ packages: - __glibc >=2.17,<3.0.a0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + run_exports: + strong: + - _openmp_mutex >=4.5 size: 603817 timestamp: 1778268942614 - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda @@ -1164,6 +1096,9 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-only + run_exports: + weak: + - libiconv >=1.18,<2.0a0 size: 790176 timestamp: 1754908768807 - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda @@ -1175,22 +1110,28 @@ packages: constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib + run_exports: + weak: + - libjpeg-turbo >=3.1.4.1,<4.0a0 size: 633831 timestamp: 1775962768273 - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-7_h47877c9_openblas.conda - build_number: 7 - sha256: 96962084921f197c9ad13fb7f8b324f2351d50ff3d8d962148751ad532f54a01 - md5: 6569b4f273740e25dc0dc7e3232c2a6c + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda + build_number: 8 + sha256: 168e327d737059553e15cc6ec36d76b9bbb3931c2a7721555fd68b4c9348b247 + md5: 809be8ba8712c77bc7d44c2d99390dc4 depends: - - libblas 3.11.0 7_h4a7cf45_openblas + - libblas 3.11.0 8_h4a7cf45_openblas constrains: - - liblapacke 3.11.0 7*_openblas - - libcblas 3.11.0 7*_openblas - - blas 2.307 openblas + - blas 2.308 openblas + - libcblas 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas license: BSD-3-Clause license_family: BSD - size: 18694 - timestamp: 1778489869038 + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 18790 + timestamp: 1779859115086 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d md5: b88d90cad08e6bc8ad540cb310a761fb @@ -1200,6 +1141,9 @@ packages: constrains: - xz 5.8.3.* license: 0BSD + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 size: 113478 timestamp: 1775825492909 - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda @@ -1210,6 +1154,7 @@ packages: - libgcc >=14 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 92400 timestamp: 1769482286018 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda @@ -1226,6 +1171,9 @@ packages: - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 size: 663344 timestamp: 1773854035739 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda @@ -1240,6 +1188,9 @@ packages: - openblas >=0.3.33,<0.3.34.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - libopenblas >=0.3.33,<1.0a0 size: 5931919 timestamp: 1776993658641 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda @@ -1250,27 +1201,36 @@ packages: - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 size: 317729 timestamp: 1776315175087 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 - md5: 7af961ef4aa2c1136e11dd43ded245ab + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda + sha256: b677bbf1c339d894757c3dcfbb2f88649e499e4991d70ae09a1466da9a6c92d6 + md5: 965e4d531b588b2e42f66fd8e48b056c depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - libgcc >=14 license: ISC - size: 277661 - timestamp: 1772479381288 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.1-h0c1763c_0.conda - sha256: 54cdcd3214313b62c2a8ee277e6f42150d9b748264c1b70d958bf735e420ef8d - md5: 7dc38adcbf71e6b38748e919e16e0dce + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 + size: 269272 + timestamp: 1779163468406 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.2-h0c1763c_0.conda + sha256: 1ab603b6ec93933e76027e1f23b21b22b858ba1b56f1e1695ef6fe5e80cb7358 + md5: 062b0ac602fb0adf250e3dfa86f221c4 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libzlib >=1.3.2,<2.0a0 license: blessing - size: 954962 - timestamp: 1777986471789 + run_exports: + weak: + - libsqlite >=3.53.2,<4.0a0 + size: 957849 + timestamp: 1780574429573 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -1281,6 +1241,9 @@ packages: - openssl >=3.5.0,<4.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 size: 304790 timestamp: 1745608545575 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda @@ -1293,6 +1256,7 @@ packages: - libstdcxx-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + run_exports: {} size: 5852044 timestamp: 1778269036376 - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda @@ -1302,6 +1266,9 @@ packages: - libstdcxx 15.2.0 h934c35e_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL + run_exports: + strong: + - libstdcxx size: 27776 timestamp: 1778269074600 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda @@ -1319,18 +1286,24 @@ packages: - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND + run_exports: + weak: + - libtiff >=4.7.1,<4.8.0a0 size: 435273 timestamp: 1762022005702 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 - md5: 38ffe67b78c9d4de527be8315e5ada2c + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f + md5: 01bb81d12c957de066ea7362007df642 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 license: BSD-3-Clause license_family: BSD - size: 40297 - timestamp: 1775052476770 + run_exports: + weak: + - libuuid >=2.42.2,<3.0a0 + size: 40017 + timestamp: 1781625522462 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b md5: aea31d2e5b1091feca96fcfe945c3cf9 @@ -1341,6 +1314,9 @@ packages: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 size: 429011 timestamp: 1752159441324 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda @@ -1354,6 +1330,9 @@ packages: - xorg-libxdmcp license: MIT license_family: MIT + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 size: 395888 timestamp: 1727278577118 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -1362,6 +1341,9 @@ packages: depends: - libgcc-ng >=12 license: LGPL-2.1-or-later + run_exports: + weak: + - libxcrypt >=4.4.36 size: 100393 timestamp: 1702724383534 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda @@ -1373,6 +1355,9 @@ packages: - zlib 1.3.2 *_2 license: Zlib license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 size: 63629 timestamp: 1774072609062 - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda @@ -1387,6 +1372,7 @@ packages: - jinja2 >=3.0.0 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 27424 timestamp: 1772445227915 - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda @@ -1396,25 +1382,32 @@ packages: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: X11 AND BSD-3-Clause + run_exports: + weak: + - ncurses >=6.6,<7.0a0 size: 918956 timestamp: 1777422145199 - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.4-py314h2b28147_0.conda - sha256: 4429261fd6c41e604bf540c5d7244e919d740d0681421e2528af12a74fb79885 - md5: c8f3b508487aeb903fd6b75e3573a0cb + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.5.0-py314h2b28147_0.conda + sha256: bbc665584886c90daf3f33cfbf665f279cf91d4bd5323f0432c16d2bf4d525e7 + md5: bdb21d2b990f9d3aee10fd43aca851fe depends: - python - - libstdcxx >=14 - libgcc >=14 + - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 - - python_abi 3.14.* *_cp314 + - libcblas >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 - liblapack >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause - size: 8927756 - timestamp: 1778655428154 + license_family: BSD + run_exports: + weak: + - numpy >=1.25,<3 + size: 9075918 + timestamp: 1782112541752 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjdk-23.0.2-h53dfc1b_2.conda sha256: aac6fe6db0841e77f832fc21132ac7ebec1a9b5bae004b5e69e3a210e53e3bf8 md5: 47eea31e0c3f960459237823e5e21a32 @@ -1442,6 +1435,7 @@ packages: - xorg-libxtst >=1.2.5,<2.0a0 license: GPL-2.0-or-later WITH Classpath-exception-2.0 license_family: GPL + run_exports: {} size: 190220381 timestamp: 1743201357942 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda @@ -1456,19 +1450,25 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 size: 355400 timestamp: 1758489294972 - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.2-h35e630c_0.conda - sha256: c0ef482280e38c71a08ad6d71448194b719630345b0c9c60744a2010e8a8e0cb - md5: da1b85b6a87e141f5140bb9924cecab0 + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b + md5: 79dd2074b5cd5c5c6b2930514a11e22d depends: - __glibc >=2.17,<3.0.a0 - ca-certificates - libgcc >=14 license: Apache-2.0 license_family: Apache - size: 3167099 - timestamp: 1775587756857 + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3159683 + timestamp: 1781069855778 - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py314hb4ffadd_0.conda sha256: 8e4b161f3f7fbdf17f842b518ff3794b6af9378a90d095719d7153360d126dc1 md5: bc2e1390314b1269e66fb1966fbcae5d @@ -1521,6 +1521,8 @@ packages: - xlsxwriter >=3.2.0 - zstandard >=0.23.0 license: BSD-3-Clause + license_family: BSD + run_exports: {} size: 15303815 timestamp: 1778602611222 - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -1533,6 +1535,9 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 size: 1222481 timestamp: 1763655398280 - conda: https://conda.anaconda.org/conda-forge/linux-64/perl-5.32.1-7_hd590300_perl5.conda @@ -1543,6 +1548,11 @@ packages: - libgcc-ng >=12 - libxcrypt >=4.4.36 license: GPL-1.0-or-later OR Artistic-1.0-Perl + run_exports: + weak: + - perl >=5.32.1,<5.33.0a0 *_perl5 + noarch: + - perl >=5.32.1,<6.0a0 *_perl5 size: 13344463 timestamp: 1703310653947 - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.2.0-py314h8ec4b1a_0.conda @@ -1564,6 +1574,7 @@ packages: - lcms2 >=2.18,<3.0a0 - tk >=8.6.13,<8.7.0a0 license: HPND + run_exports: {} size: 1082797 timestamp: 1775060059882 - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda @@ -1576,6 +1587,9 @@ packages: - __glibc >=2.17,<3.0.a0 license: MIT license_family: MIT + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 size: 450960 timestamp: 1754665235234 - conda: https://conda.anaconda.org/conda-forge/linux-64/prek-0.3.13-hb17b654_0.conda @@ -1588,6 +1602,7 @@ packages: - __glibc >=2.17 license: MIT license_family: MIT + run_exports: {} size: 5916663 timestamp: 1778015597635 - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda @@ -1600,6 +1615,7 @@ packages: - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 231303 timestamp: 1769678156552 - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda @@ -1610,6 +1626,7 @@ packages: - libgcc >=13 license: MIT license_family: MIT + run_exports: {} size: 8252 timestamp: 1726802366959 - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.4-py314h2e6c369_0.conda @@ -1625,49 +1642,56 @@ packages: - __glibc >=2.17 license: MIT license_family: MIT + run_exports: {} size: 1895020 timestamp: 1778084229247 - - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py314h1594a91_1.conda - sha256: f2d22140c77652c5cc63e2d5828c303de3a2a55a0f6cf2a0768c49d781154619 - md5: 77fdae6293e45ed38efbc84370b8389e + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py314h3129cac_2.conda + sha256: 16eba4bf7f0f3b61691e8aa8817598baa821ba0f8ded9064b776dc82a67d3358 + md5: 36b4f6e8f7ae71525092eb429e4285a2 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.4.1 - libgcc >=14 - - libsodium >=1.0.21,<1.0.22.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 - six license: Apache-2.0 license_family: Apache - size: 1197066 - timestamp: 1772171266918 - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.4-habeac84_100_cp314.conda + run_exports: {} + size: 1207141 + timestamp: 1778984888840 + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda build_number: 100 - sha256: dec247c5badc811baa34d6085df9d0465535883cf745e22e8d79092ad54a3a7b - md5: a443f87920815d41bfe611296e507995 + sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 + md5: 0b9b2f83b5b600e1ac38becde8d0dd44 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.1,<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.2,<4.0a0 + - libuuid >=2.42.1,<3.0a0 - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.6,<4.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 - python_abi 3.14.* *_cp314 - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 - tzdata - zstd >=1.5.7,<1.6.0a0 license: Python-2.0 - size: 36705460 - timestamp: 1775614357822 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 36717183 + timestamp: 1781255094700 python_site_packages_path: lib/python3.14/site-packages - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d @@ -1680,6 +1704,7 @@ packages: - yaml >=0.2.5,<0.3.0a0 license: MIT license_family: MIT + run_exports: {} size: 202391 timestamp: 1770223462836 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda @@ -1691,22 +1716,26 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + run_exports: + weak: + - readline >=8.3,<9.0a0 size: 345073 timestamp: 1765813471974 - - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 - md5: c1c368b5437b0d1a68f372ccf01cb133 + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.5.1-py314h1bee95f_0.conda + sha256: 79d753848377c415578f42285f5f87be711503b887c99e8890fd51d3fae1d6a5 + md5: fb5b4fc759b225d4f32730cc8380ec8e depends: - python - - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - libgcc >=14 - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 license: MIT license_family: MIT - size: 376121 - timestamp: 1764543122774 + run_exports: {} + size: 309696 + timestamp: 1779976994059 - conda: https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.15-py314h0f05182_1.conda sha256: 3bd8db7556e87c98933a47ff9f962af7b8e0dc3757a72180b27cbfcb1f98d2d9 md5: 4f35ae1228a6c5d9df593367ffe8dda1 @@ -1717,6 +1746,7 @@ packages: - python_abi 3.14.* *_cp314 license: MIT license_family: MIT + run_exports: {} size: 150041 timestamp: 1766159514023 - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda @@ -1730,24 +1760,28 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: TCL license_family: BSD + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 size: 3301196 timestamp: 1769460227866 - - conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.12.0-py314h42812f9_0.conda - sha256: b9e346f58bd9e0c359f9008761d926c51adb7ca8a381d4e12fadc5cf37435df3 - md5: 1b96ec0360ef112391b5d2c16c1ccf8d + - conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.13.0-py314h42812f9_0.conda + sha256: d8419b0fef8d14a37deb0f0049aff1774322f76783e1f259868c612dd18d39e9 + md5: 38a5fe5d0c791a129d69b7d98b1f5e4f depends: - python - - libgcc >=14 - - libstdcxx >=14 - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 - python_abi 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD - size: 59807 - timestamp: 1773286930840 - - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py314h5bd0f2a_0.conda - sha256: 9c6ed8b7322a62bea2f738191c374aeea34bf655d399124245f1bbd8e986b3f4 - md5: ecb8efb80a3f80e096fdc95f524d54b5 + run_exports: {} + size: 59899 + timestamp: 1781561593186 + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.2.2-py314h5bd0f2a_0.conda + sha256: f2789ff73f60f3b740629146a64f778bbf40e26900978cb632180878a496423c + md5: e1e275654a6c998b7357606f5da46af7 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -1755,8 +1789,9 @@ packages: - python_abi 3.14.* *_cp314 license: BSD-2-Clause license_family: BSD - size: 88335 - timestamp: 1772794808717 + run_exports: {} + size: 118096 + timestamp: 1782133651496 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b md5: fb901ff28063514abb6046c9ec2c4a45 @@ -1765,6 +1800,9 @@ packages: - libgcc >=13 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libice >=1.1.2,<2.0a0 size: 58628 timestamp: 1734227592886 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda @@ -1777,6 +1815,9 @@ packages: - xorg-libice >=1.1.2,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libsm >=1.2.6,<2.0a0 size: 27590 timestamp: 1741896361728 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda @@ -1788,6 +1829,9 @@ packages: - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libx11 >=1.8.13,<2.0a0 size: 839652 timestamp: 1770819209719 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda @@ -1798,6 +1842,9 @@ packages: - libgcc >=14 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 size: 15321 timestamp: 1762976464266 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda @@ -1808,6 +1855,9 @@ packages: - libgcc >=14 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 size: 20591 timestamp: 1762976546182 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda @@ -1819,6 +1869,9 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxext >=1.3.7,<2.0a0 size: 50326 timestamp: 1769445253162 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda @@ -1830,21 +1883,27 @@ packages: - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxfixes >=6.0.2,<7.0a0 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 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.conda + sha256: 495f99c8eacfa4ae2d8fed2a7f2105777af89acdc204df145d2bbbc380ac631b + md5: adba2e334082bb218db806d4c12277c9 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 + - libgcc >=14 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 license: MIT license_family: MIT - size: 47179 - timestamp: 1727799254088 + run_exports: + weak: + - xorg-libxi >=1.8.3,<2.0a0 + size: 47717 + timestamp: 1779111857071 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 md5: e192019153591938acf7322b6459d36e @@ -1856,6 +1915,9 @@ packages: - xorg-libxrender >=0.9.12,<0.10.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxrandr >=1.5.5,<2.0a0 size: 30456 timestamp: 1769445263457 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda @@ -1867,6 +1929,9 @@ packages: - xorg-libx11 >=1.8.10,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxrender >=0.9.12,<0.10.0a0 size: 33005 timestamp: 1734229037766 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxt-1.3.1-hb9d3cd8_0.conda @@ -1880,6 +1945,9 @@ packages: - xorg-libx11 >=1.8.10,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxt >=1.3.1,<2.0a0 size: 379686 timestamp: 1731860547604 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda @@ -1893,6 +1961,9 @@ packages: - xorg-libxi >=1.7.10,<2.0a0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxtst >=1.2.5,<2.0a0 size: 32808 timestamp: 1727964811275 - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda @@ -1903,6 +1974,9 @@ packages: - __glibc >=2.17,<3.0.a0 license: MIT license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 size: 85189 timestamp: 1753484064210 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda @@ -1914,6 +1988,9 @@ packages: - libstdcxx >=14 license: Zlib license_family: Other + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 size: 122618 timestamp: 1770167931827 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda @@ -1924,6 +2001,9 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 size: 601375 timestamp: 1764777111296 - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-doc-0.0.4-pyhcf101f3_0.conda @@ -1934,6 +2014,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 14222 timestamp: 1762868213144 - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda @@ -1944,17 +2025,9 @@ packages: - typing-extensions >=4.0.0 license: MIT license_family: MIT + run_exports: {} size: 18074 timestamp: 1733247158254 - - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda - sha256: 5b9ef6d338525b332e17c3ed089ca2f53a5d74b7a7b432747d29c6466e39346d - md5: f4e90937bbfc3a4a92539545a37bb448 - depends: - - python >=3.9 - license: MIT - license_family: MIT - size: 14835 - timestamp: 1733754069532 - conda: https://conda.anaconda.org/conda-forge/noarch/arcp-0.2.1-pyhd8ed1ab_1.conda sha256: 9414bc22970444e1a2277db113e5552dbcd214e31c44b62fe4ff2c59d0cf304b md5: c446efb81aa593b4d87ca07ccf6497ec @@ -1962,6 +2035,7 @@ packages: - python >=3.9 license: Apache-2.0 license_family: APACHE + run_exports: {} size: 22785 timestamp: 1736249539310 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda @@ -1972,25 +2046,28 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 64927 timestamp: 1773935801332 - - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.5.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda noarch: generic - sha256: a1c97297e867776760489537bc5ae36fa83a154be30e3b79385a39ca4cb058fe - md5: 1133126d840e75287d83947be3fc3e71 + sha256: 709cac7434d1c5a8828105036212a2a36022a07d807e89e2e99cac939c2d2526 + md5: 40d89d8546ad6e139e73ec8f6d56068b depends: - python >=3.14 license: BSD-3-Clause AND MIT AND EPL-2.0 - size: 7533 - timestamp: 1778594057496 - - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.4.22-hbd8a1cb_0.conda - sha256: c9dbcc8039a52023660d6d1bbf87594a93dd69c6ac5a2a44323af2c92976728d - md5: e18ad67cf881dcadee8b8d9e2f8e5f73 + run_exports: {} + size: 7526 + timestamp: 1781450817767 + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf + md5: a9965dd99f683c5f444428f896635716 depends: - __unix license: ISC - size: 131039 - timestamp: 1776865545798 + run_exports: {} + size: 128866 + timestamp: 1781708962055 - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.1.0-pyhcf101f3_1.conda sha256: c3c5772e8f3c9080b3b89765bb9e9d88972792b54d96d546c29672965bbb8d6c md5: eb57a77657c275d8d0b3542b070f484c @@ -2002,16 +2079,18 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 59678 timestamp: 1771485958517 - - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.4.22-pyhd8ed1ab_0.conda - sha256: 989db6e5957c4b44fa600c68c681ec2f36a55e48f7c7f1c073d5e91caa8cd878 - md5: 929471569c93acefb30282a22060dcd5 + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + sha256: 6c13620e458ba43278379d0cdacc30c497336bddfda81681fd50d114a65c702f + md5: c13824fedced67005d3832c152fe9c2f depends: - python >=3.10 license: ISC - size: 135656 - timestamp: 1776866680878 + run_exports: {} + size: 133877 + timestamp: 1781719949728 - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 md5: a9167b9571f3baa9d448faa2139d1089 @@ -2019,19 +2098,21 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 58872 timestamp: 1775127203018 - - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.3-pyhc90fa1f_0.conda - sha256: 37a5d8b10ea3516e2c42f870c9c351b9f7b31ff48c66d83490039f417e1e5228 - md5: 2266262ce8a425ecb6523d765f79b303 + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda + sha256: c253a41cdf898b651a0786cbb76c6d5fc101d0dbbe719f93a124bc4fde5cdd6a + md5: 554304a07e581a85891b15e39ea9f268 depends: - __unix - python - python >=3.10 license: BSD-3-Clause license_family: BSD - size: 100048 - timestamp: 1777219902525 + run_exports: {} + size: 104999 + timestamp: 1779900548735 - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 md5: 962b9857ee8e7018c22f2776ffa0b2d7 @@ -2039,6 +2120,7 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 27011 timestamp: 1733218222191 - conda: https://conda.anaconda.org/conda-forge/noarch/coloredlogs-15.0.1-pyhd8ed1ab_4.conda @@ -2049,6 +2131,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 43758 timestamp: 1733928076798 - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda @@ -2059,6 +2142,7 @@ packages: - wrapt <3,>=1.10 license: MIT license_family: MIT + run_exports: {} size: 15896 timestamp: 1768934186726 - conda: https://conda.anaconda.org/conda-forge/noarch/eido-0.2.5-pyhd8ed1ab_0.conda @@ -2072,6 +2156,7 @@ packages: - ubiquerg >=0.6.2 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 20939 timestamp: 1770170771099 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda @@ -2081,6 +2166,7 @@ packages: - python >=3.10 - typing_extensions >=4.6.0 license: MIT and PSF-2.0 + run_exports: {} size: 21333 timestamp: 1763918099466 - conda: https://conda.anaconda.org/conda-forge/noarch/filetype-1.2.0-pyhd8ed1ab_0.tar.bz2 @@ -2090,6 +2176,7 @@ packages: - python >3.6 license: MIT license_family: MIT + run_exports: {} size: 19980 timestamp: 1667445885369 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -2097,6 +2184,7 @@ packages: md5: 0c96522c6bdaed4b1566d11387caaf45 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 397370 timestamp: 1566932522327 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 @@ -2104,6 +2192,7 @@ packages: md5: 34893075a5c9e55cdafac56607368fc6 license: OFL-1.1 license_family: Other + run_exports: {} size: 96530 timestamp: 1620479909603 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 @@ -2111,6 +2200,7 @@ packages: md5: 4d59c254e01d9cde7957100457e2d5fb license: OFL-1.1 license_family: Other + run_exports: {} size: 700814 timestamp: 1620479612257 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda @@ -2118,6 +2208,7 @@ packages: md5: 49023d73832ef61042f6a237cb2687e7 license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 license_family: Other + run_exports: {} size: 1620504 timestamp: 1727511233259 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 @@ -2127,6 +2218,7 @@ packages: - fonts-conda-forge license: BSD-3-Clause license_family: BSD + run_exports: {} size: 3667 timestamp: 1566974674465 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda @@ -2139,6 +2231,7 @@ packages: - font-ttf-source-code-pro license: BSD-3-Clause license_family: BSD + run_exports: {} size: 4059 timestamp: 1762351264405 - conda: https://conda.anaconda.org/conda-forge/noarch/future-1.0.0-pyhd8ed1ab_2.conda @@ -2148,6 +2241,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 364561 timestamp: 1738926525117 - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda @@ -2158,6 +2252,7 @@ packages: - smmap >=3.0.1,<6 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 53136 timestamp: 1735887290843 - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.50-pyhd8ed1ab_0.conda @@ -2169,6 +2264,7 @@ packages: - typing_extensions >=3.10.0.2 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 162193 timestamp: 1778065820061 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2181,17 +2277,19 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 95967 timestamp: 1756364871835 - - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - sha256: 6ad78a180576c706aabeb5b4c8ceb97c0cb25f1e112d76495bff23e3779948ba - md5: 0a802cb9888dd14eeefc611f05c40b6e + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 + md5: b395909221b9bd1df066e5930e18855b depends: - - python >=3.9 + - python >=3.10 license: MIT license_family: MIT - size: 30731 - timestamp: 1737618390337 + run_exports: {} + size: 32884 + timestamp: 1782283986153 - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda sha256: fa2071da7fab758c669e78227e6094f6b3608228740808a6de5d6bce83d9e52d md5: 7fe569c10905402ed47024fc481bb371 @@ -2200,6 +2298,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 73563 timestamp: 1733928021866 - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda @@ -2209,38 +2308,42 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} 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.18-pyhcf101f3_0.conda + sha256: c75632ea624aa450a394f570749420c5a2e0997d0216bc29d5d45b0f39df0426 + md5: 577b04680ae422adb86fc60d7b940659 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 + run_exports: {} + size: 163869 + timestamp: 1781620148226 + - 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 - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.8.0-h8f7a5dd_0.conda - sha256: 09f2b26f8c727fd2138fd4846b91708c32d5684120b59d5c8d38472c0eefbf33 - md5: 12e7a110add59a05b337484568a83a4d - depends: - - importlib-metadata ==8.8.0 pyhcf101f3_0 + run_exports: {} + size: 34766 + timestamp: 1779714582554 + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-9.0.0-h71f4f89_0.conda + sha256: d0df65ba03cde5965a3c333647033a9aba27fcfccd4cdcf57fa7032ae3cf76f4 + md5: 9951d62277b9c8a33afd7a23216ad728 + depends: + - importlib-metadata ==9.0.0 pyhcf101f3_0 license: Apache-2.0 license_family: APACHE - size: 21425 - timestamp: 1773931568510 + run_exports: {} + size: 21465 + timestamp: 1779714582554 - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda sha256: 1684b7b16eec08efef5302ce298c606b163c18272b69a62b666fbaa61516f170 md5: 7ac5f795c15f288984e32add616cdc59 @@ -2248,6 +2351,7 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 19180 timestamp: 1733308353037 - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda @@ -2259,6 +2363,7 @@ packages: - python license: BSD-3-Clause license_family: BSD + run_exports: {} size: 120685 timestamp: 1764517220861 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda @@ -2273,6 +2378,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 82356 timestamp: 1767839954256 - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda @@ -2284,6 +2390,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 19236 timestamp: 1757335715225 - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda @@ -2294,6 +2401,7 @@ packages: - uc-micro-py license: MIT license_family: MIT + run_exports: {} size: 26062 timestamp: 1772476821244 - conda: https://conda.anaconda.org/conda-forge/noarch/logmuse-0.3.0-pyhcf101f3_0.conda @@ -2304,6 +2412,7 @@ packages: - python license: BSD-2-Clause license_family: BSD + run_exports: {} size: 16027 timestamp: 1773520433396 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda @@ -2315,6 +2424,7 @@ packages: - python license: BSD-3-Clause license_family: BSD + run_exports: {} size: 85893 timestamp: 1770694658918 - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.2.0-pyhd8ed1ab_0.conda @@ -2325,6 +2435,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 69017 timestamp: 1778169663339 - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_1.conda @@ -2338,18 +2449,20 @@ packages: - markupsafe_no_compile license: BSD-3-Clause license_family: BSD + run_exports: {} size: 15917 timestamp: 1772445082000 - - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.0-pyhd8ed1ab_0.conda - sha256: 443e7f8ae88f71b3e7fd9c3d19d3816fb1965e2352d5e01a6bfdf2eccfcf4795 - md5: 9a704e945e87078f464726c69071677a + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + sha256: 49db23cbfb1c1d414a14d7540195208b994ebd747beba0f15c903f3a0a2dc446 + md5: ad6821df7a98510117db06e9a833281f depends: - markdown-it-py >=2.0.0,<5.0.0 - python >=3.10 license: MIT license_family: MIT - size: 50607 - timestamp: 1778171019802 + run_exports: {} + size: 50460 + timestamp: 1778692223625 - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 md5: 592132998493b3ff25fd7479396e8351 @@ -2357,6 +2470,7 @@ packages: - python >=3.9 license: MIT license_family: MIT + run_exports: {} size: 14465 timestamp: 1733255681319 - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda @@ -2367,6 +2481,7 @@ packages: - python license: Apache-2.0 license_family: APACHE + run_exports: {} size: 91574 timestamp: 1777103621679 - conda: https://conda.anaconda.org/conda-forge/noarch/pdiff-1.1.5-pyhd8ed1ab_0.conda @@ -2377,6 +2492,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 13977 timestamp: 1777912618432 - conda: https://conda.anaconda.org/conda-forge/noarch/pephubclient-0.4.4-pyhd8ed1ab_1.conda @@ -2393,6 +2509,7 @@ packages: - ubiquerg >=0.6.3 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 22295 timestamp: 1735078284059 - conda: https://conda.anaconda.org/conda-forge/noarch/peppy-0.40.8-pyhd8ed1ab_0.conda @@ -2408,6 +2525,7 @@ packages: - ubiquerg >=0.5.2 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 30161 timestamp: 1760990724770 - conda: https://conda.anaconda.org/conda-forge/noarch/pipestat-0.13.1-pyhd8ed1ab_0.conda @@ -2426,18 +2544,20 @@ packages: - yacman >=0.9.3 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 83078 timestamp: 1773671269002 - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5 - md5: 89c0b6d1793601a2a3a3f7d2d3d8b937 + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d + md5: 2c5ef45db85d34799771629bd5860fd7 depends: - python >=3.10 - python license: MIT license_family: MIT - size: 25862 - timestamp: 1775741140609 + run_exports: {} + size: 26308 + timestamp: 1779972894916 - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae md5: edb16f14d920fb3faf17f5ce582942d6 @@ -2448,6 +2568,7 @@ packages: - prompt_toolkit 3.0.52 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 273927 timestamp: 1756321848365 - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda @@ -2457,18 +2578,20 @@ packages: - prompt-toolkit >=3.0.52,<3.0.53.0a0 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 7212 timestamp: 1756321849562 - - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 - md5: 12c566707c80111f9799308d9e265aef + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 + md5: 9c5491066224083c41b6d5635ed7107b depends: - - python >=3.9 + - python >=3.10 - python license: BSD-3-Clause license_family: BSD - size: 110100 - timestamp: 1733195786147 + run_exports: {} + size: 55886 + timestamp: 1779293633166 - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.4-pyhcf101f3_0.conda sha256: 69700e31165df070e9716315e042196aa92525dae5deb5107785847ab9f4189f md5: 729843edafc0899b3348bd3f19525b9d @@ -2481,6 +2604,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 346511 timestamp: 1778103405862 - conda: https://conda.anaconda.org/conda-forge/noarch/pygithub-2.9.1-pyhd8ed1ab_0.conda @@ -2498,6 +2622,7 @@ packages: - urllib3 >=1.26.0 license: LGPL-3.0-only license_family: LGPL + run_exports: {} size: 183676 timestamp: 1776161501345 - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda @@ -2507,11 +2632,12 @@ packages: - python >=3.10 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 893031 timestamp: 1774796815820 - - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.12.1-pyhcf101f3_0.conda - sha256: 4279ee4cf2533fd17910ae7373159d9bee2492d8c50932ddc74dd27a70b15de4 - md5: b27a9f4eca2925036e43542488d3a804 + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda + sha256: 58cda7489477fecb859ec95bf73cba7e4634db1a517e29e0d3086d7ec71733ae + md5: edb808d7f7396478ab6e457e697b8ec5 depends: - python >=3.10 - typing_extensions >=4.0 @@ -2520,8 +2646,9 @@ packages: - cryptography >=3.4.0 license: MIT license_family: MIT - size: 32247 - timestamp: 1773482160904 + run_exports: {} + size: 33417 + timestamp: 1779400286454 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -2530,6 +2657,7 @@ packages: - python >=3.9 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 21085 timestamp: 1733217331982 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda @@ -2541,6 +2669,7 @@ packages: - python license: Apache-2.0 license_family: APACHE + run_exports: {} size: 233310 timestamp: 1751104122689 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda @@ -2551,6 +2680,7 @@ packages: - python 3.14.* *_cp314 license: BSD-3-Clause license_family: BSD + run_exports: {} size: 6989 timestamp: 1752805904792 - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314t.conda @@ -2561,6 +2691,7 @@ packages: - python 3.14.* *_cp314t license: BSD-3-Clause license_family: BSD + run_exports: {} size: 7020 timestamp: 1752805919426 - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_1.conda @@ -2573,6 +2704,7 @@ packages: - pyyaml_no_compile license: MIT license_family: MIT + run_exports: {} size: 45525 timestamp: 1770223374054 - conda: https://conda.anaconda.org/conda-forge/noarch/questionary-2.1.1-pyhd8ed1ab_0.conda @@ -2583,6 +2715,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 31257 timestamp: 1757356458097 - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -2596,6 +2729,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 51788 timestamp: 1760379115194 - conda: https://conda.anaconda.org/conda-forge/noarch/repo2rocrate-0.1.2-pyhd8ed1ab_0.conda @@ -2608,11 +2742,12 @@ packages: - rocrate license: Apache-2.0 license_family: APACHE + run_exports: {} size: 18507 timestamp: 1736445548331 - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.0-pyhcf101f3_0.conda - sha256: 4487fdb341537e2df47159ed8e546add99080974c52d5b2dc2a710910619115a - md5: a5985537dab1ba7034b5ff4ea22e2fa9 + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da + md5: 4a85203c1d80c1059086ae860836ffb9 depends: - python >=3.10 - certifi >=2023.5.7 @@ -2624,26 +2759,9 @@ packages: - chardet >=3.0.2,<8 license: Apache-2.0 license_family: APACHE - size: 68658 - timestamp: 1778534036810 - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-0.9.6-pyhd8ed1ab_0.tar.bz2 - sha256: 79f3315cf5aa7a925189fb8143989f68f4ae60408bafc314f7248aa63f39dcac - md5: 276b447a966e8f3d3daecb3c5a156330 - depends: - - appdirs >=1.4.4 - - attrs >=21.2 - - cattrs >=1.8.1 - - exceptiongroup - - itsdangerous >=2.0 - - python >=3.7 - - pyyaml >=5.4 - - requests >=2.22 - - url-normalize >=1.4 - - urllib3 >=1.25.5 - license: BSD-2-Clause - license_family: BSD - size: 37360 - timestamp: 1661377930909 + run_exports: {} + size: 68709 + timestamp: 1778851103479 - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.3.2-pyhd8ed1ab_0.conda sha256: 38d756255053c286a857545ea1343e3b370f04972a170073ee67b52b627e1517 md5: 2b25a90124b8bbc7d01474dafecc815e @@ -2660,6 +2778,7 @@ packages: - urllib3 >=1.25.5 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 56374 timestamp: 1778484376846 - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda @@ -2673,11 +2792,12 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 208577 timestamp: 1775991661559 - - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.7-pyh8f84b5b_0.conda - sha256: aa3fcb167321bae51998de2e94d199109c9024f25a5a063cb1c28d8f1af33436 - md5: 0c20a8ebcddb24a45da89d5e917e6cb9 + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-click-1.9.8-pyh8f84b5b_0.conda + sha256: 771b335400554d812dcdf7e40e54e47247db1f96ca0ab4413d061e6960844d9c + md5: 3251fe7203751993d1ee7ecb492b4a42 depends: - python >=3.10 - rich >=12 @@ -2687,8 +2807,9 @@ packages: - python license: MIT license_family: MIT - size: 64356 - timestamp: 1769850479089 + run_exports: {} + size: 64412 + timestamp: 1780016631584 - conda: https://conda.anaconda.org/conda-forge/noarch/rocrate-0.15.0-pyhd8ed1ab_0.conda sha256: 8075692267266509ae972eace551c935d5173cbe48fc8a590059a5a3b4367a29 md5: 636f26c33cc0c3237d6b981e907fdbd4 @@ -2701,6 +2822,7 @@ packages: - requests license: Apache-2.0 license_family: APACHE + run_exports: {} size: 221916 timestamp: 1776076248301 - conda: https://conda.anaconda.org/conda-forge/noarch/ruamel.yaml-0.19.1-pyhcf101f3_0.conda @@ -2712,6 +2834,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 98448 timestamp: 1767538149184 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda @@ -2721,6 +2844,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 639697 timestamp: 1773074868565 - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_2.conda @@ -2730,6 +2854,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 15018 timestamp: 1762858315311 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda @@ -2740,17 +2865,20 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 18455 timestamp: 1753199211006 - - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhd8ed1ab_0.conda - sha256: ae723ba6ab7b1998a04ef16b357c1e0043ffd4f4ac9b0da71e393680343a3c86 - md5: 69db183edbe5b7c3e6c157980057a9d0 + - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.3-pyhcf101f3_1.conda + sha256: bc86861086db65c9b56dd6a1605755f41a9875b94fc3b69e137f686700d91aa1 + md5: b899f1195be56d8215ed1973a8f409c3 depends: - - python >=3.9 + - python >=3.10 + - python license: BSD-3-Clause license_family: BSD - size: 27064 - timestamp: 1775587040128 + run_exports: {} + size: 27262 + timestamp: 1781021238494 - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda sha256: 3f661e98a09f976775a494488beb3d35ebb00f535b169c6bd891f2e280d55783 md5: 3b887b7b3468b0f494b4fad40178b043 @@ -2759,6 +2887,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 43964 timestamp: 1772732795746 - conda: https://conda.anaconda.org/conda-forge/noarch/textual-6.2.1-pyhd8ed1ab_0.conda @@ -2779,6 +2908,7 @@ packages: - tree_sitter >=0.25.0 license: MIT license_family: MIT + run_exports: {} size: 490468 timestamp: 1759389548633 - conda: https://conda.anaconda.org/conda-forge/noarch/trogon-0.6.0-pyhd8ed1ab_1.conda @@ -2790,22 +2920,23 @@ packages: - textual >=0.26.0 license: MIT license_family: MIT + run_exports: {} size: 27639 timestamp: 1735343757712 - - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.25.1-pyhcf101f3_0.conda - sha256: 18fc3a27bc995318d09142fe16d01ea454e76f377bf8f68db03b8b18f11085ed - md5: ef114c2eb2ff19f6bf616c81f4710841 + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.26.7-pyhcf101f3_0.conda + sha256: 15dce0fa9d2a5077755c0ae98b3b521a9409b9468a0597ce697940fb035e5b67 + md5: 71d2c80673511fab927bd15592994030 depends: - annotated-doc >=0.0.2 - - click >=8.2.1 + - colorama - python >=3.10 - rich >=13.8.0 - shellingham >=1.3.0 - python - license: MIT - license_family: MIT - size: 118013 - timestamp: 1777583624586 + license: MIT AND BSD-3-Clause + run_exports: {} + size: 185949 + timestamp: 1780494828822 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda sha256: 7c2df5721c742c2a47b2c8f960e718c930031663ac1174da67c1ed5999f7938c md5: edd329d7d3a4ab45dcf905899a7a6115 @@ -2813,6 +2944,7 @@ packages: - typing_extensions ==4.15.0 pyhcf101f3_0 license: PSF-2.0 license_family: PSF + run_exports: {} size: 91383 timestamp: 1756220668932 - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhcf101f3_2.conda @@ -2824,6 +2956,7 @@ packages: - python license: MIT license_family: MIT + run_exports: {} size: 20935 timestamp: 1777105465795 - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -2834,12 +2967,14 @@ packages: - python license: PSF-2.0 license_family: PSF + run_exports: {} size: 51692 timestamp: 1756220668932 - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c md5: ad659d0a2b3e47e38d829aa8cad2d610 license: LicenseRef-Public-Domain + run_exports: {} size: 119135 timestamp: 1767016325805 - conda: https://conda.anaconda.org/conda-forge/noarch/ubiquerg-0.9.3-pyhd8ed1ab_0.conda @@ -2849,6 +2984,7 @@ packages: - python >=3.10 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 23293 timestamp: 1775148942723 - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda @@ -2858,6 +2994,7 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 13378 timestamp: 1772479008776 - conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda @@ -2869,6 +3006,7 @@ packages: - six license: MIT license_family: MIT + run_exports: {} size: 20754 timestamp: 1777117020600 - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda @@ -2882,17 +3020,19 @@ packages: - python >=3.10 license: MIT license_family: MIT + run_exports: {} size: 103560 timestamp: 1778188657149 - - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.7.0-pyhd8ed1ab_0.conda - sha256: 1ee2d8384972ecbf8630ce8a3ea9d16858358ad3e8566675295e66996d5352da - md5: eb9538b8e55069434a18547f43b96059 + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.1-pyhd8ed1ab_0.conda + sha256: 5ddde23d65aecde7e8dac0b9d9c7821ead2b87a320d787f9e4288c0ee00fa332 + md5: 19c961dd9cab6c3e13cd195f0176dbfa depends: - python >=3.10 license: MIT license_family: MIT - size: 82917 - timestamp: 1777744489106 + run_exports: {} + size: 133769 + timestamp: 1780932915297 - conda: https://conda.anaconda.org/conda-forge/noarch/yacman-1.0.0-pyhd8ed1ab_0.conda sha256: 2ce287f7f8057b7d39c578dc7de2679ce4e5682aacbcec90ebeb30caed4d86bb md5: 99bef439b58e5f7f0a9c27d2626beaa3 @@ -2902,128 +3042,148 @@ packages: - ubiquerg >=0.9.1 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 20698 timestamp: 1772804176236 - - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.1-pyhcf101f3_0.conda - sha256: 523616c0530d305d2216c2b4a8dfd3872628b60083255b89c5e0d8c42e738cca - md5: e1c36c6121a7c9c76f2f148f1e83b983 + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 depends: - python >=3.10 - python license: MIT license_family: MIT - size: 24461 - timestamp: 1776131454755 - - conda: https://conda.anaconda.org/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda + run_exports: {} + size: 24190 + timestamp: 1779159948016 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda build_number: 7 - sha256: 30006902a9274de8abdad5a9f02ef7c8bb3d69a503486af0c1faee30b023e5b7 - md5: eaac87c21aff3ed21ad9656697bb8326 + sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd + md5: a44032f282e7d2acdeb1c240308052dd depends: - llvm-openmp >=9.0.1 license: BSD-3-Clause license_family: BSD - size: 8328 - timestamp: 1764092562779 - - conda: https://conda.anaconda.org/conda-forge/osx-64/biopython-1.87-py314h58bf454_0.conda - sha256: a850cec6572f1a599cd52d744de323d98e1468aca6800b630e7d315d39f1573f - md5: 36fe32cd8eca9b92f7e3e23290114676 + run_exports: + weak: + - _openmp_mutex >=4.5 + size: 8325 + timestamp: 1764092507920 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/biopython-1.87-py314ha0ac461_0.conda + sha256: 941fddec1ec5d3bf2358e34c160be06c55b489ac0d9cc2c28c4b1df1b2c7c6e9 + md5: 1a4f598aa6805b9f7b1f9473a0009640 depends: - __osx >=11.0 - numpy - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314t - python_abi 3.14.* *_cp314t license: LicenseRef-Biopython - size: 3334478 - timestamp: 1774882735731 - - conda: https://conda.anaconda.org/conda-forge/osx-64/brotli-python-1.2.0-py314h6b56c8e_1.conda - sha256: 385ca8afdc11d2c86a3466121b25822928df465a93a3a7eb14a1eaa245896191 - md5: b9a734389095441a34522a72f93adf23 + run_exports: {} + size: 3346334 + timestamp: 1774882673087 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h5133025_1.conda + sha256: 7cfb801483bc18cac96f92bbdefbde0ab383af2e0fb9aa34ecb392477655b3bd + md5: 64416e9cae65905f5b415d21cecb0f6d depends: - - __osx >=10.13 + - __osx >=11.0 - libcxx >=19 - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314t - python_abi 3.14.* *_cp314t constrains: - - libbrotlicommon 1.2.0 h8616949_1 + - libbrotlicommon 1.2.0 hc919400_1 license: MIT license_family: MIT - size: 389735 - timestamp: 1764017912272 - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - sha256: 9f242f13537ef1ce195f93f0cc162965d6cc79da578568d6d8e50f70dd025c42 - md5: 4173ac3b19ec0a4f400b4f782910368b + run_exports: {} + size: 2037981 + timestamp: 1764018267458 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 depends: - - __osx >=10.13 + - __osx >=11.0 license: bzip2-1.0.6 license_family: BSD - size: 133427 - timestamp: 1771350680709 - - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - sha256: 2f5bc0292d595399df0d168355b4e9820affc8036792d6984bd751fdda2bcaea - md5: fc9a153c57c9f070bebaa7eef30a8f17 + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 124834 + timestamp: 1771350416561 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 depends: - - __osx >=10.13 + - __osx >=11.0 license: MIT license_family: MIT - size: 186122 - timestamp: 1765215100384 - - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py314h39a9432_1.conda - sha256: 212151021ff784e11d575cf864badfab8de28f436855256e16204cf4230893a4 - md5: 200c674134cf05fec80ac5aa78773b12 + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 + size: 180327 + timestamp: 1765215064054 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314hbcd5915_1.conda + sha256: f0e1eee915a0249aeea68a3fa1f609f066591825a17cb2494cc92fc5d28781b0 + md5: 1f6ebee7dc7399a0c8d11e391b8b4aa3 depends: - - __osx >=10.13 + - __osx >=11.0 - libffi >=3.5.2,<3.6.0a0 - pycparser - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314t - python_abi 3.14.* *_cp314t license: MIT license_family: MIT - size: 297365 - timestamp: 1761203527430 - - conda: https://conda.anaconda.org/conda-forge/osx-64/coreutils-9.5-h10d778d_0.conda - sha256: 7a29ae82cf1c455b4956c8311ae97832460c3585f0d8789fd82161dd2a20d1fd - md5: 8332c7ae324c9fc4b22cc3d84a0582e8 + run_exports: {} + size: 2113880 + timestamp: 1761203527956 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coreutils-9.5-h93a5062_0.conda + sha256: 70e50f2f1458e7c172c9b1c149a4289e8eecc9b53e06ab9de0b3572cdbd30a61 + md5: 75840e25e62a109b1d25043c63a4f36c license: GPL-3.0-or-later license_family: GPL - size: 1374585 - timestamp: 1711655512907 - - conda: https://conda.anaconda.org/conda-forge/osx-64/cryptography-48.0.0-py314hc7f1c69_0.conda - sha256: 958124138a33edb00e33954b58738b048838c47ede8b2f853e93e947772c0677 - md5: 307de4634b1a17d3357ab2b319a5835b + run_exports: {} + size: 1478098 + timestamp: 1711655465375 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-49.0.0-py314hb5a3885_0.conda + sha256: 148e905fee9ed7a8e9cdd99c509bc5c690219cb18e5e17ac86515ac23ebe131c + md5: 793e04c3e1dbef9228a0ed7ee6e8a1bf depends: - __osx >=11.0 - cffi >=2.0 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.7,<4.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314t constrains: - - __osx >=10.13 + - __osx >=11.0 license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD - size: 1865911 - timestamp: 1777966589454 - - conda: https://conda.anaconda.org/conda-forge/osx-64/curl-8.20.0-h8f0b9e4_0.conda - sha256: caba0869bb0d18de3ce8eeda0ae4a0b988ff907faa9b5d94aea38d703d09413d - md5: af6b1246193c8db5da3c91594336293b + run_exports: {} + size: 1872304 + timestamp: 1781385456835 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.21.0-hd5a2499_0.conda + sha256: 4b21badc0cbb8413bfe5d4f2d4d7c925978b41b6c96b40d61622273ea1caba3f + md5: 698b465be69a987c1d0f2fc969d7c986 depends: - __osx >=11.0 - krb5 >=1.22.2,<1.23.0a0 - - libcurl 8.20.0 h8f0b9e4_0 + - libcurl 8.21.0 hd5a2499_0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.7,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT - size: 182564 - timestamp: 1777462268628 - - conda: https://conda.anaconda.org/conda-forge/osx-64/git-2.54.0-pl5321hc696ea9_0.conda - sha256: 8d3eb412c41d87d5676b96b648a12b2857362530ccf37826b8594232157cb55a - md5: d7b76a5fcb831b2a881837786a22944e + run_exports: {} + size: 180690 + timestamp: 1782297913759 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.54.0-pl5321hc9deb11_1.conda + sha256: 19c17176cc5b8b4744507a1f667c68b848c726408d9b06b3d3f5e34ac3d85133 + md5: 806c2eb350d47d227593d8509b1ff4f3 depends: - __osx >=11.0 - libcurl >=8.20.0,<9.0a0 - - libexpat >=2.8.0,<3.0a0 + - libexpat >=2.8.1,<3.0a0 - libiconv >=1.18,<2.0a0 - libintl >=0.25.1,<1.0a0 - libzlib >=1.3.2,<2.0a0 @@ -3031,1082 +3191,301 @@ packages: - pcre2 >=10.47,<10.48.0a0 - perl 5.* license: GPL-2.0-or-later and LGPL-2.1-or-later - size: 12971173 - timestamp: 1778073286798 - - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.3-h25d91c4_0.conda - sha256: 1294117122d55246bb83ad5b589e2a031aacdf2d0b1f99fd338aa4394f881735 - md5: 627eca44e62e2b665eeec57a984a7f00 + run_exports: {} + size: 12936868 + timestamp: 1780737820572 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 + md5: f1182c91c0de31a7abd40cedf6a5ebef depends: - __osx >=11.0 license: MIT license_family: MIT - size: 12273764 - timestamp: 1773822733780 - - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - sha256: df009385e8262c234c0dae9016540b86dad3d299f0d9366d08e327e8e7731634 - md5: e66e2c52d2fdddcf314ad750fb4ebb4a + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 12361647 + timestamp: 1773822915649 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + sha256: c740e4a2e7247776a9883158fdab50ae0732c8f67f96d8f1db8ad9da5e0b5222 + md5: 8780f41b013d19219faef9c82260744b depends: - - __osx >=10.13 + - __osx >=11.0 - libcxx >=19 - libedit >=3.1.20250104,<3.2.0a0 - libedit >=3.1.20250104,<4.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.7,<4.0a0 license: MIT license_family: MIT - size: 1193620 - timestamp: 1769770267475 - - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.19.1-h5ea7634_0.conda - sha256: af14a2021a151b3bd98e5b40db0762b35ff54e57fa8c1968cca728cef8d13a8a - md5: 3ae3b6db0dcada986f1e3b608e1cb0fc + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1159780 + timestamp: 1781859501654 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda + sha256: ccb5598fad3694e79bf54f0eb812e3b3c3dd63d1497e631f5978800eadb9bcc4 + md5: d2f2c7c10e2957647d45589b7701a453 depends: - __osx >=11.0 - libjpeg-turbo >=3.1.4.1,<4.0a0 - libtiff >=4.7.1,<4.8.0a0 license: MIT license_family: MIT - size: 229186 - timestamp: 1778079697832 - - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.1.0-h35c7297_0.conda - sha256: f918716c71c8bebbc0c40e1050878aa512fea92c1d17c363ca35650bc60f6c35 - md5: d2fe7e177d1c97c985140bd54e2a5e33 + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 213747 + timestamp: 1780212240694 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + sha256: 66e5ffd301a44da696f3efc2f25d6d94f42a9adc0db06c44ad753ab844148c51 + md5: 095e5749868adab9cae42d4b460e5443 depends: - __osx >=11.0 - libcxx >=19 license: Apache-2.0 license_family: Apache - size: 215089 - timestamp: 1773114468701 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-7_he492b99_openblas.conda - build_number: 7 - sha256: b2fe36d35c7b60e5f63cb0c865f4b3e40839120c47fd0cd56fd633765b25c148 - md5: 9033f3879f6a191d759d7fde5914555f + run_exports: + weak: + - lerc >=4.1.0,<5.0a0 + size: 164222 + timestamp: 1773114244984 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda + build_number: 8 + sha256: 8f5ec18ead0619a9cf0f38b49796c22f6fc0f44850c0df2baea0f5277db16e75 + md5: dbfe729181a32741ae63ecb41eefbac6 depends: - libopenblas >=0.3.33,<0.3.34.0a0 - libopenblas >=0.3.33,<1.0a0 constrains: + - blas 2.308 openblas + - liblapack 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas + - libcblas 3.11.0 8*_openblas - mkl <2027 - - liblapacke 3.11.0 7*_openblas - - libcblas 3.11.0 7*_openblas - - liblapack 3.11.0 7*_openblas - - blas 2.307 openblas license: BSD-3-Clause license_family: BSD - size: 18868 - timestamp: 1778491111970 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-7_h9b27e0a_openblas.conda - build_number: 7 - sha256: 91b5abb146f7de3f95fda287c6a314a8ca3ceb2ae597a4bf5a180b6e0790b180 - md5: ebd8b6277cef635b7ae80400eda886e5 + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 18949 + timestamp: 1779859141315 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda + build_number: 8 + sha256: f93efcd44bc24f97c2478c7474d3baa6801a057974f330e1d06bedc33e4c778f + md5: 03a2ef3491da9e5b4d18c03e9f4b3109 depends: - - libblas 3.11.0 7_he492b99_openblas + - libblas 3.11.0 8_h51639a9_openblas constrains: - - liblapacke 3.11.0 7*_openblas - - liblapack 3.11.0 7*_openblas - - blas 2.307 openblas + - blas 2.308 openblas + - liblapack 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas license: BSD-3-Clause license_family: BSD - size: 18868 - timestamp: 1778491135869 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.20.0-h8f0b9e4_0.conda - sha256: 5d3d8a82ca43347e96f1d79048921f3a7c25e32514bc7feb53ed2a040dcca54d - md5: 4a0085ccf90dc514f0fc0909a874045e + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 18911 + timestamp: 1779859147634 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-hd5a2499_0.conda + sha256: 5f73f41b3504c9d41a60aa161f6c87c36f19f97c92b3510441db618e361dc946 + md5: 862eb5c81e1295f492fa261a68a4233f depends: - __osx >=11.0 - krb5 >=1.22.2,<1.23.0a0 - libnghttp2 >=1.68.1,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 + - openssl >=3.5.7,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT - size: 419676 - timestamp: 1777462238769 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.5-h19cb2f5_1.conda - sha256: 8f3d495df4427d9285ae25a51d32123ca251c32abebcef020fddb8ac1f200894 - md5: 56fa8b3e43d26c97da88aea4e958f616 + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 410874 + timestamp: 1782297872451 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef + md5: 89f76a2a21a3ec3ec983b5eb237c4113 depends: - __osx >=11.0 license: Apache-2.0 WITH LLVM-exception license_family: Apache - size: 567420 - timestamp: 1778192020253 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - sha256: 025f8b1e85dd8254e0ca65f011919fb1753070eb507f03bca317871a884d24de - md5: 31aa65919a729dc48180893f62c25221 + run_exports: {} + size: 569349 + timestamp: 1781670209146 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c depends: - - __osx >=10.13 + - __osx >=11.0 license: MIT license_family: MIT - size: 70840 - timestamp: 1761980008502 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda - sha256: 6cc49785940a99e6a6b8c6edbb15f44c2dd6c789d9c283e5ee7bdfedd50b4cd6 - md5: 1f4ed31220402fcddc083b4bff406868 + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 55420 + timestamp: 1761980066242 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b depends: - ncurses - - __osx >=10.13 + - __osx >=11.0 - ncurses >=6.5,<7.0a0 license: BSD-2-Clause license_family: BSD - size: 115563 - timestamp: 1738479554273 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 - md5: 899db79329439820b7e8f8de41bca902 + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 107691 + timestamp: 1738479560845 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 license: BSD-2-Clause license_family: BSD - size: 106663 - timestamp: 1702146352558 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.0-hcc62823_0.conda - sha256: 5ebcc413d0a75da926a8b9b681d7d12c9562993991ba49c90a9881c4a59bdc11 - md5: d2e01f78c1daaeb4d2aa870125ebcd7e + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 107458 + timestamp: 1702146414478 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f + md5: a915151d5d3c5bf039f5ccc8402a436f depends: - __osx >=11.0 constrains: - - expat 2.8.0.* + - expat 2.8.1.* license: MIT license_family: MIT - size: 75242 - timestamp: 1777846416221 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6 - md5: 66a0dc7464927d0853b590b6f53ba3ea + run_exports: {} + size: 69362 + timestamp: 1781203631990 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 depends: - - __osx >=10.13 + - __osx >=11.0 license: MIT license_family: MIT - size: 53583 - timestamp: 1769456300951 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.3-h694c41f_0.conda - sha256: b5daa4cee3beb98a0317e81a20aa507b9f897a9e21b11fe0b2e32852e372f746 - md5: 63b822fcf984c891f0afab2eedfcfaf4 + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 + size: 40979 + timestamp: 1769456747661 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_1.conda + sha256: d5637b01941c0fc8f5cbb1f170c238f4ee153b3c1708b9d50f4f1305438ff051 + md5: 0582e67cd14cfed773be2f3b1aba08e0 depends: - libfreetype6 >=2.14.3 license: GPL-2.0-only OR FTL - size: 8088 - timestamp: 1774298785964 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.3-h58fbd8d_0.conda - sha256: 9d34b5b2be6ebdd3bcd9e21d6598d493afce4d3fcd2d419f3356022cb4d746fd - md5: 27515b8ab8bf4abd8d3d90cf11212411 + run_exports: {} + size: 8365 + timestamp: 1780933612390 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_1.conda + sha256: abbfffd8a8c776bb8b59a10c8247fc3aa6b17ba0051e9f6d199dca38479f214f + md5: a0bb0678f67c464938d3693fa96f6884 depends: - __osx >=11.0 - - libpng >=1.6.55,<1.7.0a0 + - libpng >=1.6.58,<1.7.0a0 - libzlib >=1.3.2,<2.0a0 constrains: - freetype >=2.14.3 license: GPL-2.0-only OR FTL - size: 364828 - timestamp: 1774298783922 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda - sha256: 17a5dcd818f89173db51d7d1acd77615cb77db7b4c2b5f571d4dafe559430ab5 - md5: 4bf33d5ca73f4b89d3495285a42414a4 + run_exports: {} + size: 338442 + timestamp: 1780933611662 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + sha256: 06644fa4d34d57c9e48f4d84b1256f9e5f654fdb37f43acc8a58a396952d42b7 + md5: 644058123986582db33aebd4ae2ca184 depends: - _openmp_mutex constrains: - - libgomp 15.2.0 19 - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 424164 - timestamp: 1778271183296 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda - sha256: 519045363b87b870be779d38f0bfd325d4b787acdaa0a2136a92c1081eff5112 - md5: d362f41203d0a1d2d4940446f95374c9 + run_exports: {} + size: 404080 + timestamp: 1778273064154 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + sha256: d4837b3b9b30af3132d260225e91ab9dde83be04c59513f500cc81050fb37486 + md5: 1ea03f87cdb1078fbc0e2b2deb63752c depends: - - libgfortran5 15.2.0 hd16e46c_19 + - libgfortran5 15.2.0 hdae7583_19 constrains: - libgfortran-ng ==15.2.0=*_19 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 139925 - timestamp: 1778271458366 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda - sha256: c7f5f6e80357d6d5bc69588c16144205b0c79cf32cd090ccb5afef9d557632af - md5: 1cddb3f7e54f5871297afc0fafa61c2c + run_exports: {} + size: 139675 + timestamp: 1778273280875 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + sha256: d0a68b7a121d115b80c169e24d1265dcc25a3fe58d107df1bbc430797e226d88 + md5: ba36d8c606a6a53fe0b8c12d47267b3d depends: - libgcc >=15.2.0 constrains: - libgfortran 15.2.0 license: GPL-3.0-only WITH GCC-exception-3.1 license_family: GPL - size: 1063687 - timestamp: 1778271196574 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 - md5: 210a85a1119f97ea7887188d176db135 + run_exports: {} + size: 599691 + timestamp: 1778273075448 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 depends: - - __osx >=10.13 + - __osx >=11.0 license: LGPL-2.1-only - size: 737846 - timestamp: 1754908900138 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libintl-0.25.1-h3184127_1.conda - sha256: 8c352744517bc62d24539d1ecc813b9fdc8a785c780197c5f0b84ec5b0dfe122 - md5: a8e54eefc65645193c46e8b180f62d22 + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 750379 + timestamp: 1754909073836 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c depends: - - __osx >=10.13 + - __osx >=11.0 - libiconv >=1.18,<2.0a0 license: LGPL-2.1-or-later - size: 96909 - timestamp: 1753343977382 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.4.1-ha1e9b39_0.conda - sha256: 6b809d8acb6b97bbb1a858eb4ba7b7163c67257b6c3f199dd9d1e0751f4c5b18 - md5: 57cc1464d457d01ac78f5860b9ca1714 + run_exports: + weak: + - libintl >=0.25.1,<1.0a0 + size: 90957 + timestamp: 1751558394144 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda + sha256: 17e035ae6a520ff6a6bb5dd93a4a7c3895891f4f9743bcb8c6ef607445a31cd0 + md5: b8a7544c83a67258b0e8592ec6a5d322 depends: - __osx >=11.0 constrains: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib - size: 587997 - timestamp: 1775963139212 - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-7_h859234e_openblas.conda - build_number: 7 - sha256: 92fe5e99c1a4dbb53268790ce0b738411f21e0d7ca50dd3ce7a8781f1b03ed95 - md5: 3aa5c4d55000d922e71dee6daddc5031 + run_exports: + weak: + - libjpeg-turbo >=3.1.4.1,<4.0a0 + size: 555681 + timestamp: 1775962975624 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda + build_number: 8 + sha256: 8a076fe82142a00fe85f5a5a5351e286e8064f0100fe13608d19182cd0018c25 + md5: 85adeb3d469d082dbd9c8c39e36dec57 depends: - - libblas 3.11.0 7_he492b99_openblas + - libblas 3.11.0 8_h51639a9_openblas constrains: - - liblapacke 3.11.0 7*_openblas - - libcblas 3.11.0 7*_openblas - - blas 2.307 openblas + - libcblas 3.11.0 8*_openblas + - blas 2.308 openblas + - liblapacke 3.11.0 8*_openblas license: BSD-3-Clause license_family: BSD - size: 18862 - timestamp: 1778491179167 - - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - sha256: d9e2006051529aec5578c6efeb13bb6a7200a014b2d5a77a579e83a8049d5f3c - md5: becdfbfe7049fa248e52aa37a9df09e2 - depends: - - __osx >=11.0 - constrains: - - xz 5.8.3.* - license: 0BSD - size: 105724 - timestamp: 1775826029494 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-hf3981d6_1.conda - sha256: 1096c740109386607938ab9f09a7e9bca06d86770a284777586d6c378b8fb3fd - md5: ec88ba8a245855935b871a7324373105 - depends: - - __osx >=10.13 - license: BSD-2-Clause - license_family: BSD - size: 79899 - timestamp: 1769482558610 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda - sha256: 899551e16aac9dfb85bfc2fd98b655f4d1b7fea45720ec04ccb93d95b4d24798 - md5: dba4c95e2fe24adcae4b77ebf33559ae - depends: - - __osx >=11.0 - - c-ares >=1.34.6,<2.0a0 - - libcxx >=19 - - libev >=4.33,<4.34.0a0 - - libev >=4.33,<5.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT - size: 606749 - timestamp: 1773854765508 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda - sha256: 2c2ffe7c3ab7becd47ad308946873d2bdc219625af32a53d10efbaa54b595d31 - md5: 30666a6f0afe1471e999eca7ae5c8179 - depends: - - __osx >=11.0 - - libgfortran - - libgfortran5 >=14.3.0 - - llvm-openmp >=19.1.7 - constrains: - - openblas >=0.3.33,<0.3.34.0a0 - license: BSD-3-Clause - license_family: BSD - size: 6287889 - timestamp: 1776996499823 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.58-he930e7c_0.conda - sha256: a669b22978e546484d18d99a210801b1823360a266d7035c713d8d1facd035f7 - md5: 9744d43d5200f284260637304a069ddd - depends: - - __osx >=11.0 - - libzlib >=1.3.2,<2.0a0 - license: zlib-acknowledgement - size: 299206 - timestamp: 1776315286816 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_3.conda - sha256: 7dd254e844372fbf3a60a7c029df1ea0cb3fa0b18586cda769d9cd6cc0e59c4b - md5: c4b8a6c8a8aa6ed657a3c1c1eb6917e9 - depends: - - __osx >=10.13 - license: ISC - size: 291865 - timestamp: 1772479644707 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.53.1-h8f8c405_0.conda - sha256: 5e964e07a14180ce20decfd4897e8f81d48ec78c1cbf4af85c5520f535d9510c - md5: 9273c877f78b7486b0dfdd9268327a79 - depends: - - __osx >=11.0 - - icu >=78.3,<79.0a0 - - libzlib >=1.3.2,<2.0a0 - license: blessing - size: 1007171 - timestamp: 1777987093870 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - sha256: 00654ba9e5f73aa1f75c1f69db34a19029e970a4aeb0fa8615934d8e9c369c3c - md5: a6cb15db1c2dc4d3a5f6cf3772e09e81 - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.0,<4.0a0 - license: BSD-3-Clause - license_family: BSD - size: 284216 - timestamp: 1745608575796 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - sha256: e53424c34147301beae2cd9223ebf593720d94c038b3f03cacd0535e12c9668e - md5: 9d4344f94de4ab1330cdc41c40152ea6 - depends: - - __osx >=10.13 - - lerc >=4.0.0,<5.0a0 - - libcxx >=19 - - libdeflate >=1.25,<1.26.0a0 - - libjpeg-turbo >=3.1.0,<4.0a0 - - liblzma >=5.8.1,<6.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: HPND - size: 404591 - timestamp: 1762022511178 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - sha256: 00dbfe574b5d9b9b2b519acb07545380a6bc98d1f76a02695be4995d4ec91391 - md5: 7bb6608cf1f83578587297a158a6630b - depends: - - __osx >=10.13 - constrains: - - libwebp 1.6.0 - license: BSD-3-Clause - license_family: BSD - size: 365086 - timestamp: 1752159528504 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - sha256: 8896cd5deff6f57d102734f3e672bc17120613647288f9122bec69098e839af7 - md5: bbeca862892e2898bdb45792a61c4afc - depends: - - __osx >=10.13 - - pthread-stubs - - xorg-libxau >=1.0.11,<2.0a0 - - xorg-libxdmcp - license: MIT - license_family: MIT - size: 323770 - timestamp: 1727278927545 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - sha256: 4c6da089952b2d70150c74234679d6f7ac04f4a98f9432dec724968f912691e7 - md5: 30439ff30578e504ee5e0b390afc8c65 - depends: - - __osx >=11.0 - constrains: - - zlib 1.3.2 *_2 - license: Zlib - license_family: Other - size: 59000 - timestamp: 1774073052242 - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.5-h0d3cbff_1.conda - sha256: aeb3719ccd1102005388a134896bef4a4060f9368612637b94f065b1e1f6213b - md5: d801d0ce2eab00dbb0178b196d0ce754 - depends: - - __osx >=11.0 - constrains: - - openmp 22.1.5|22.1.5.* - - intel-openmp <0.0a0 - license: Apache-2.0 WITH LLVM-exception - license_family: APACHE - size: 311468 - timestamp: 1778448112705 - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda - sha256: f5f7e006ff4271305ab4cc08eedd855c67a571793c3d18aff73f645f088a8cae - md5: 31b8740cf1b2588d4e61c81191004061 - depends: - - __osx >=11.0 - license: X11 AND BSD-3-Clause - size: 831711 - timestamp: 1777423052277 - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.4-py314h5af6b61_0.conda - sha256: 8b71e39e3bdba4e05dec0bf994f9c89fc1f5df3a9c9ba6be30895bc90612d5a4 - md5: 1e6837407d5f08f380bdf99a228e8d70 - depends: - - python - - __osx >=11.0 - - libcxx >=19 - - libblas >=3.9.0,<4.0a0 - - libcblas >=3.9.0,<4.0a0 - - liblapack >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314t - constrains: - - numpy-base <0a0 - license: BSD-3-Clause - size: 8219663 - timestamp: 1778655481998 - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjdk-23.0.2-h18c9476_2.conda - sha256: 00a2381baecf707b4cb6ed74c4d91ede955e8f6f859e7caba35aa11720af8dd6 - md5: e8b746e8947c0dab5aeb7a26b8bce2ad - depends: - - libzlib >=1.3.1,<2.0a0 - license: GPL-2.0-or-later WITH Classpath-exception-2.0 - license_family: GPL - size: 185314361 - timestamp: 1743198593451 - - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h52bb76a_0.conda - sha256: 9a37ecf9c086f3a50d0132e6087dcbe7ea978d80e2da267fa3199c486529b311 - md5: 46e628da6e796c948fa8ec9d6d10bda3 - depends: - - __osx >=11.0 - - libcxx >=19 - - libpng >=1.6.55,<1.7.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-2-Clause - license_family: BSD - size: 335227 - timestamp: 1772625294157 - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.2-hc881268_0.conda - sha256: 334fd49ea31b99114f5afb1ec44555dc8c90640648302a4f8f838ee345d1ec50 - md5: 5cf0ece4375c73d7a5765e83565a69c7 - depends: - - __osx >=11.0 - - ca-certificates - license: Apache-2.0 - license_family: Apache - size: 2776564 - timestamp: 1775589970694 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-3.0.3-py314h424dfac_0.conda - sha256: a7ce49cb60bf3ca855c02658f852f9862aba60d198480a23ed85e13f78404c1f - md5: 9d74c9ca3726221ae9738491f5a6c916 - depends: - - python - - numpy >=1.26.0 - - python-dateutil >=2.8.2 - - __osx >=11.0 - - libcxx >=19 - - python_abi 3.14.* *_cp314t - - numpy >=1.23,<3 - constrains: - - adbc-driver-postgresql >=1.2.0 - - adbc-driver-sqlite >=1.2.0 - - beautifulsoup4 >=4.12.3 - - blosc >=1.21.3 - - bottleneck >=1.4.2 - - fastparquet >=2024.11.0 - - fsspec >=2024.10.0 - - gcsfs >=2024.10.0 - - html5lib >=1.1 - - hypothesis >=6.116.0 - - jinja2 >=3.1.5 - - lxml >=5.3.0 - - matplotlib >=3.9.3 - - numba >=0.60.0 - - numexpr >=2.10.2 - - odfpy >=1.4.1 - - openpyxl >=3.1.5 - - psycopg2 >=2.9.10 - - pyarrow >=13.0.0 - - pyiceberg >=0.8.1 - - pymysql >=1.1.1 - - pyqt5 >=5.15.9 - - pyreadstat >=1.2.8 - - pytables >=3.10.1 - - pytest >=8.3.4 - - pytest-xdist >=3.6.1 - - python-calamine >=0.3.0 - - pytz >=2024.2 - - pyxlsb >=1.0.10 - - qtpy >=2.4.2 - - scipy >=1.14.1 - - s3fs >=2024.10.0 - - sqlalchemy >=2.0.36 - - tabulate >=0.9.0 - - xarray >=2024.10.0 - - xlrd >=2.0.1 - - xlsxwriter >=3.2.0 - - zstandard >=0.23.0 - license: BSD-3-Clause - size: 14889857 - timestamp: 1778602827848 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - sha256: 8d64a9d36073346542e5ea042ef8207a45a0069a2e65ce3323ee3146db78134c - md5: 08f970fb2b75f5be27678e077ebedd46 - depends: - - __osx >=10.13 - - bzip2 >=1.0.8,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 1106584 - timestamp: 1763655837207 - - conda: https://conda.anaconda.org/conda-forge/osx-64/perl-5.32.1-7_h10d778d_perl5.conda - build_number: 7 - sha256: 8ebd35e2940055a93135b9fd11bef3662cecef72d6ee651f68d64a2f349863c7 - md5: dc442e0885c3a6b65e61c61558161a9e - license: GPL-1.0-or-later OR Artistic-1.0-Perl - size: 12334471 - timestamp: 1703311001432 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-12.2.0-py314ha8c422d_0.conda - sha256: a3a3669c541be326b6decac2021f175139c5902d6c5fa5144d7709bbf406d783 - md5: d0735d48f01d1cbe87779aca7910847a - depends: - - python - - __osx >=11.0 - - libxcb >=1.17.0,<2.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - libfreetype >=2.14.3 - - libfreetype6 >=2.14.3 - - libwebp-base >=1.6.0,<2.0a0 - - lcms2 >=2.18,<3.0a0 - - zlib-ng >=2.3.3,<2.4.0a0 - - tk >=8.6.13,<8.7.0a0 - - libtiff >=4.7.1,<4.8.0a0 - - python_abi 3.14.* *_cp314t - - openjpeg >=2.5.4,<3.0a0 - license: HPND - size: 1017347 - timestamp: 1775060319565 - - conda: https://conda.anaconda.org/conda-forge/osx-64/prek-0.3.13-h19f9e61_0.conda - sha256: 9bbc29d301d3bf921859d22119468a1ee3e476e2ea20e23a5c101e9192b8f392 - md5: 14029b37c885c7381e5adb12940bd2ca - depends: - - __osx >=11.0 - constrains: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 5913252 - timestamp: 1778015839614 - - conda: https://conda.anaconda.org/conda-forge/osx-64/psutil-7.2.2-py314h5a675f6_0.conda - sha256: 5f723d569e6fb03b9bd5ad3744e631c6eda086f85fc11b87bcdfc2f1dc901608 - md5: 950f0e0025606dd4f10d5e478d5edc48 - depends: - - python - - __osx >=10.13 - - python_abi 3.14.* *_cp314t - license: BSD-3-Clause - license_family: BSD - size: 243911 - timestamp: 1769678309883 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - sha256: 05944ca3445f31614f8c674c560bca02ff05cb51637a96f665cb2bbe496099e5 - md5: 8bcf980d2c6b17094961198284b8e862 - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 8364 - timestamp: 1726802331537 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.4-py314hbde8b1d_0.conda - sha256: 37c50bb5a99818c7f722abcb56ce3155d7a23d88004b4964e72c1a7a239ad55e - md5: 9b8616b268c1a3d164bf73d18a1577ad - depends: - - python - - typing-extensions >=4.6.0,!=4.7.0 - - __osx >=11.0 - - python_abi 3.14.* *_cp314t - constrains: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 1887368 - timestamp: 1778084319368 - - conda: https://conda.anaconda.org/conda-forge/osx-64/pynacl-1.6.2-py314h9960d16_1.conda - sha256: 3ee566de7d903174f15578c4e19636c2eed63ed7ce30535f2b7de538b6f8308e - md5: eb5f1855927540415749ee4e3d695685 - depends: - - __osx >=11.0 - - cffi >=1.4.1 - - libsodium >=1.0.21,<1.0.22.0a0 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314t - - six - license: Apache-2.0 - license_family: Apache - size: 1201667 - timestamp: 1772171824664 - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.4-ha91e2d8_0_cp314t.conda - sha256: 4705efc49bba5703931443966a6b8825dbab507485fb302fe2af7308a8d62ba1 - md5: e412ca4c37e7ba354c06e53da0c04c52 - depends: - - __osx >=11.0 - - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.5,<3.0a0 - - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.2,<6.0a0 - - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.52.0,<4.0a0 - - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.6,<4.0a0 - - python_abi 3.14.* *_cp314t - - readline >=8.3,<9.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 - track_features: - - py_freethreading - license: Python-2.0 - size: 16737962 - timestamp: 1775615156444 - python_site_packages_path: lib/python3.14t/site-packages - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 - md5: eefd65452dfe7cce476a519bece46704 - depends: - - __osx >=10.13 - - ncurses >=6.5,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 317819 - timestamp: 1765813692798 - - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.30.0-py314hb58a449_0.conda - sha256: 81417f541526c526c61803f788c741af9c0703a3c9e7d041568a45f2f51a1481 - md5: c895c7285ef72197255b8c9380580ca3 - depends: - - python - - __osx >=10.13 - - python_abi 3.14.* *_cp314t - constrains: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 364035 - timestamp: 1764543199478 - - conda: https://conda.anaconda.org/conda-forge/osx-64/ruamel.yaml.clib-0.2.15-py314h5a675f6_1.conda - sha256: 6cdcd47e8d4068572a0c8adf1f45448a7680988e58a45c3e0ab58525d124ad86 - md5: e4cd01e88bbe537f66d4760bfb3cf92d - depends: - - python - - __osx >=10.13 - - python_abi 3.14.* *_cp314t - license: MIT - license_family: MIT - size: 144396 - timestamp: 1766159539262 - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - sha256: 7f0d9c320288532873e2d8486c331ec6d87919c9028208d3f6ac91dc8f99a67b - md5: 6e6efb7463f8cef69dbcb4c2205bf60e - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: TCL - license_family: BSD - size: 3282953 - timestamp: 1769460532442 - - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-2.1.2-py314h58bf454_0.conda - sha256: f6b91faa970facbd65a1ac25cfd16db790f5cc7221c6d8c41ce8d58a9885ec79 - md5: fccb16cd4d975d049fc9a8058d4e8e9b - depends: - - __osx >=11.0 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314t - license: BSD-2-Clause - license_family: BSD - size: 85792 - timestamp: 1772795330656 - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - sha256: 928f28bd278c7da674b57d71b2e7f4ac4e7c7ce56b0bf0f60d6a074366a2e76d - md5: 47f1b8b4a76ebd0cd22bd7153e54a4dc - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 13810 - timestamp: 1762977180568 - - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - sha256: b7b291cc5fd4e1223058542fca46f462221027779920dd433d68b98e858a4afc - md5: 435446d9d7db8e094d2c989766cfb146 - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 19067 - timestamp: 1762977101974 - - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - sha256: a335161bfa57b64e6794c3c354e7d49449b28b8d8a7c4ed02bf04c3f009953f9 - md5: a645bb90997d3fc2aea0adf6517059bd - depends: - - __osx >=10.13 - license: MIT - license_family: MIT - size: 79419 - timestamp: 1753484072608 - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.3-h8bce59a_1.conda - sha256: 4a1beb656761c7d8c9a53474bfd3932c30d82af5d93a32b8ef626c01c059d981 - md5: b3ecb6480fd46194e3f7dd0ff4445dff - depends: - - __osx >=10.13 - - libcxx >=19 - license: Zlib - license_family: Other - size: 120464 - timestamp: 1770168263684 - - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f - md5: 727109b184d680772e3122f40136d5ca - depends: - - __osx >=10.13 - - libzlib >=1.3.1,<2.0a0 - license: BSD-3-Clause - license_family: BSD - size: 528148 - timestamp: 1764777156963 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - build_number: 7 - sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd - md5: a44032f282e7d2acdeb1c240308052dd - depends: - - llvm-openmp >=9.0.1 - license: BSD-3-Clause - license_family: BSD - size: 8325 - timestamp: 1764092507920 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/biopython-1.87-py314ha0ac461_0.conda - sha256: 941fddec1ec5d3bf2358e34c160be06c55b489ac0d9cc2c28c4b1df1b2c7c6e9 - md5: 1a4f598aa6805b9f7b1f9473a0009640 - depends: - - __osx >=11.0 - - numpy - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314t - - python_abi 3.14.* *_cp314t - license: LicenseRef-Biopython - size: 3346334 - timestamp: 1774882673087 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h5133025_1.conda - sha256: 7cfb801483bc18cac96f92bbdefbde0ab383af2e0fb9aa34ecb392477655b3bd - md5: 64416e9cae65905f5b415d21cecb0f6d - depends: - - __osx >=11.0 - - libcxx >=19 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314t - - python_abi 3.14.* *_cp314t - constrains: - - libbrotlicommon 1.2.0 hc919400_1 - license: MIT - license_family: MIT - size: 2037981 - timestamp: 1764018267458 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df - md5: 620b85a3f45526a8bc4d23fd78fc22f0 - depends: - - __osx >=11.0 - license: bzip2-1.0.6 - license_family: BSD - size: 124834 - timestamp: 1771350416561 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 - md5: bcb3cba70cf1eec964a03b4ba7775f01 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 180327 - timestamp: 1765215064054 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314hbcd5915_1.conda - sha256: f0e1eee915a0249aeea68a3fa1f609f066591825a17cb2494cc92fc5d28781b0 - md5: 1f6ebee7dc7399a0c8d11e391b8b4aa3 - depends: - - __osx >=11.0 - - libffi >=3.5.2,<3.6.0a0 - - pycparser - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314t - - python_abi 3.14.* *_cp314t - license: MIT - license_family: MIT - size: 2113880 - timestamp: 1761203527956 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/coreutils-9.5-h93a5062_0.conda - sha256: 70e50f2f1458e7c172c9b1c149a4289e8eecc9b53e06ab9de0b3572cdbd30a61 - md5: 75840e25e62a109b1d25043c63a4f36c - license: GPL-3.0-or-later - license_family: GPL - size: 1478098 - timestamp: 1711655465375 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-48.0.0-py314hb5a3885_0.conda - sha256: 6c19fdc7a36c70565bf8c0603f72e93b256f74ef57fe132c21140bed5316de9e - md5: 9c92878583ae61f4778fe580dcdddebd - depends: - - __osx >=11.0 - - cffi >=2.0 - - openssl >=3.5.6,<4.0a0 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314t - constrains: - - __osx >=11.0 - license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT - license_family: BSD - size: 1867809 - timestamp: 1777966171235 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/curl-8.20.0-hd5a2499_0.conda - sha256: 2e531e953f62c6703ab9ea8bd6e62011a1760be0fa808b97ef5f3156956b421e - md5: 88cce35a3cb20623c1bc5be5e4dca9a5 - depends: - - __osx >=11.0 - - krb5 >=1.22.2,<1.23.0a0 - - libcurl 8.20.0 hd5a2499_0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT - size: 179176 - timestamp: 1777462274250 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/git-2.54.0-pl5321hc9deb11_0.conda - sha256: 48cbac7b8c8b471af28bc43b36b897252412f1b1034b602c75745366ade4fcdc - md5: 4ba08d0f1566516cfe440d18c32dcf96 - depends: - - __osx >=11.0 - - libcurl >=8.20.0,<9.0a0 - - libexpat >=2.8.0,<3.0a0 - - libiconv >=1.18,<2.0a0 - - libintl >=0.25.1,<1.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - - pcre2 >=10.47,<10.48.0a0 - - perl 5.* - license: GPL-2.0-or-later and LGPL-2.1-or-later - size: 12853597 - timestamp: 1778073368996 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed - md5: e446e1822f4da8e5080a9de93474184d - depends: - - __osx >=11.0 - - libcxx >=19 - - libedit >=3.1.20250104,<3.2.0a0 - - libedit >=3.1.20250104,<4.0a0 - - openssl >=3.5.5,<4.0a0 - license: MIT - license_family: MIT - size: 1160828 - timestamp: 1769770119811 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_0.conda - sha256: d589ff5294e42576563b22bdea0860cb80b0cbe0f3852836eddaadedf6eec4ef - md5: e5ba982008c0ac1a1c0154617371bab5 - depends: - - __osx >=11.0 - - libjpeg-turbo >=3.1.4.1,<4.0a0 - - libtiff >=4.7.1,<4.8.0a0 - license: MIT - license_family: MIT - size: 212998 - timestamp: 1778079809873 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda - sha256: 66e5ffd301a44da696f3efc2f25d6d94f42a9adc0db06c44ad753ab844148c51 - md5: 095e5749868adab9cae42d4b460e5443 - depends: - - __osx >=11.0 - - libcxx >=19 - license: Apache-2.0 - license_family: Apache - size: 164222 - timestamp: 1773114244984 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-7_h51639a9_openblas.conda - build_number: 7 - sha256: 662935bfb93d2d097e26e273a3a2f504a9f833f64aa6f9e295b577655478c39b - md5: ab6670d099d19fe70cb9efb88a1b5f78 - depends: - - libopenblas >=0.3.33,<0.3.34.0a0 - - libopenblas >=0.3.33,<1.0a0 - constrains: - - libcblas 3.11.0 7*_openblas - - blas 2.307 openblas - - mkl <2027 - - liblapack 3.11.0 7*_openblas - - liblapacke 3.11.0 7*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18783 - timestamp: 1778489983152 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-7_hb0561ab_openblas.conda - build_number: 7 - sha256: 3ac3d27022b3ca8b1980c087e0ede250434f6ed90a4fdc78a8a5ed382bc75505 - md5: 189b373453ec3904095dcb16f502bace - depends: - - libblas 3.11.0 7_h51639a9_openblas - constrains: - - blas 2.307 openblas - - liblapack 3.11.0 7*_openblas - - liblapacke 3.11.0 7*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18810 - timestamp: 1778489991330 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda - sha256: 38c0bc634b61e542776e97cfd15d5d41edd304d4e47c333004d2d622439b2381 - md5: 2f57b7d0c6adda88957586b7afd78438 - depends: - - __osx >=11.0 - - krb5 >=1.22.2,<1.23.0a0 - - libnghttp2 >=1.68.1,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.2,<2.0a0 - - openssl >=3.5.6,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT - size: 400568 - timestamp: 1777462251987 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.5-h55c6f16_1.conda - sha256: dddd01bd6b338221342a89530a1caffe6051a70cc8f8b1d8bb591d5447a3c603 - md5: ff484b683fecf1e875dfc7aa01d19796 - depends: - - __osx >=11.0 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - size: 569359 - timestamp: 1778191546305 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c - md5: a6130c709305cd9828b4e1bd9ba0000c - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 55420 - timestamp: 1761980066242 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda - sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 - md5: 44083d2d2c2025afca315c7a172eab2b - depends: - - ncurses - - __osx >=11.0 - - ncurses >=6.5,<7.0a0 - license: BSD-2-Clause - license_family: BSD - size: 107691 - timestamp: 1738479560845 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f - md5: 36d33e440c31857372a72137f78bacf5 - license: BSD-2-Clause - license_family: BSD - size: 107458 - timestamp: 1702146414478 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.0-hf6b4638_0.conda - sha256: f4b1cafc59afaede8fa0a2d9cf376840f1c553001acd72f6ead18bbc8ac8c49c - md5: 65466e82c09e888ca7560c11a97d5450 - depends: - - __osx >=11.0 - constrains: - - expat 2.8.0.* - license: MIT - license_family: MIT - size: 68789 - timestamp: 1777846180142 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 - md5: 43c04d9cb46ef176bb2a4c77e324d599 - depends: - - __osx >=11.0 - license: MIT - license_family: MIT - size: 40979 - timestamp: 1769456747661 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_0.conda - sha256: a047a2f238362a37d484f9620e8cba29f513a933cd9eb68571ad4b270d6f8f3e - md5: f73b109d49568d5d1dda43bb147ae37f - depends: - - libfreetype6 >=2.14.3 - license: GPL-2.0-only OR FTL - size: 8091 - timestamp: 1774298691258 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_0.conda - sha256: ff764608e1f2839e95e2cf9b243681475f8778c36af7a42b3f78f476fdbb1dd3 - md5: e98ba7b5f09a5f450eca083d5a1c4649 - depends: - - __osx >=11.0 - - 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: 338085 - timestamp: 1774298689297 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda - sha256: 06644fa4d34d57c9e48f4d84b1256f9e5f654fdb37f43acc8a58a396952d42b7 - md5: 644058123986582db33aebd4ae2ca184 - depends: - - _openmp_mutex - constrains: - - libgcc-ng ==15.2.0=*_19 - - libgomp 15.2.0 19 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 404080 - timestamp: 1778273064154 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda - sha256: d4837b3b9b30af3132d260225e91ab9dde83be04c59513f500cc81050fb37486 - md5: 1ea03f87cdb1078fbc0e2b2deb63752c - depends: - - libgfortran5 15.2.0 hdae7583_19 - constrains: - - libgfortran-ng ==15.2.0=*_19 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 139675 - timestamp: 1778273280875 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda - sha256: d0a68b7a121d115b80c169e24d1265dcc25a3fe58d107df1bbc430797e226d88 - md5: ba36d8c606a6a53fe0b8c12d47267b3d - depends: - - libgcc >=15.2.0 - constrains: - - libgfortran 15.2.0 - license: GPL-3.0-only WITH GCC-exception-3.1 - license_family: GPL - size: 599691 - timestamp: 1778273075448 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 - md5: 4d5a7445f0b25b6a3ddbb56e790f5251 - depends: - - __osx >=11.0 - license: LGPL-2.1-only - size: 750379 - timestamp: 1754909073836 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda - sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a - md5: 5103f6a6b210a3912faf8d7db516918c - depends: - - __osx >=11.0 - - libiconv >=1.18,<2.0a0 - license: LGPL-2.1-or-later - size: 90957 - timestamp: 1751558394144 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.4.1-h84a0fba_0.conda - sha256: 17e035ae6a520ff6a6bb5dd93a4a7c3895891f4f9743bcb8c6ef607445a31cd0 - md5: b8a7544c83a67258b0e8592ec6a5d322 - depends: - - __osx >=11.0 - constrains: - - jpeg <0.0.0a - license: IJG AND BSD-3-Clause AND Zlib - size: 555681 - timestamp: 1775962975624 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-7_hd9741b5_openblas.conda - build_number: 7 - sha256: ff3018918ca8b22173dcb231842e819767fd05a08df61483eb5f3e9f2895d114 - md5: d1289ad41d5a78e2269eea3a2d7f0c7d - depends: - - libblas 3.11.0 7_h51639a9_openblas - constrains: - - libcblas 3.11.0 7*_openblas - - blas 2.307 openblas - - liblapacke 3.11.0 7*_openblas - license: BSD-3-Clause - license_family: BSD - size: 18780 - timestamp: 1778490000843 + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 18925 + timestamp: 1779859153970 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e md5: b1fd823b5ae54fbec272cea0811bd8a9 @@ -4115,6 +3494,9 @@ packages: constrains: - xz 5.8.3.* license: 0BSD + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 size: 92472 timestamp: 1775825802659 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda @@ -4124,6 +3506,7 @@ packages: - __osx >=11.0 license: BSD-2-Clause license_family: BSD + run_exports: {} size: 73690 timestamp: 1769482560514 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda @@ -4139,6 +3522,9 @@ packages: - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 size: 576526 timestamp: 1773854624224 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda @@ -4153,6 +3539,9 @@ packages: - openblas >=0.3.33,<0.3.34.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - libopenblas >=0.3.33,<1.0a0 size: 4304965 timestamp: 1776995497368 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda @@ -4162,25 +3551,35 @@ packages: - __osx >=11.0 - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 size: 289546 timestamp: 1776315246750 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227 - md5: 7cc5247987e6d115134ebab15186bc13 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + sha256: 202be45db5726757a8ea1f374f85aacc18c504f5ff15b2558496dff4c8779c48 + md5: 9ed5ab909c449bdcae72322e44875a18 depends: - __osx >=11.0 license: ISC - size: 248039 - timestamp: 1772479570912 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.1-h1b79a29_0.conda - sha256: 49daec7c83e70d4efc17b813547824bc2bcf2f7256d84061d24fbfe537da9f74 - md5: 6681822ea9d362953206352371b6a904 + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 + size: 247352 + timestamp: 1779164136206 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda + sha256: 862463917e8ef5ac3ebdaf8f19914634b457609cc27ba678b7197124cefeb1f7 + md5: 1ebde5c677f00765233a17e278571177 depends: - __osx >=11.0 + - icu >=78.3,<79.0a0 - libzlib >=1.3.2,<2.0a0 license: blessing - size: 920047 - timestamp: 1777987051643 + run_exports: + weak: + - libsqlite >=3.53.2,<4.0a0 + size: 927724 + timestamp: 1780575223548 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a md5: b68e8f66b94b44aaa8de4583d3d4cc40 @@ -4189,6 +3588,9 @@ packages: - openssl >=3.5.0,<4.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 size: 279193 timestamp: 1745608793272 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda @@ -4205,6 +3607,9 @@ packages: - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: HPND + run_exports: + weak: + - libtiff >=4.7.1,<4.8.0a0 size: 373892 timestamp: 1762022345545 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda @@ -4216,6 +3621,9 @@ packages: - libwebp 1.6.0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 size: 294974 timestamp: 1752159906788 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda @@ -4228,6 +3636,9 @@ packages: - xorg-libxdmcp license: MIT license_family: MIT + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 size: 323658 timestamp: 1727278733917 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda @@ -4239,44 +3650,57 @@ packages: - zlib 1.3.2 *_2 license: Zlib license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 size: 47759 timestamp: 1774072956767 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.5-hc7d1edf_1.conda - sha256: 2cd49562feda2bf324651050b2b035080fd635ed0f1c96c9ce7a59eff3cc0029 - md5: 8a4e2a54034b35bc6fa5bf9282913f45 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda + sha256: ccbaad6bbc88f135ab849bc36af5fa6eda36a9ed18ce6f58e3dde3d11784c156 + md5: a9c118f6343fb6301b6f3b4e94c4c562 depends: - __osx >=11.0 constrains: - - openmp 22.1.5|22.1.5.* - intel-openmp <0.0a0 + - openmp 22.1.8|22.1.8.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE - size: 285806 - timestamp: 1778447786965 + run_exports: + strong: + - llvm-openmp >=22.1.8 + size: 286313 + timestamp: 1781736516782 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d md5: 343d10ed5b44030a2f67193905aea159 depends: - __osx >=11.0 license: X11 AND BSD-3-Clause + run_exports: + weak: + - ncurses >=6.6,<7.0a0 size: 805509 timestamp: 1777423252320 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.4-py314hb25f971_0.conda - sha256: 03e500ab54d1c63dba71bb7e2613f731aed2c2df046961d5e21d20d0f213f8ed - md5: fae259830014d4b486ca4ca07ff26071 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.5.0-py314hb25f971_0.conda + sha256: 8cf693050d0d10b232d80773916759e50c84aa8e968bc87942dd52571b2d1011 + md5: 012d55010a3c7ab7057256568f9aa49d depends: - python - - __osx >=11.0 - libcxx >=19 - - libblas >=3.9.0,<4.0a0 + - __osx >=11.0 - libcblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 - python_abi 3.14.* *_cp314t + - libblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause - size: 7061676 - timestamp: 1778655448557 + license_family: BSD + run_exports: + weak: + - numpy >=1.25,<3 + size: 7192052 + timestamp: 1782112548556 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjdk-23.0.2-hfb9339a_2.conda sha256: f16143181808731b74e03b191a1d859cfb6dc7ed066f9d567808c438e9770f85 md5: 6e330bfe359f78e2313eaecf8ca1529c @@ -4284,6 +3708,7 @@ packages: - libzlib >=1.3.1,<2.0a0 license: GPL-2.0-or-later WITH Classpath-exception-2.0 license_family: GPL + run_exports: {} size: 183373664 timestamp: 1743198731576 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda @@ -4297,18 +3722,24 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-2-Clause license_family: BSD + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 size: 319697 timestamp: 1772625397692 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.2-hd24854e_0.conda - sha256: c91bf510c130a1ea1b6ff023e28bac0ccaef869446acd805e2016f69ebdc49ea - md5: 25dcccd4f80f1638428613e0d7c9b4e1 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb + md5: 8187a86242741725bfa74785fe812979 depends: - __osx >=11.0 - ca-certificates license: Apache-2.0 license_family: Apache - size: 3106008 - timestamp: 1775587972483 + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3102584 + timestamp: 1781069820667 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py314h3dd0261_0.conda sha256: 3400064e137c5cef0cf9d1049525fe38f7f17502ce9d5c8bbe482cc18134dfe2 md5: 6214904bd64288e924bca5548dd8b03c @@ -4361,6 +3792,8 @@ packages: - xlsxwriter >=3.2.0 - zstandard >=0.23.0 license: BSD-3-Clause + license_family: BSD + run_exports: {} size: 14627594 timestamp: 1778602959844 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -4372,6 +3805,9 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 size: 850231 timestamp: 1763655726735 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/perl-5.32.1-7_h4614cfb_perl5.conda @@ -4379,6 +3815,11 @@ packages: sha256: b0c55040d2994fd6bf2f83786561d92f72306d982d6ea12889acad24a9bf43b8 md5: ba3cbe93f99e896765422cc5f7c3a79e license: GPL-1.0-or-later OR Artistic-1.0-Perl + run_exports: + weak: + - perl >=5.32.1,<5.33.0a0 *_perl5 + noarch: + - perl >=5.32.1,<6.0a0 *_perl5 size: 14439531 timestamp: 1703311335652 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.2.0-py314h0f2039c_0.conda @@ -4400,6 +3841,7 @@ packages: - zlib-ng >=2.3.3,<2.4.0a0 - libxcb >=1.17.0,<2.0a0 license: HPND + run_exports: {} size: 1009403 timestamp: 1775060469004 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prek-0.3.13-h6fdd925_0.conda @@ -4411,6 +3853,7 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + run_exports: {} size: 5515401 timestamp: 1778015743544 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314h8dbd3ad_0.conda @@ -4423,6 +3866,7 @@ packages: - python_abi 3.14.* *_cp314t license: BSD-3-Clause license_family: BSD + run_exports: {} size: 246339 timestamp: 1769678330083 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda @@ -4432,6 +3876,7 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + run_exports: {} size: 8381 timestamp: 1726802424786 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.4-py314h4bebe68_0.conda @@ -4447,37 +3892,39 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + run_exports: {} size: 1723979 timestamp: 1778084307993 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py314h102c760_1.conda - sha256: c0911361541e562cccd3f3166ae83844af13b21aa18258d20aa31d76679e2821 - md5: a07ea89f31814b0f83a34d1d2b4ffb04 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pynacl-1.6.2-py314h079e141_2.conda + sha256: df01ecffca50db1bc0ccdbb7e68ef2c749d9d331c6bf8366cea3296c522078d6 + md5: 686b043bc29bed505e9918a7c0b1e9bc depends: - __osx >=11.0 - cffi >=1.4.1 - - libsodium >=1.0.21,<1.0.22.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 - python >=3.14,<3.15.0a0 - python >=3.14,<3.15.0a0 *_cp314t - python_abi 3.14.* *_cp314t - six license: Apache-2.0 license_family: Apache - size: 1210716 - timestamp: 1772171432569 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.4-h6c44a53_0_cp314t.conda - sha256: e825c7f56d811f63995be4482442398909000ce71137ce6c9e5bab80ca74997b - md5: fe2e332924c098feefba3b806a9951b5 + run_exports: {} + size: 1172862 + timestamp: 1778985287981 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-he51be1b_0_cp314t.conda + sha256: a310643d09751788f000bceab810245f2c471d7709e1cab6e2a50ecdd61fdeaa + md5: e0018bb14ab734f5c44851304e814a53 depends: - __osx >=11.0 - bzip2 >=1.0.8,<2.0a0 - - libexpat >=2.7.5,<3.0a0 + - libexpat >=2.8.1,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - - liblzma >=5.8.2,<6.0a0 + - liblzma >=5.8.3,<6.0a0 - libmpdec >=4.0.0,<5.0a0 - - libsqlite >=3.52.0,<4.0a0 + - libsqlite >=3.53.2,<4.0a0 - libzlib >=1.3.2,<2.0a0 - - ncurses >=6.5,<7.0a0 - - openssl >=3.5.6,<4.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 - python_abi 3.14.* *_cp314t - readline >=8.3,<9.0a0 - tk >=8.6.13,<8.7.0a0 @@ -4486,8 +3933,13 @@ packages: track_features: - py_freethreading license: Python-2.0 - size: 13978318 - timestamp: 1775615456198 + run_exports: + weak: + - python_abi 3.14.* *_cp314t + noarch: + - python + size: 16315912 + timestamp: 1781254814142 python_site_packages_path: lib/python3.14t/site-packages - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 @@ -4497,22 +3949,25 @@ packages: - ncurses >=6.5,<7.0a0 license: GPL-3.0-only license_family: GPL + run_exports: + weak: + - readline >=8.3,<9.0a0 size: 313930 timestamp: 1765813902568 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314h3e57df4_0.conda - sha256: 899f4460f6f3aecc9359a9268b585e92491a60357b35ef81a616066c7e2ebbf0 - md5: ed14daa711ff980bbd5137731229c309 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-2026.5.1-py314h4ca4bc6_0.conda + sha256: c801141c093a51a9625a426c588d33b35a65b0c8e29b9fd5970e4bc1a072f923 + md5: 60c9db433895f63a19921655e069358b depends: - python - - python 3.14.* *_cp314t - __osx >=11.0 - python_abi 3.14.* *_cp314t constrains: - __osx >=11.0 license: MIT license_family: MIT - size: 353083 - timestamp: 1764543163228 + run_exports: {} + size: 290922 + timestamp: 1779977143701 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruamel.yaml.clib-0.2.15-py314h8dbd3ad_1.conda sha256: d1cb47d6613d46bfa54a1ead045885d084f2d0b6f59227d85b1401f010541e47 md5: 82a7741326a1df8c6cf9b031d2e78845 @@ -4523,6 +3978,7 @@ packages: - python_abi 3.14.* *_cp314t license: MIT license_family: MIT + run_exports: {} size: 139015 timestamp: 1766159549782 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda @@ -4533,11 +3989,28 @@ packages: - libzlib >=1.3.1,<2.0a0 license: TCL license_family: BSD + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 size: 3127137 timestamp: 1769460817696 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.1.2-py314ha0ac461_0.conda - sha256: 59fe879e3e74f692a5148f148d448640423daebf791a47a0d5c21e8e4d3dc527 - md5: a17a033028ed21ddedff804900bd8b49 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ujson-5.13.0-py314h3dd0261_0.conda + sha256: 9fed75f26a4ee6b81975fc79d06ce7b1176f815b9b87fc9e59765064cdc836f5 + md5: 6e4af901cd467864064b82efdb57b01d + depends: + - python + - __osx >=11.0 + - python 3.14.* *_cp314t + - libcxx >=19 + - python_abi 3.14.* *_cp314t + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 68567 + timestamp: 1781561739360 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.2.2-py314ha0ac461_0.conda + sha256: 74d3ba1abcd789988f6b0585913ec1aa76f0cdc0b0f9d2b2f618f5a163896ca7 + md5: ec562591119351a4c9347afae3014d14 depends: - __osx >=11.0 - python >=3.14,<3.15.0a0 @@ -4545,8 +4018,9 @@ packages: - python_abi 3.14.* *_cp314t license: BSD-2-Clause license_family: BSD - size: 87228 - timestamp: 1772795125776 + run_exports: {} + size: 116488 + timestamp: 1782134218047 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda sha256: adae11db0f66f86156569415ed79cda75b2dbf4bea48d1577831db701438164f md5: 78b548eed8227a689f93775d5d23ae09 @@ -4554,6 +4028,9 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 size: 14105 timestamp: 1762976976084 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda @@ -4563,6 +4040,9 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 size: 19156 timestamp: 1762977035194 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda @@ -4572,6 +4052,9 @@ packages: - __osx >=11.0 license: MIT license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 size: 83386 timestamp: 1753484079473 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda @@ -4582,6 +4065,9 @@ packages: - libcxx >=19 license: Zlib license_family: Other + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 size: 94375 timestamp: 1770168363685 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda @@ -4592,5 +4078,8 @@ packages: - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 size: 433413 timestamp: 1764777166076 diff --git a/pixi.toml b/pixi.toml index a3ceccbb..1c123c00 100644 --- a/pixi.toml +++ b/pixi.toml @@ -8,7 +8,7 @@ version = "0.1.0" [tasks] [dependencies] -nextflow = ">=26.4.1,<27" +nextflow = ">=26.04,<27" nf-test = ">=0.9.5,<0.10" prek = ">=0.3.13,<0.4" nf-core = ">=4.0.2,<5" diff --git a/workflows/preprocessing.nf b/workflows/preprocessing.nf index e7c5b9e4..e42b3ea9 100644 --- a/workflows/preprocessing.nf +++ b/workflows/preprocessing.nf @@ -371,7 +371,7 @@ workflow PREPROCESSING { softwareVersionsToYAML(topic_versions.versions_file) .mix(topic_versions_string) .collectFile( - storeDir: "${outdir.toUriString()}/pipeline_info", + storeDir: "${outdir}/pipeline_info", name: 'nf_cmgg_preprocessing_software_mqc_versions.yml', sort: true, newLine: true, From 39279d3b9b95a2ca547fd5c20325d055a9ade878 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Mon, 29 Jun 2026 11:25:15 +0200 Subject: [PATCH 11/62] tests? --- tests/subworkflows/local/bam_qc/main.nf.test | 20 +--- .../local/bam_qc/main.nf.test.snap | 106 +++++++++++++++++- 2 files changed, 102 insertions(+), 24 deletions(-) diff --git a/tests/subworkflows/local/bam_qc/main.nf.test b/tests/subworkflows/local/bam_qc/main.nf.test index 7ae1f8ea..2f2f3adf 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test +++ b/tests/subworkflows/local/bam_qc/main.nf.test @@ -28,15 +28,7 @@ nextflow_workflow { then { assert workflow.success - assert snapshot( - sanitizeOutput(workflow.out, unstableKeys:[]).collectEntries { key, value -> - if (value.endsWith(".pdf")) { - [ key: file(value).name] - } else { - [ key: value ] - } - } - ).match() + assert snapshot(workflow.out).match() } } @@ -60,15 +52,7 @@ nextflow_workflow { then { assert workflow.success - assert snapshot( - sanitizeOutput(workflow.out, unstableKeys:[]).collectEntries { key, value -> - if (value.endsWith(".pdf")) { - [ key: file(value).name] - } else { - [ key: value ] - } - } - ).match() + assert snapshot(workflow.out).match() } } } diff --git a/tests/subworkflows/local/bam_qc/main.nf.test.snap b/tests/subworkflows/local/bam_qc/main.nf.test.snap index ffa60858..999a1298 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test.snap +++ b/tests/subworkflows/local/bam_qc/main.nf.test.snap @@ -2,6 +2,53 @@ "Bam QC - HSmetrics": { "content": [ { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" + ] + ] + ], "riker_metrics": [ [ { @@ -10,12 +57,12 @@ }, [ "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,43dcb037a557e5cbf784f340cadc02e1", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" @@ -51,15 +98,62 @@ ] } ], - "timestamp": "2026-06-15T07:38:49.8639", + "timestamp": "2026-06-29T11:24:42.884004", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.3" + "nextflow": "26.04.4" } }, "Bam QC - WGSmetrics": { "content": [ { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "3": [ + [ + { + "id": "test", + "single_end": false + }, + [ + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" + ] + ] + ], "riker_metrics": [ [ { @@ -109,10 +203,10 @@ ] } ], - "timestamp": "2026-06-15T07:40:29.049547", + "timestamp": "2026-06-29T11:25:01.12339", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.3" + "nextflow": "26.04.4" } } } \ No newline at end of file From 959b791be2ebfce0256e31245fcb5b642673d447 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Mon, 29 Jun 2026 11:39:19 +0200 Subject: [PATCH 12/62] more testing --- tests/workflows/preprocessing.nf.test | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/workflows/preprocessing.nf.test b/tests/workflows/preprocessing.nf.test index 4b1ffcd3..874aec15 100644 --- a/tests/workflows/preprocessing.nf.test +++ b/tests/workflows/preprocessing.nf.test @@ -307,8 +307,6 @@ nextflow_workflow { ]).collectEntries { key, value -> if (key in ["demultiplex_logs", "demultiplex_reports"]) { [ key: value.sort() ] - } else if (value.endsWith(".pdf")) { - [ key: file(value).name] } else { [ key: value ] } From b9e636ff41225d40c08dff61917df277847dfe9e Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Mon, 29 Jun 2026 12:50:15 +0200 Subject: [PATCH 13/62] add version, changelog --- .nf-core.yml | 2 +- CHANGELOG.md | 5 +++++ assets/multiqc_config.yml | 2 +- nextflow.config | 2 +- ro-crate-metadata.json | 27 ++++++++++++--------------- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 28d8bd53..81d34d0b 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -39,4 +39,4 @@ template: org: nf-cmgg outdir: . skip_features: ["fastqc"] - version: 3.0.2 + version: 3.1.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a589fd1..b5a60275 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 3.1.0 (dev) + +- Drop `Picard` modules and associated parameters in favor of `riker multi`, which is much more efficient and now run by default. +- Add `apple` profile to enable the use of Apple containers. + ## 3.0.2 - remove common plugins in favor of defining them in the nf-cmgg/configs, which will be used across all nf-cmgg pipelines. This allows for better version control and consistency across pipelines, as well as reducing the maintenance burden of keeping plugins up to date in multiple repositories. diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 349aabe1..47799816 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -1,5 +1,5 @@ report_comment: > - This report has been generated by the nf-cmgg/preprocessing analysis pipeline. + This report has been generated by the nf-cmgg/preprocessing analysis pipeline. report_section_order: "nf-cmgg-preprocessing-methods-description": order: -1000 diff --git a/nextflow.config b/nextflow.config index 5b2dff0c..85800314 100644 --- a/nextflow.config +++ b/nextflow.config @@ -214,7 +214,7 @@ manifest { mainScript = 'main.nf' defaultBranch = 'main' nextflowVersion = '!>=26.04.0' - version = '3.0.2' + version = '3.1.0' doi = '' } diff --git a/ro-crate-metadata.json b/ro-crate-metadata.json index e66cfe12..0d28511a 100644 --- a/ro-crate-metadata.json +++ b/ro-crate-metadata.json @@ -1,6 +1,6 @@ { "@context": [ - "https://w3id.org/ro/crate/1.1/context", + "https://w3id.org/ro/crate/1.2/context", { "GithubService": "https://w3id.org/ro/terms/test#GithubService", "JenkinsService": "https://w3id.org/ro/terms/test#JenkinsService", @@ -22,8 +22,8 @@ "@id": "./", "@type": "Dataset", "creativeWorkStatus": "Stable", - "datePublished": "2026-05-27T13:33:39+00:00", - "description": "# nf-cmgg/preprocessing\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-cmgg/preprocessing)\n[![GitHub Actions CI Status](https://github.com/nf-cmgg/preprocessing/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-cmgg/preprocessing/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-cmgg/preprocessing/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-cmgg/preprocessing/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A526.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with 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-cmgg/preprocessing)\n\n## Introduction\n\n**nf-cmgg/preprocessing** is a bioinformatics pipeline that demultiplexes and aligns raw sequencing data.\nIt also performs basic QC and coverage analysis.\n\nThe pipeline is built using Nextflow, a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible.\n\nSteps include:\n\n- Demultiplexing using [`BCLconvert`](https://emea.support.illumina.com/sequencing/sequencing_software/bcl-convert.html)\n- Run QC using [`MultiQC SAV`](https://github.com/MultiQC/MultiQC_SAV)\n- Read QC and trimming using [`fastp`](https://github.com/OpenGene/fastp) or [`falco`](https://github.com/smithlabcode/falco)\n- Alignment using either [`bwa`](https://github.com/lh3/bwa), [`bwa-mem2`](https://github.com/bwa-mem2/bwa-mem2), [`bowtie2`](https://github.com/BenLangmead/bowtie2), [`dragmap`](https://github.com/Illumina/DRAGMAP), [`snap`](https://github.com/amplab/snap) or [`strobe`](https://github.com/ksahlin/strobealign) for DNA-seq and [`STAR`](https://github.com/alexdobin/STAR) for RNA-seq\n- Duplicate marking using [`bamsormadup`](https://gitlab.com/german.tischler/biobambam2) or [`samtools markdup`](http://www.htslib.org/doc/samtools-markdup.html)\n- Coverage analysis using [`mosdepth`](https://github.com/brentp/mosdepth) and [`samtools coverage`](http://www.htslib.org/doc/samtools-coverage.html)\n- Alignment QC using [`samtools flagstat`](http://www.htslib.org/doc/samtools-flagstat.html), [`samtools stats`](http://www.htslib.org/doc/samtools-stats.html), [`samtools idxstats`](http://www.htslib.org/doc/samtools-idxstats.html) and [`picard CollectHsMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectHsMetrics), [`picard CollectWgsMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectWgsMetrics), [`picard CollectMultipleMetrics`](https://broadinstitute.github.io/picard/command-line-overview.html#CollectMultipleMetrics)\n- QC aggregation using [`multiqc`](https://multiqc.info/)\n\n\n\n \n \n \"Fallback\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\nThe full documentation can be found [here](docs/README.md)\n\nFirst, prepare a samplesheet with your input data. Check the [usage docs](docs/usage.md) for details on the required format and example files.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-cmgg/preprocessing \\\n -profile \\\n --igenomes_base /path/to/genomes \\\n --input samplesheet. \\\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**_;\n> see [docs](https://nf-co.re/usage/configuration#custom-configuration-files).\n\n## Development environment\n\nA [pixi](https://pixi.prefix.dev/latest/) development environment is available for this pipeline. Run the following command to install the environment:\n\n```\npixi install\n```\n\nThen run `pixi shell` to enter the environment and start developing.\n\n## Credits\n\nnf-cmgg/preprocessing was originally written by the CMGG ICT team.\n\n## Support\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/master/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", + "datePublished": "2026-06-29T10:38:32+00:00", + "description": "# nf-cmgg/preprocessing\n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/nf-cmgg/preprocessing)\n[![GitHub Actions CI Status](https://github.com/nf-cmgg/preprocessing/actions/workflows/nf-test.yml/badge.svg)](https://github.com/nf-cmgg/preprocessing/actions/workflows/nf-test.yml)\n[![GitHub Actions Linting Status](https://github.com/nf-cmgg/preprocessing/actions/workflows/linting.yml/badge.svg)](https://github.com/nf-cmgg/preprocessing/actions/workflows/linting.yml)[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX)\n[![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com)\n\n[![Nextflow](https://img.shields.io/badge/version-%E2%89%A526.04.0-green?style=flat&logo=nextflow&logoColor=white&color=%230DC09D&link=https%3A%2F%2Fnextflow.io)](https://www.nextflow.io/)\n[![nf-core template version](https://img.shields.io/badge/nf--core_template-3.5.1-green?style=flat&logo=nfcore&logoColor=white&color=%2324B064&link=https%3A%2F%2Fnf-co.re)](https://github.com/nf-core/tools/releases/tag/3.5.1)\n[![run with 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-cmgg/preprocessing)\n\n## Introduction\n\n**nf-cmgg/preprocessing** is a bioinformatics pipeline that demultiplexes and aligns raw sequencing data.\nIt also performs basic QC and coverage analysis.\n\nThe pipeline is built using Nextflow, a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It comes with docker containers making installation trivial and results highly reproducible.\n\nSteps include:\n\n- Demultiplexing using [`BCLconvert`](https://emea.support.illumina.com/sequencing/sequencing_software/bcl-convert.html)\n- Run QC using [`MultiQC SAV`](https://github.com/MultiQC/MultiQC_SAV)\n- Read QC and trimming using [`fastp`](https://github.com/OpenGene/fastp) or [`falco`](https://github.com/smithlabcode/falco)\n- Alignment using either [`bwa`](https://github.com/lh3/bwa), [`bwa-mem2`](https://github.com/bwa-mem2/bwa-mem2), [`bowtie2`](https://github.com/BenLangmead/bowtie2), [`dragmap`](https://github.com/Illumina/DRAGMAP), [`snap`](https://github.com/amplab/snap) or [`strobe`](https://github.com/ksahlin/strobealign) for DNA-seq and [`STAR`](https://github.com/alexdobin/STAR) for RNA-seq\n- Duplicate marking using [`bamsormadup`](https://gitlab.com/german.tischler/biobambam2) or [`samtools markdup`](http://www.htslib.org/doc/samtools-markdup.html)\n- Coverage analysis using [`mosdepth`](https://github.com/brentp/mosdepth) and [`samtools coverage`](http://www.htslib.org/doc/samtools-coverage.html)\n- Alignment QC using [`samtools flagstat`](http://www.htslib.org/doc/samtools-flagstat.html), [`samtools stats`](http://www.htslib.org/doc/samtools-stats.html), [`samtools idxstats`](http://www.htslib.org/doc/samtools-idxstats.html) and [`riker multi`](https://github.com/fulcrumgenomics/riker)\n- QC aggregation using [`multiqc`](https://multiqc.info/)\n\n\n\n \n \n \"Fallback\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\nThe full documentation can be found [here](docs/README.md)\n\nFirst, prepare a samplesheet with your input data. Check the [usage docs](docs/usage.md) for details on the required format and example files.\n\nNow, you can run the pipeline using:\n\n```bash\nnextflow run nf-cmgg/preprocessing \\\n -profile \\\n --igenomes_base /path/to/genomes \\\n --input samplesheet. \\\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**_;\n> see [docs](https://nf-co.re/usage/configuration#custom-configuration-files).\n\n## Development environment\n\nA [pixi](https://pixi.prefix.dev/latest/) development environment is available for this pipeline. Run the following command to install the environment:\n\n```\npixi install\n```\n\nThen run `pixi shell` to enter the environment and start developing.\n\n## Credits\n\nnf-cmgg/preprocessing was originally written by the CMGG ICT team.\n\n## Support\n\nThis pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/master/LICENSE).\n\n> **The nf-core framework for community-curated bioinformatics pipelines.**\n>\n> Philip Ewels, Alexander Peltzer, Sven Fillinger, Harshil Patel, Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso & Sven Nahnsen.\n>\n> _Nat Biotechnol._ 2020 Feb 13. doi: [10.1038/s41587-020-0439-x](https://dx.doi.org/10.1038/s41587-020-0439-x).\n", "hasPart": [ { "@id": "main.nf" @@ -102,7 +102,7 @@ }, "mentions": [ { - "@id": "#cb12ae76-cc32-4dd8-b67d-d06d643513d2" + "@id": "#22d028dc-4626-404a-b4d0-bea7c3daf9b3" } ], "name": "nf-cmgg/preprocessing" @@ -115,7 +115,7 @@ }, "conformsTo": [ { - "@id": "https://w3id.org/ro/crate/1.1" + "@id": "https://w3id.org/ro/crate/1.2" }, { "@id": "https://w3id.org/workflowhub/workflow-ro-crate/1.0" @@ -134,11 +134,8 @@ "@id": "https://orcid.org/0000-0003-2555-3114" } ], - "dateCreated": [ - "", - "2026-05-20T09:02:37Z" - ], - "dateModified": "2026-05-27T15:33:39Z", + "dateCreated": "", + "dateModified": "2026-06-29T12:38:32Z", "dct:conformsTo": "https://bioschemas.org/profiles/ComputationalWorkflow/1.0-RELEASE/", "keywords": [ "nf-core", @@ -166,10 +163,10 @@ }, "url": [ "https://github.com/nf-cmgg/preprocessing", - "https://nf-co.re/nf-cmgg/preprocessing/3.0.2/" + "https://nf-co.re/nf-cmgg/preprocessing/3.1.0/" ], "version": [ - "3.0.2" + "3.1.0" ] }, { @@ -185,11 +182,11 @@ "version": "!>=26.04.0" }, { - "@id": "#cb12ae76-cc32-4dd8-b67d-d06d643513d2", + "@id": "#22d028dc-4626-404a-b4d0-bea7c3daf9b3", "@type": "TestSuite", "instance": [ { - "@id": "#f36a54e6-3b86-47eb-8f1d-f94369a34a5c" + "@id": "#a98fa9b8-526c-4709-9410-471ff7f35512" } ], "mainEntity": { @@ -198,7 +195,7 @@ "name": "Test suite for nf-cmgg/preprocessing" }, { - "@id": "#f36a54e6-3b86-47eb-8f1d-f94369a34a5c", + "@id": "#a98fa9b8-526c-4709-9410-471ff7f35512", "@type": "TestInstance", "name": "GitHub Actions workflow for testing nf-cmgg/preprocessing", "resource": "repos/nf-cmgg/preprocessing/actions/workflows/nf-test.yml", From a7e2e1ee5cf7ddd415db3a00f019d648a583358e Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 30 Jun 2026 10:37:40 +0200 Subject: [PATCH 14/62] drop hook_url param --- CHANGELOG.md | 1 + docs/parameters.md | 1 - main.nf | 3 --- nextflow.config | 1 - nextflow_schema.json | 7 ------- 5 files changed, 1 insertion(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5a60275..44942355 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Drop `Picard` modules and associated parameters in favor of `riker multi`, which is much more efficient and now run by default. - Add `apple` profile to enable the use of Apple containers. +- Drop `hook_url` parameter. To configure messaging services, use a custom config in tandem with the `nf-teams`/`nf-slack` plugin instead. ## 3.0.2 diff --git a/docs/parameters.md b/docs/parameters.md index 0f7220fc..9fd740df 100644 --- a/docs/parameters.md +++ b/docs/parameters.md @@ -46,7 +46,6 @@ Less common options for the pipeline, typically set in a config file. | `plaintext_email` | Send plain-text email instead of HTML. | `boolean` | | | True | | `max_multiqc_email_size` | File size limit when attaching MultiQC reports to summary emails. | `string` | 25.MB | | True | | `monochrome_logs` | Do not use coloured log outputs. | `boolean` | | | True | -| `hook_url` | Incoming hook URL for messaging service
HelpIncoming hook URL for messaging service. Currently, MS Teams and Slack are supported.
| `string` | | | True | | `multiqc_config` | Custom config file to supply to MultiQC. | `string` | | | True | | `multiqc_logo` | Custom logo file to supply to MultiQC. File name must also be set in the MultiQC config file | `string` | | | True | | `multiqc_methods_description` | Custom MultiQC yaml file containing HTML including a methods description. | `string` | | | | diff --git a/main.nf b/main.nf index c618c6b7..31c65fbd 100644 --- a/main.nf +++ b/main.nf @@ -80,9 +80,6 @@ params { // Do not use coloured log outputs. monochrome_logs: Boolean = false - // Incoming hook URL for messaging service - hook_url: String = System.getenv('HOOK_URL') - // Custom config file to supply to MultiQC. multiqc_config: Path? diff --git a/nextflow.config b/nextflow.config index 85800314..e374ea64 100644 --- a/nextflow.config +++ b/nextflow.config @@ -13,7 +13,6 @@ params { publish_dir_mode = 'copy' monochrome_logs = false - hook_url = System.getenv('HOOK_URL') pipelines_testdata_base_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/' trace_report_suffix = new java.util.Date().format('yyyy-MM-dd_HH-mm-ss') diff --git a/nextflow_schema.json b/nextflow_schema.json index 36936165..55ee6080 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -174,13 +174,6 @@ "fa_icon": "fas fa-palette", "hidden": true }, - "hook_url": { - "type": "string", - "description": "Incoming hook URL for messaging service", - "fa_icon": "fas fa-people-group", - "help_text": "Incoming hook URL for messaging service. Currently, MS Teams and Slack are supported.", - "hidden": true - }, "multiqc_config": { "type": "string", "format": "file-path", From 75377ee2815e76e07a2580c2d30c2b3923f5c157 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:20:25 +0200 Subject: [PATCH 15/62] add riker config --- conf/modules.config | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/conf/modules.config b/conf/modules.config index d98252e1..b83bdb94 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -257,6 +257,10 @@ process { memory = 1.GB } + withName: '.*BAM_QC:RIKER_MULTI' { + ext.args = {"--tools alignment basic error gcbias isize" + meta.roi ? "hybcap" : "wgs"} + } + withName: '.*MD5SUM' { cpus = 1 memory = 128.MB From 2eccc8c0221e8fcd004dc43fa896a311b2c18ae3 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:32:07 +0200 Subject: [PATCH 16/62] udpate riker config, fix snapshots --- conf/modules.config | 2 +- .../local/bam_qc/main.nf.test.snap | 48 ++++++++++++++----- tests/workflows/preprocessing.nf.test.snap | 27 ++++++++--- 3 files changed, 57 insertions(+), 20 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b83bdb94..02f91a86 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -258,7 +258,7 @@ process { } withName: '.*BAM_QC:RIKER_MULTI' { - ext.args = {"--tools alignment basic error gcbias isize" + meta.roi ? "hybcap" : "wgs"} + ext.args = {"--tools alignment basic gcbias isize" + (meta.roi ? " hybcap" : " wgs")} } withName: '.*MD5SUM' { diff --git a/tests/subworkflows/local/bam_qc/main.nf.test.snap b/tests/subworkflows/local/bam_qc/main.nf.test.snap index 999a1298..a0e3258f 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test.snap +++ b/tests/subworkflows/local/bam_qc/main.nf.test.snap @@ -39,13 +39,19 @@ "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" ] ] ], @@ -59,13 +65,19 @@ "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" ] ] ], @@ -98,7 +110,7 @@ ] } ], - "timestamp": "2026-06-29T11:24:42.884004", + "timestamp": "2026-06-30T12:31:25.374584", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -142,15 +154,21 @@ }, [ "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.pdf:md5,43dcb037a557e5cbf784f340cadc02e1", "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" ] ] ], @@ -162,15 +180,21 @@ }, [ "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.pdf:md5,43dcb037a557e5cbf784f340cadc02e1", "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" ] ] ], @@ -203,7 +227,7 @@ ] } ], - "timestamp": "2026-06-29T11:25:01.12339", + "timestamp": "2026-06-30T12:31:35.949323", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index 29c6754d..fc5354fa 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -489,6 +489,10 @@ "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", + "sample1.gcbias-chart.pdf:md5,76b876df43ac778292fc03bcdc90398c", + "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c", + "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f", + "sample1.hybcap-metrics.txt:md5,0e5cf0bfd2f1142f56462ec7cf4c990c", "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", @@ -651,10 +655,10 @@ ] } ], - "timestamp": "2026-06-15T08:36:58.835655", + "timestamp": "2026-06-30T12:27:10.368379", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.3" + "nextflow": "26.04.4" } }, "preprocessing - fastq - bwa - bamsormadup - no roi": { @@ -1058,12 +1062,17 @@ "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", + "sample1.gcbias-chart.pdf:md5,76b876df43ac778292fc03bcdc90398c", + "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c", + "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f", "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", - "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" + "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a", + "sample1.wgs-coverage.txt:md5,4387e3d5a1046eb409a8ebb451fabcc7", + "sample1.wgs-metrics.txt:md5,05c64580c5ea68ba1987c56c4cc31968" ] ] ], @@ -1215,10 +1224,10 @@ ] } ], - "timestamp": "2026-06-15T08:38:36.674001", + "timestamp": "2026-06-30T12:28:33.877205", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.3" + "nextflow": "26.04.4" } }, "preprocessing - fastq - bwa - bamsormadup - roi - no coverage": { @@ -1477,6 +1486,10 @@ "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", + "sample1.gcbias-chart.pdf:md5,76b876df43ac778292fc03bcdc90398c", + "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c", + "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f", + "sample1.hybcap-metrics.txt:md5,7cae4a6cf3b7b4bf0958553c1c89ed62", "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", @@ -1613,10 +1626,10 @@ ] } ], - "timestamp": "2026-06-15T09:20:27.039822", + "timestamp": "2026-06-30T12:29:57.195562", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.3" + "nextflow": "26.04.4" } }, "preprocessing - flowcell - bwa - bamsormadup - roi": { From 7d81157c14d6842820047b91dbfad968c44ecad0 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 30 Jun 2026 13:50:52 +0200 Subject: [PATCH 17/62] drop `run_coverage` in favor of `qc_mode`, merge bam_qc and coverage subwf, fix tests --- CHANGELOG.md | 1 + assets/schema_input.json | 11 +- assets/schema_sampleinfo.json | 11 +- conf/modules.config | 23 +- docs/usage.md | 46 +- subworkflows/local/bam_qc/main.nf | 84 +- tests/subworkflows/local/bam_qc/main.nf.test | 103 +- .../local/bam_qc/main.nf.test.snap | 1557 ++++++++++++++++- .../subworkflows/local/coverage/main.nf.test | 67 - .../local/coverage/main.nf.test.snap | 506 ------ tests/workflows/preprocessing.nf.test | 14 +- tests/workflows/preprocessing.nf.test.snap | 866 +++++---- workflows/preprocessing.nf | 68 +- 13 files changed, 2238 insertions(+), 1119 deletions(-) delete mode 100644 tests/subworkflows/local/coverage/main.nf.test delete mode 100644 tests/subworkflows/local/coverage/main.nf.test.snap diff --git a/CHANGELOG.md b/CHANGELOG.md index 44942355..b717ea18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Drop `Picard` modules and associated parameters in favor of `riker multi`, which is much more efficient and now run by default. - Add `apple` profile to enable the use of Apple containers. - Drop `hook_url` parameter. To configure messaging services, use a custom config in tandem with the `nf-teams`/`nf-slack` plugin instead. +- Drop `run_coverage` and add `qc_mode` parameter. Thorough coveage analysis is now included in the `qc_mode` parameter, which can be set to `basic` or `full`. Basic QC includes samtools flagstat, idxstats and mosdepth. Full QC includes samtools stats, samtools coverage, riker metrics and panel coverage in addition to basic QC. ## 3.0.2 diff --git a/assets/schema_input.json b/assets/schema_input.json index 248fed5a..b7d61eb2 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -83,11 +83,12 @@ "description": "Adapter sequence to trim from read 2", "default": null }, - "run_coverage": { - "meta": ["run_coverage"], - "type": "boolean", - "description": "Whether to run coverage analysis for the sample", - "default": true + "qc_mode": { + "meta": ["qc_mode"], + "type": "string", + "enum": ["basic", "full"], + "description": "Whether to run full QC for the sample. Basic QC includes samtools flagstat, idxstats and mosdepth. Full QC includes samtools stats, samtools coverage, riker metrics and panel coverage in addition to basic QC.", + "default": "basic" }, "roi": { "meta": ["roi"], diff --git a/assets/schema_sampleinfo.json b/assets/schema_sampleinfo.json index c1938956..e1acad33 100644 --- a/assets/schema_sampleinfo.json +++ b/assets/schema_sampleinfo.json @@ -123,11 +123,12 @@ "description": "Adapter sequence to trim from read 2", "default": null }, - "run_coverage": { - "meta": ["run_coverage"], - "type": "boolean", - "description": "Whether to run coverage analysis for the sample", - "default": true + "qc_mode": { + "meta": ["qc_mode"], + "type": "string", + "enum": ["basic", "full"], + "description": "Whether to run full QC for the sample. Basic QC includes samtools flagstat, idxstats and mosdepth. Full QC includes samtools stats, samtools coverage, riker metrics and panel coverage in addition to basic QC.", + "default": "basic" }, "roi": { "meta": ["roi"], diff --git a/conf/modules.config b/conf/modules.config index 02f91a86..b2e79466 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -231,9 +231,9 @@ process { } } - // coverage + // QC //// Mosdepth - withName: '.*COVERAGE:MOSDEPTH' { + withName: '.*BAM_QC:MOSDEPTH' { cpus = 4 memory = { 4.GB * task.attempt } ext.args = [ @@ -243,24 +243,25 @@ process { ].join(" ").trim() } - //// Samtools coverage - withName: '.*COVERAGE:SAMTOOLS_COVERAGE' { - cpus = 1 - memory = 1.GB - ext.prefix = { "${meta.id}.coverage" } - } - - // QC - + //// Samtools/* withName: '.*BAM_QC:SAMTOOLS_.*$' { cpus = 1 memory = 1.GB } + //// Samtools/coverage + withName: '.*BAM_QC:SAMTOOLS_COVERAGE' { + cpus = 1 + memory = 1.GB + ext.prefix = { "${meta.id}.coverage" } + } + + //// Riker/multi withName: '.*BAM_QC:RIKER_MULTI' { ext.args = {"--tools alignment basic gcbias isize" + (meta.roi ? " hybcap" : " wgs")} } + //// MD5SUM withName: '.*MD5SUM' { cpus = 1 memory = 128.MB diff --git a/docs/usage.md b/docs/usage.md index 09ab7485..535d3c6d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -31,7 +31,7 @@ A `fastq` samplesheet file consisting of paired-end data may look something like trim_tail: 0 adapter_R1: AGATCGGAAGAGCACACGTCTGAACTCCTTA adapter_R2: AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT - run_coverage: true + qc_mode: basic roi: null tag: WES sample_type: DNA @@ -41,27 +41,27 @@ A `fastq` samplesheet file consisting of paired-end data may look something like Following table shows the fields that are used by the `fastq` samplesheet: -| Column | Description | Required | -| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | -| `id` | Unique sample identifier | :heavy_check_mark: | -| `samplename` | The sample name corresponding to the sample in the Fastq file(s) | :heavy_check_mark: | -| `genome` | The genome build to use for the analysis. Currently supports `GRCh38`, `GRCm39` and `GRCz11` | :heavy_check_mark: (unless `organism` is given) | -| `organism` | Full name of the organism. Currently supports `Homo sapiens`, `Mus musculus` and `Danio rerio` | :heavy_check_mark: (unless `genome` is given) | -| `library` | Sample library name | :x: | -| `tag` | The tag used by the sample. Can be one of `WES`, `WGS`, `SeqCap` and `coPGT-M` | :x: | -| `aligner` | The aligner to use for this sample. Can be one of these: `bowtie2`, `bwamem`, `bwamem2`, `dragmap`, `strobe` and `snap`. Set to `false` to output fastq. | :heavy_check_mark: | -| `markdup` | Markdup algorithm to use for duplicate marking. Can be set to `bamsormadup`, `samtools` or `false` | :x: | -| `umi_aware` | Whether UMI-aware processing should be used. Only applies when `markdup` is set to `samtools` | :x: | -| `skip_trimming` | Skip adapter trimming step | :x: | -| `trim_front` | Number of bases to trim from the front of reads | :x: | -| `trim_tail` | Number of bases to trim from the tail of reads | :x: | -| `adapter_R1` | Adapter sequence for read 1 | :x: | -| `adapter_R2` | Adapter sequence for read 2 | :x: | -| `run_coverage` | Run coverage analysis | :x: | -| `roi` | The path to a BED file containing Regions Of Interest for coverage analysis | :x: | -| `sample_type` | Sample type (e.g., `DNA`, `RNA`) | :x: | -| `fastq_1` | FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :heavy_check_mark: | -| `fastq_2` | FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :x: | +| Column | Description | Required | +| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| `id` | Unique sample identifier | :heavy_check_mark: | +| `samplename` | The sample name corresponding to the sample in the Fastq file(s) | :heavy_check_mark: | +| `genome` | The genome build to use for the analysis. Currently supports `GRCh38`, `GRCm39` and `GRCz11` | :heavy_check_mark: (unless `organism` is given) | +| `organism` | Full name of the organism. Currently supports `Homo sapiens`, `Mus musculus` and `Danio rerio` | :heavy_check_mark: (unless `genome` is given) | +| `library` | Sample library name | :x: | +| `tag` | The tag used by the sample. Can be one of `WES`, `WGS`, `SeqCap` and `coPGT-M` | :x: | +| `aligner` | The aligner to use for this sample. Can be one of these: `bowtie2`, `bwamem`, `bwamem2`, `dragmap`, `strobe` and `snap`. Set to `false` to output fastq. | :heavy_check_mark: | +| `markdup` | Markdup algorithm to use for duplicate marking. Can be set to `bamsormadup`, `samtools` or `false` | :x: | +| `umi_aware` | Whether UMI-aware processing should be used. Only applies when `markdup` is set to `samtools` | :x: | +| `skip_trimming` | Skip adapter trimming step | :x: | +| `trim_front` | Number of bases to trim from the front of reads | :x: | +| `trim_tail` | Number of bases to trim from the tail of reads | :x: | +| `adapter_R1` | Adapter sequence for read 1 | :x: | +| `adapter_R2` | Adapter sequence for read 2 | :x: | +| `qc_mode` | QC mode for the sample. Can be set to `basic` or `full`. Basic QC includes samtools flagstat, idxstats and mosdepth. Full QC includes samtools stats, samtools coverage, riker metrics and panel coverage in addition to basic QC. | :x: | +| `roi` | The path to a BED file containing Regions Of Interest for coverage analysis | :x: | +| `sample_type` | Sample type (e.g., `DNA`, `RNA`) | :x: | +| `fastq_1` | FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :heavy_check_mark: | +| `fastq_2` | FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :x: | An [example samplesheet](../tests/inputs/test.yml) has been provided with the pipeline. @@ -105,7 +105,7 @@ A `flowcell` sample info JSON/YML file consisting for one sequencing run may loo trim_tail: 0 adapter_R1: AGATCGGAAGAGCACACGTCTGAACTCCTTA adapter_R2: AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT - run_coverage: true + qc_mode: basic roi: null tag: WES sample_type: DNA diff --git a/subworkflows/local/bam_qc/main.nf b/subworkflows/local/bam_qc/main.nf index e38493d4..0ec802c5 100644 --- a/subworkflows/local/bam_qc/main.nf +++ b/subworkflows/local/bam_qc/main.nf @@ -1,23 +1,25 @@ -// samtools modules -include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' -include { SAMTOOLS_IDXSTATS } from '../../../modules/nf-core/samtools/idxstats/main' -include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/main' - -// riker modules +include { MOSDEPTH } from "../../../modules/nf-core/mosdepth/main.nf" +include { PANELCOVERAGE } from "../../../modules/local/panelcoverage/main" include { RIKER_MULTI } from '../../../modules/nf-core/riker/multi/main' +include { SAMTOOLS_COVERAGE } from "../../../modules/nf-core/samtools/coverage/main" +include { SAMTOOLS_FLAGSTAT } from '../../../modules/nf-core/samtools/flagstat/main' +include { SAMTOOLS_IDXSTATS } from '../../../modules/nf-core/samtools/idxstats/main' +include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main' workflow BAM_QC { take: ch_bam_bai_roi_fasta_fai // channel: [ val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai)] + ch_genelists // channel: [optional] [genelists] main: + ch_bam_bai_roi_fasta_fai .map { meta, bam, bai, _roi, fasta, fai -> return [meta, bam, bai, fasta, fai] } .set { ch_bam_bai_fasta_fai } - SAMTOOLS_STATS(ch_bam_bai_fasta_fai) + // basic QC SAMTOOLS_FLAGSTAT(ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> return [meta, bam, bai] }) @@ -25,11 +27,73 @@ workflow BAM_QC { return [meta, bam, bai] }) - RIKER_MULTI(ch_bam_bai_roi_fasta_fai) + MOSDEPTH( + ch_bam_bai_roi_fasta_fai.map { meta, bam, bai, roi, fasta, _fai -> + return [meta, bam, bai, roi, fasta] + }, + ['NO_COVERAGE', 'LOW_COVERAGE', 'CALLABLE'] + ) + + // full QC + // Only run on samples requiring full QC + ch_full_qc = ch_bam_bai_roi_fasta_fai.filter { meta, _bam, _bai, _roi, _fasta, _fai -> + meta.qc_mode == "full" + } + + SAMTOOLS_STATS(ch_full_qc.map { meta, bam, bai, _roi, fasta, fai -> + return [meta, bam, bai, fasta, fai] + }) + + RIKER_MULTI(ch_full_qc) + + SAMTOOLS_COVERAGE( + ch_full_qc.map { meta, bam, bai, _roi, fasta, fai -> + return [meta, bam, bai, fasta, fai] + } + ) + + PANELCOVERAGE( + MOSDEPTH.out.per_base_bed.join(MOSDEPTH.out.per_base_csi) + .combine(ch_genelists) + .filter{ meta, _bed, _index, _genelists -> meta.qc_mode == "full" } + .map { meta, bed, index, genelists -> + // Because groovy typing sucks ass; apparently an array of 1 is automatically converted to a string... + if (genelists !instanceof List) { + genelists = [genelists] + } + def filtered_genelists = (meta.tag && meta.tag.toLowerCase() == "seqcap") + ? genelists.findAll { genelist -> genelist.name.toLowerCase().contains("seqcap") } + : genelists.findAll { genelist -> !genelist.name.toLowerCase().contains("seqcap") } + + if (filtered_genelists.size() > 0) { + return [ + meta, + bed, + index, + filtered_genelists, + ] + } + } + ) + emit: - samtools_stats = SAMTOOLS_STATS.out.stats + mosdepth_global = MOSDEPTH.out.global_txt + mosdepth_per_base_bed = MOSDEPTH.out.per_base_bed + mosdepth_per_base_csi = MOSDEPTH.out.per_base_csi + mosdepth_per_base_d4 = MOSDEPTH.out.per_base_d4 + mosdepth_quantized_bed = MOSDEPTH.out.quantized_bed + mosdepth_quantized_csi = MOSDEPTH.out.quantized_csi + mosdepth_regions = MOSDEPTH.out.regions_txt + mosdepth_regions_bed = MOSDEPTH.out.regions_bed + mosdepth_regions_csi = MOSDEPTH.out.regions_csi + mosdepth_summary = MOSDEPTH.out.summary_txt + mosdepth_thresholds_bed = MOSDEPTH.out.thresholds_bed + mosdepth_thresholds_csi = MOSDEPTH.out.thresholds_csi + panelcoverage = PANELCOVERAGE.out.regiondist + riker_metrics = RIKER_MULTI.out.metrics + samtools_coverage = SAMTOOLS_COVERAGE.out.coverage samtools_flagstat = SAMTOOLS_FLAGSTAT.out.flagstat samtools_idxstats = SAMTOOLS_IDXSTATS.out.idxstats - riker_metrics = RIKER_MULTI.out.metrics + samtools_stats = SAMTOOLS_STATS.out.stats } diff --git a/tests/subworkflows/local/bam_qc/main.nf.test b/tests/subworkflows/local/bam_qc/main.nf.test index 2f2f3adf..010b235e 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test +++ b/tests/subworkflows/local/bam_qc/main.nf.test @@ -8,20 +8,23 @@ nextflow_workflow { tag "subworkflows/local" tag "subworkflows/local/bam_qc" - test("Bam QC - HSmetrics") { + test("bam QC - basic - no roi") { when { workflow { """ // [meta, bam, bai, roi, fasta, fai] input[0] = Channel.of([ - [ id:'test', single_end:false ], + [ id:'test', single_end:false, qc_mode:'basic' ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), + [], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), ]) + // genelists + def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" + input[1] = channel.fromPath(genelists_path + "/*.bed").collect().map{ files -> [ files ] }.ifEmpty { channel.empty() } """ } } @@ -33,19 +36,79 @@ nextflow_workflow { } - test("Bam QC - WGSmetrics") { + test("bam QC - full - no roi") { + when { workflow { """ // [meta, bam, bai, roi, fasta, fai] input[0] = Channel.of([ - [ id:'test', single_end:false ], + [ id:'test', single_end:false, qc_mode:'full' ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), [], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), ]) + // genelists + def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" + input[1] = channel.fromPath(genelists_path + "/*.bed").collect().map{ files -> [ files ] }.ifEmpty { channel.empty() } + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out).match() + } + + } + + test("bam QC - basic - roi") { + + when { + workflow { + """ + // [meta, bam, bai, roi, fasta, fai] + input[0] = Channel.of([ + [ id:'test', single_end:false, qc_mode:'basic' ], + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + ]) + // genelists + def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" + input[1] = channel.fromPath(genelists_path + "/*.bed").collect().map{ files -> [ files ] }.ifEmpty { channel.empty() } + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out).match() + } + + } + + test("bam QC - full - roi - WES") { + + when { + workflow { + """ + // [meta, bam, bai, roi, fasta, fai] + input[0] = Channel.of([ + [ id:'test', single_end:false, qc_mode:'full', tag:'WES' ], + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + ]) + // genelists + def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" + input[1] = channel.fromPath(genelists_path + "/*.bed").collect().map{ files -> [ files ] }.ifEmpty { channel.empty() } """ } } @@ -54,5 +117,35 @@ nextflow_workflow { assert workflow.success assert snapshot(workflow.out).match() } + + } + + + test("bam QC - full - roi - seqcap") { + + when { + workflow { + """ + // [meta, bam, bai, roi, fasta, fai] + input[0] = Channel.of([ + [ id:'test', single_end:false, qc_mode:'full', tag:'seqcap' ], + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + ]) + // genelists + def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" + input[1] = channel.fromPath(genelists_path + "/*.bed").collect().map{ files -> [ files ] }.ifEmpty { channel.empty() } + """ + } + } + + then { + assert workflow.success + assert snapshot(workflow.out).match() + } + } } diff --git a/tests/subworkflows/local/bam_qc/main.nf.test.snap b/tests/subworkflows/local/bam_qc/main.nf.test.snap index a0e3258f..099c4a30 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test.snap +++ b/tests/subworkflows/local/bam_qc/main.nf.test.snap @@ -1,57 +1,1276 @@ { - "Bam QC - HSmetrics": { + "bam QC - basic - no roi": { "content": [ { "0": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + + ], + "13": [ + + ], + "14": [ + + ], + "15": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "16": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "17": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.summary.txt:md5,6c29875b821ba44f5cc5254a2339db90" + ] + ], + "mosdepth_global": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "mosdepth_per_base_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "mosdepth_per_base_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "mosdepth_per_base_d4": [ + + ], + "mosdepth_quantized_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "mosdepth_quantized_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "mosdepth_regions": [ + + ], + "mosdepth_regions_bed": [ + + ], + "mosdepth_regions_csi": [ + + ], + "mosdepth_summary": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.summary.txt:md5,6c29875b821ba44f5cc5254a2339db90" + ] + ], + "mosdepth_thresholds_bed": [ + + ], + "mosdepth_thresholds_csi": [ + + ], + "panelcoverage": [ + + ], + "riker_metrics": [ + + ], + "samtools_coverage": [ + + ], + "samtools_flagstat": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "samtools_idxstats": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "samtools_stats": [ + + ] + } + ], + "timestamp": "2026-06-30T13:45:28.834986", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam QC - full - roi - WES": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + [ + "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", + "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + [ + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" + ] + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "16": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "17": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + ] + ], + "mosdepth_global": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "mosdepth_per_base_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "mosdepth_per_base_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "mosdepth_per_base_d4": [ + + ], + "mosdepth_quantized_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "mosdepth_quantized_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "mosdepth_regions": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + ] + ], + "mosdepth_regions_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + ] + ], + "mosdepth_regions_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + ] + ], + "mosdepth_summary": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + ] + ], + "mosdepth_thresholds_bed": [ + + ], + "mosdepth_thresholds_csi": [ + + ], + "panelcoverage": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + [ + "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", + "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "riker_metrics": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + [ + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" + ] + ] + ], + "samtools_coverage": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + ] + ], + "samtools_flagstat": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "samtools_idxstats": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "samtools_stats": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "WES" + }, + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + ] + ] + } + ], + "timestamp": "2026-06-30T13:46:19.404056", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam QC - full - roi - seqcap": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test_seqcap_Connective_tissue_per_exon.mosdepth.region.dist.txt:md5,e098c901acb1da8c2cf64a248306e71c" + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + [ + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" + ] + ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + ] + ], + "15": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "16": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "17": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "6": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + ] + ], + "7": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + ] + ], + "8": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + ] + ], + "mosdepth_global": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "mosdepth_per_base_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "mosdepth_per_base_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "mosdepth_per_base_d4": [ + + ], + "mosdepth_quantized_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "mosdepth_quantized_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "mosdepth_regions": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + ] + ], + "mosdepth_regions_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + ] + ], + "mosdepth_regions_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + ] + ], + "mosdepth_summary": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + ] + ], + "mosdepth_thresholds_bed": [ + + ], + "mosdepth_thresholds_csi": [ + + ], + "panelcoverage": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test_seqcap_Connective_tissue_per_exon.mosdepth.region.dist.txt:md5,e098c901acb1da8c2cf64a248306e71c" + ] + ], + "riker_metrics": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + [ + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" + ] + ] + ], + "samtools_coverage": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + ] + ], + "samtools_flagstat": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "samtools_idxstats": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + ] + ], + "samtools_stats": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" }, "test.stats:md5,ff81063faa5cf509f16044c4160733b5" ] + ] + } + ], + "timestamp": "2026-06-30T13:46:37.813735", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam QC - full - no roi": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + [ + "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", + "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + ], + "13": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + [ + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", + "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", + "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", + "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", + "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", + "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" + ] + ] ], - "1": [ + "14": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + ] + ], + "15": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "full" }, "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" ] ], - "2": [ + "16": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "full" }, "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] ], + "17": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], "3": [ + + ], + "4": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "5": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "6": [ + + ], + "7": [ + + ], + "8": [ + + ], + "9": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.mosdepth.summary.txt:md5,6c29875b821ba44f5cc5254a2339db90" + ] + ], + "mosdepth_global": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "mosdepth_per_base_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "mosdepth_per_base_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "mosdepth_per_base_d4": [ + + ], + "mosdepth_quantized_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "mosdepth_quantized_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "mosdepth_regions": [ + + ], + "mosdepth_regions_bed": [ + + ], + "mosdepth_regions_csi": [ + + ], + "mosdepth_summary": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.mosdepth.summary.txt:md5,6c29875b821ba44f5cc5254a2339db90" + ] + ], + "mosdepth_thresholds_bed": [ + + ], + "mosdepth_thresholds_csi": [ + + ], + "panelcoverage": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "full" }, [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" + "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", + "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] ], @@ -59,7 +1278,8 @@ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "full" }, [ "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", @@ -71,7 +1291,7 @@ "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", + "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", @@ -81,11 +1301,22 @@ ] ] ], + "samtools_coverage": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full" + }, + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + ] + ], "samtools_flagstat": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "full" }, "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" ] @@ -94,7 +1325,8 @@ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "full" }, "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] @@ -103,131 +1335,288 @@ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "full" }, "test.stats:md5,ff81063faa5cf509f16044c4160733b5" ] ] } ], - "timestamp": "2026-06-30T12:31:25.374584", + "timestamp": "2026-06-30T13:45:47.29527", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" } }, - "Bam QC - WGSmetrics": { + "bam QC - basic - roi": { "content": [ { "0": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" ] ], "1": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "10": [ + + ], + "11": [ + + ], + "12": [ + + ], + "13": [ + + ], + "14": [ + + ], + "15": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" }, "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" ] ], - "2": [ + "16": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" }, "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] ], + "17": [ + + ], + "2": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], "3": [ + + ], + "4": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,43dcb037a557e5cbf784f340cadc02e1", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" ] ], - "riker_metrics": [ + "5": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,43dcb037a557e5cbf784f340cadc02e1", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,e5ab33ce654788037f4d6f2b41038001", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" ] ], - "samtools_flagstat": [ + "6": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" ] ], - "samtools_idxstats": [ + "7": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" ] ], - "samtools_stats": [ + "8": [ [ { "id": "test", - "single_end": false + "single_end": false, + "qc_mode": "basic" }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + ] + ], + "9": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + ] + ], + "mosdepth_global": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + ] + ], + "mosdepth_per_base_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + ] + ], + "mosdepth_per_base_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + ] + ], + "mosdepth_per_base_d4": [ + + ], + "mosdepth_quantized_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + ] + ], + "mosdepth_quantized_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + ] + ], + "mosdepth_regions": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + ] + ], + "mosdepth_regions_bed": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + ] + ], + "mosdepth_regions_csi": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + ] + ], + "mosdepth_summary": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + ] + ], + "mosdepth_thresholds_bed": [ + + ], + "mosdepth_thresholds_csi": [ + + ], + "panelcoverage": [ + + ], + "riker_metrics": [ + + ], + "samtools_coverage": [ + + ], + "samtools_flagstat": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + ] + ], + "samtools_idxstats": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "basic" + }, + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] + ], + "samtools_stats": [ + ] } ], - "timestamp": "2026-06-30T12:31:35.949323", + "timestamp": "2026-06-30T13:45:59.9134", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/tests/subworkflows/local/coverage/main.nf.test b/tests/subworkflows/local/coverage/main.nf.test deleted file mode 100644 index c13bd512..00000000 --- a/tests/subworkflows/local/coverage/main.nf.test +++ /dev/null @@ -1,67 +0,0 @@ -nextflow_workflow { - - name "Test Workflow COVERAGE" - script "subworkflows/local/coverage/main.nf" - workflow "COVERAGE" - - tag "subworkflows" - tag "subworkflows/local" - tag "subworkflows/local/coverage" - - test("Coverage - seqcap") { - - when { - workflow { - """ - // ch_meta_cram_crai_fasta_fai_roi - input[0] = Channel.of([ - [id: "test", single_end: false, tag: "seqcap"], // meta - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), - ]) - // genelists - def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" - input[1] = channel.fromPath(genelists_path + "/*.bed").collect().map{ files -> [ files ] }.ifEmpty { channel.empty() } - """ - } - } - - then { - assert workflow.success - assert snapshot(workflow.out).match() - } - - } - - test("Coverage - WES") { - - when { - workflow { - """ - // ch_meta_cram_crai_fasta_fai_roi - input[0] = Channel.of([ - [id: "test", single_end: false, tag: "WES"], // meta - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram.crai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), - file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), - ]) - // genelists - def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" - input[1] = channel.fromPath(genelists_path + "/*.bed").collect().map{ files -> [ files ] }.ifEmpty { channel.empty() } - """ - } - } - - then { - assert workflow.success - assert snapshot(workflow.out).match() - } - - } - -} diff --git a/tests/subworkflows/local/coverage/main.nf.test.snap b/tests/subworkflows/local/coverage/main.nf.test.snap deleted file mode 100644 index 0f1a2d18..00000000 --- a/tests/subworkflows/local/coverage/main.nf.test.snap +++ /dev/null @@ -1,506 +0,0 @@ -{ - "Coverage - WES": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" - ] - ], - "10": [ - - ], - "11": [ - - ], - "12": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - [ - "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", - "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" - ] - ], - "3": [ - - ], - "4": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" - ] - ], - "5": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] - ], - "9": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" - ] - ], - "mosdepth_global": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" - ] - ], - "mosdepth_per_base_bed": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" - ] - ], - "mosdepth_per_base_csi": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" - ] - ], - "mosdepth_per_base_d4": [ - - ], - "mosdepth_quantized_bed": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] - ], - "mosdepth_quantized_csi": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" - ] - ], - "mosdepth_regions": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" - ] - ], - "mosdepth_regions_bed": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" - ] - ], - "mosdepth_regions_csi": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" - ] - ], - "mosdepth_summary": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" - ] - ], - "mosdepth_thresholds_bed": [ - - ], - "mosdepth_thresholds_csi": [ - - ], - "panelcoverage": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - [ - "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", - "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "samtools_coverage": [ - [ - { - "id": "test", - "single_end": false, - "tag": "WES" - }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" - ] - ] - } - ], - "timestamp": "2026-04-30T14:26:13.856281842", - "meta": { - "nf-test": "0.9.5", - "nextflow": "25.10.4" - } - }, - "Coverage - seqcap": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" - ] - ], - "10": [ - - ], - "11": [ - - ], - "12": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test_seqcap_Connective_tissue_per_exon.mosdepth.region.dist.txt:md5,e098c901acb1da8c2cf64a248306e71c" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" - ] - ], - "3": [ - - ], - "4": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" - ] - ], - "5": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] - ], - "9": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" - ] - ], - "mosdepth_global": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" - ] - ], - "mosdepth_per_base_bed": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" - ] - ], - "mosdepth_per_base_csi": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" - ] - ], - "mosdepth_per_base_d4": [ - - ], - "mosdepth_quantized_bed": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] - ], - "mosdepth_quantized_csi": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" - ] - ], - "mosdepth_regions": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" - ] - ], - "mosdepth_regions_bed": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" - ] - ], - "mosdepth_regions_csi": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" - ] - ], - "mosdepth_summary": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" - ] - ], - "mosdepth_thresholds_bed": [ - - ], - "mosdepth_thresholds_csi": [ - - ], - "panelcoverage": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test_seqcap_Connective_tissue_per_exon.mosdepth.region.dist.txt:md5,e098c901acb1da8c2cf64a248306e71c" - ] - ], - "samtools_coverage": [ - [ - { - "id": "test", - "single_end": false, - "tag": "seqcap" - }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" - ] - ] - } - ], - "timestamp": "2026-04-30T14:25:39.573281873", - "meta": { - "nf-test": "0.9.5", - "nextflow": "25.10.4" - } - } -} \ No newline at end of file diff --git a/tests/workflows/preprocessing.nf.test b/tests/workflows/preprocessing.nf.test index 874aec15..7d9dc49b 100644 --- a/tests/workflows/preprocessing.nf.test +++ b/tests/workflows/preprocessing.nf.test @@ -7,7 +7,7 @@ nextflow_workflow { tag "workflows" tag "workflows/preprocessing" - test("preprocessing - fastq - bwa - bamsormadup - roi") { + test("preprocessing - fastq - bwa - bamsormadup - roi - full qc") { when { workflow { @@ -24,7 +24,7 @@ nextflow_workflow { sample_type: "DNA", aligner: "bwamem", markdup: "bamsormadup", - run_coverage: true, + qc_mode: "full", roi: "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed" ], //fastq_1 @@ -84,7 +84,7 @@ nextflow_workflow { } } - test("preprocessing - fastq - bwa - bamsormadup - no roi") { + test("preprocessing - fastq - bwa - bamsormadup - no roi - full qc") { when { workflow { @@ -101,7 +101,7 @@ nextflow_workflow { sample_type: "DNA", aligner: "bwamem", markdup: "bamsormadup", - run_coverage: true + qc_mode: "full" ], //fastq_1 file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/fastq/sample1_R1.fastq.gz", checkIfExists: true), @@ -161,7 +161,7 @@ nextflow_workflow { } } - test("preprocessing - fastq - bwa - bamsormadup - roi - no coverage") { + test("preprocessing - fastq - bwa - bamsormadup - roi - basic qc") { when { params { } @@ -179,7 +179,7 @@ nextflow_workflow { sample_type: "DNA", aligner: "bwamem", markdup: "bamsormadup", - run_coverage: false, + qc_mode: "basic", roi: "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed" ], //fastq_1 @@ -240,7 +240,7 @@ nextflow_workflow { } } - test("preprocessing - flowcell - bwa - bamsormadup - roi") { + test("preprocessing - flowcell - bwa - bamsormadup - roi - basic qc") { when { workflow { """ diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index fc5354fa..0a5c026f 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -1,5 +1,5 @@ { - "preprocessing - fastq - bwa - bamsormadup - roi": { + "preprocessing - fastq - bwa - bamsormadup - no roi - full qc": { "content": [ { "align_reports": [ @@ -23,12 +23,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "qc_mode": "full", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.cram", @@ -67,6 +66,7 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", + "qc_mode": "full", "readgroup": { "CN": "", "ID": "H5T2YDSX3.1", @@ -75,12 +75,10 @@ "PU": "H5T2YDSX3.1", "SM": "sample1" }, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" }, "sample1.fastp.html" ] @@ -92,12 +90,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "readgroup": { "LB": "test", @@ -141,12 +138,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "qc_mode": "full", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.md5" @@ -160,12 +156,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -189,12 +184,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -228,12 +222,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "qc_mode": "full", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.per-base.bed.gz.csi" @@ -250,12 +243,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -289,103 +281,24 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "qc_mode": "full", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.quantized.bed.gz.csi" ] ], "mosdepth_regions": [ - [ - { - "groupSize": 1, - "groupTarget": { - "samplename": "sample1", - "library": "test", - "organism": "Homo sapiens", - "tag": "WES", - "sample_type": "DNA", - "aligner": "bwamem", - "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "single_end": false, - "genome": "GRCh38", - "genome_data": { - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1" - } - }, - "sample1.mosdepth.region.dist.txt:md5,388e05b0b4d7754be6fdc0b1b6eabed9" - ] + ], "mosdepth_regions_bed": [ - [ - { - "groupSize": 1, - "groupTarget": { - "samplename": "sample1", - "library": "test", - "organism": "Homo sapiens", - "tag": "WES", - "sample_type": "DNA", - "aligner": "bwamem", - "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "single_end": false, - "genome": "GRCh38", - "genome_data": { - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1" - } - }, - "sample1.regions.bed.gz:md5,6b7cc84380695011ffd0681dc79cefaa" - ] + ], "mosdepth_regions_csi": [ - [ - { - "groupSize": 1, - "groupTarget": { - "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WES" - } - }, - "sample1.regions.bed.gz.csi" - ] + ], "mosdepth_summary": [ [ @@ -395,12 +308,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -413,7 +325,7 @@ "id": "sample1" } }, - "sample1.mosdepth.summary.txt:md5,f1f18d9bd23783bedb7f9e246e192a7e" + "sample1.mosdepth.summary.txt:md5,699b955719b06ff290edbe0692492213" ] ], "mosdepth_thresholds_bed": [ @@ -467,12 +379,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -492,13 +403,14 @@ "sample1.gcbias-chart.pdf:md5,76b876df43ac778292fc03bcdc90398c", "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c", "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f", - "sample1.hybcap-metrics.txt:md5,0e5cf0bfd2f1142f56462ec7cf4c990c", "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", - "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" + "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a", + "sample1.wgs-coverage.txt:md5,4387e3d5a1046eb409a8ebb451fabcc7", + "sample1.wgs-metrics.txt:md5,05c64580c5ea68ba1987c56c4cc31968" ] ] ], @@ -526,12 +438,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "qc_mode": "full", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.coverage.txt" @@ -555,12 +466,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "qc_mode": "full", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.flagstat" @@ -574,12 +484,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -613,12 +522,11 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": true, + "qc_mode": "full", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WES" + "tag": "WGS" } }, "sample1.stats" @@ -632,12 +540,11 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WES", + "tag": "WGS", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "qc_mode": "full", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -655,13 +562,71 @@ ] } ], - "timestamp": "2026-06-30T12:27:10.368379", + "timestamp": "2026-06-30T13:42:49.210405", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "preprocessing - flowcell - bwa - bamsormadup - roi - basic qc": { + "content": [ + { + "key": [ + [ + { + "groupSize": 1, + "groupTarget": { + "single_end": true, + "samplename": "Sample1", + "sample_type": "DNA", + "library": "test", + "tag": "WES", + "purpose": [ + + ], + "organism": "Homo sapiens", + "genome": "GRCh38", + "vivar_project": [ + + ], + "binsize": [ + + ], + "panels": [ + + ], + "aligner": "bwamem", + "markdup": "bamsormadup", + "umi_aware": false, + "skip_trimming": false, + "trim_front": 0, + "trim_tail": 0, + "adapter_R1": null, + "adapter_R2": null, + "qc_mode": "basic", + "roi": null, + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "Sample1" + } + }, + "Sample1.merged.metrics.txt:md5,f23933cc5957694d2286bdae22039097" + ] + ] + } + ], + "timestamp": "2026-06-30T13:45:04.959946", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" } }, - "preprocessing - fastq - bwa - bamsormadup - no roi": { + "preprocessing - fastq - bwa - bamsormadup - roi - basic qc": { "content": [ { "align_reports": [ @@ -685,11 +650,12 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.cram", @@ -728,6 +694,7 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", + "qc_mode": "basic", "readgroup": { "CN": "", "ID": "H5T2YDSX3.1", @@ -736,11 +703,11 @@ "PU": "H5T2YDSX3.1", "SM": "sample1" }, - "run_coverage": true, + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" }, "sample1.fastp.html" ] @@ -752,11 +719,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "readgroup": { "LB": "test", @@ -800,11 +768,12 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.md5" @@ -818,11 +787,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -846,11 +816,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -884,11 +855,12 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.per-base.bed.gz.csi" @@ -905,11 +877,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -943,26 +916,18 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.quantized.bed.gz.csi" ] ], "mosdepth_regions": [ - - ], - "mosdepth_regions_bed": [ - - ], - "mosdepth_regions_csi": [ - - ], - "mosdepth_summary": [ [ { "groupSize": 1, @@ -970,11 +935,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -987,53 +953,10 @@ "id": "sample1" } }, - "sample1.mosdepth.summary.txt:md5,699b955719b06ff290edbe0692492213" - ] - ], - "mosdepth_thresholds_bed": [ - - ], - "mosdepth_thresholds_csi": [ - - ], - "multiqc_data": [ - [ - { - "id": "test" - }, - "test_data" + "sample1.mosdepth.region.dist.txt:md5,388e05b0b4d7754be6fdc0b1b6eabed9" ] ], - "multiqc_plots": [ - - ], - "multiqc_report": [ - [ - { - "id": "test" - }, - "test.html" - ] - ], - "multiqcsav_data": [ - [ - - ] - ], - "multiqcsav_plots": [ - [ - - ] - ], - "multiqcsav_report": [ - [ - - ] - ], - "panelcoverage": [ - - ], - "riker_metrics": [ + "mosdepth_regions_bed": [ [ { "groupSize": 1, @@ -1041,11 +964,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -1058,31 +982,10 @@ "id": "sample1" } }, - [ - "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", - "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", - "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", - "sample1.gcbias-chart.pdf:md5,76b876df43ac778292fc03bcdc90398c", - "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c", - "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f", - "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", - "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", - "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", - "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a", - "sample1.wgs-coverage.txt:md5,4387e3d5a1046eb409a8ebb451fabcc7", - "sample1.wgs-metrics.txt:md5,05c64580c5ea68ba1987c56c4cc31968" - ] + "sample1.regions.bed.gz:md5,6b7cc84380695011ffd0681dc79cefaa" ] ], - "rna_junctions": [ - - ], - "rna_splice_junctions": [ - - ], - "samtools_coverage": [ + "mosdepth_regions_csi": [ [ { "groupSize": 1, @@ -1100,15 +1003,100 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, - "sample1.coverage.txt" + "sample1.regions.bed.gz.csi" + ] + ], + "mosdepth_summary": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mosdepth.summary.txt:md5,f1f18d9bd23783bedb7f9e246e192a7e" + ] + ], + "mosdepth_thresholds_bed": [ + + ], + "mosdepth_thresholds_csi": [ + + ], + "multiqc_data": [ + [ + { + "id": "test" + }, + "test_data" + ] + ], + "multiqc_plots": [ + + ], + "multiqc_report": [ + [ + { + "id": "test" + }, + "test.html" ] + ], + "multiqcsav_data": [ + [ + + ] + ], + "multiqcsav_plots": [ + [ + + ] + ], + "multiqcsav_report": [ + [ + + ] + ], + "panelcoverage": [ + + ], + "riker_metrics": [ + + ], + "rna_junctions": [ + + ], + "rna_splice_junctions": [ + + ], + "samtools_coverage": [ + ], "samtools_flagstat": [ [ @@ -1128,11 +1116,12 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "sample_type": "DNA", "samplename": "sample1", "single_end": false, - "tag": "WGS" + "tag": "WES" } }, "sample1.flagstat" @@ -1146,11 +1135,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -1167,32 +1157,7 @@ ] ], "samtools_stats": [ - [ - { - "groupSize": 1, - "groupTarget": { - "aligner": "bwamem", - "genome": "GRCh38", - "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "run_coverage": true, - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WGS" - } - }, - "sample1.stats" - ] + ], "sormadup_metrics": [ [ @@ -1202,11 +1167,12 @@ "samplename": "sample1", "library": "test", "organism": "Homo sapiens", - "tag": "WGS", + "tag": "WES", "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": true, + "qc_mode": "basic", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", "genome_data": { @@ -1224,13 +1190,13 @@ ] } ], - "timestamp": "2026-06-30T12:28:33.877205", + "timestamp": "2026-06-30T13:44:13.001967", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" } }, - "preprocessing - fastq - bwa - bamsormadup - roi - no coverage": { + "preprocessing - fastq - bwa - bamsormadup - roi - full qc": { "content": [ { "align_reports": [ @@ -1254,8 +1220,8 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, @@ -1298,6 +1264,7 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", + "qc_mode": "full", "readgroup": { "CN": "", "ID": "H5T2YDSX3.1", @@ -1307,7 +1274,6 @@ "SM": "sample1" }, "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, @@ -1327,7 +1293,7 @@ "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": false, + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "readgroup": { @@ -1372,8 +1338,8 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, @@ -1384,34 +1350,268 @@ ] ], "mosdepth_global": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mosdepth.global.dist.txt:md5,4574a0f755903d7ab7aa07297cc1efee" + ] ], "mosdepth_per_base_bed": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.per-base.bed.gz:md5,e5c10c94f3870f6ed2c75a904e9ade7f" + ] ], "mosdepth_per_base_csi": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WES" + } + }, + "sample1.per-base.bed.gz.csi" + ] ], "mosdepth_per_base_d4": [ ], "mosdepth_quantized_bed": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.quantized.bed.gz:md5,d54d469a692c3fe4a4e1db02c08be518" + ] ], "mosdepth_quantized_csi": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WES" + } + }, + "sample1.quantized.bed.gz.csi" + ] ], "mosdepth_regions": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mosdepth.region.dist.txt:md5,388e05b0b4d7754be6fdc0b1b6eabed9" + ] ], "mosdepth_regions_bed": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.regions.bed.gz:md5,6b7cc84380695011ffd0681dc79cefaa" + ] ], "mosdepth_regions_csi": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WES" + } + }, + "sample1.regions.bed.gz.csi" + ] ], "mosdepth_summary": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mosdepth.summary.txt:md5,f1f18d9bd23783bedb7f9e246e192a7e" + ] ], "mosdepth_thresholds_bed": [ @@ -1468,7 +1668,7 @@ "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": false, + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", @@ -1506,7 +1706,33 @@ ], "samtools_coverage": [ - + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WES" + } + }, + "sample1.coverage.txt" + ] ], "samtools_flagstat": [ [ @@ -1526,8 +1752,8 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, @@ -1549,7 +1775,7 @@ "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": false, + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", @@ -1584,8 +1810,8 @@ "library": "test", "markdup": "bamsormadup", "organism": "Homo sapiens", + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "run_coverage": false, "sample_type": "DNA", "samplename": "sample1", "single_end": false, @@ -1607,7 +1833,7 @@ "sample_type": "DNA", "aligner": "bwamem", "markdup": "bamsormadup", - "run_coverage": false, + "qc_mode": "full", "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", "single_end": false, "genome": "GRCh38", @@ -1626,68 +1852,10 @@ ] } ], - "timestamp": "2026-06-30T12:29:57.195562", + "timestamp": "2026-06-30T13:41:19.764326", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" } - }, - "preprocessing - flowcell - bwa - bamsormadup - roi": { - "content": [ - { - "key": [ - [ - { - "groupSize": 1, - "groupTarget": { - "single_end": true, - "samplename": "Sample1", - "sample_type": "DNA", - "library": "test", - "tag": "WES", - "purpose": [ - - ], - "organism": "Homo sapiens", - "genome": "GRCh38", - "vivar_project": [ - - ], - "binsize": [ - - ], - "panels": [ - - ], - "aligner": "bwamem", - "markdup": "bamsormadup", - "umi_aware": false, - "skip_trimming": false, - "trim_front": 0, - "trim_tail": 0, - "adapter_R1": null, - "adapter_R2": null, - "run_coverage": true, - "roi": null, - "genome_data": { - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" - }, - "id": "Sample1" - } - }, - "Sample1.merged.metrics.txt:md5,f23933cc5957694d2286bdae22039097" - ] - ] - } - ], - "timestamp": "2026-06-15T08:43:48.791593", - "meta": { - "nf-test": "0.9.5", - "nextflow": "26.04.3" - } } } \ No newline at end of file diff --git a/workflows/preprocessing.nf b/workflows/preprocessing.nf index e42b3ea9..5c358589 100644 --- a/workflows/preprocessing.nf +++ b/workflows/preprocessing.nf @@ -17,7 +17,6 @@ include { SAMTOOLS_COVERAGE } from '../modules/nf-core/samtools/covera // Subworkflows include { BAM_QC } from '../subworkflows/local/bam_qc' -include { COVERAGE } from '../subworkflows/local/coverage' include { FASTQ_TO_CRAM } from '../subworkflows/local/fastq_to_aligned_cram' // Functions @@ -275,35 +274,6 @@ workflow PREPROCESSING { /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// STEP: COVERAGE ANALYSIS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - FASTQ_TO_CRAM.out.cram_crai - .filter { meta, _cram, _crai -> - meta.run_coverage.toBoolean() - } - .map { meta, cram, crai -> - return [ - meta, - cram, - crai, - getGenomeAttribute(meta.genome_data, "fasta"), - getGenomeAttribute(meta.genome_data, "fai"), - meta.roi && meta.roi != [] ? file(meta.roi, checkIfExists: true) : [], - ] - } - .set { ch_coverage } - - COVERAGE(ch_coverage, ch_genelists) - ch_multiqc_files = ch_multiqc_files.mix( - COVERAGE.out.mosdepth_summary, - COVERAGE.out.mosdepth_global, - COVERAGE.out.mosdepth_regions, - COVERAGE.out.samtools_coverage, - ) - - /* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // STEP: QC FOR ALIGNMENTS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -320,12 +290,16 @@ workflow PREPROCESSING { } .set { ch_bam_qc } - BAM_QC(ch_bam_qc) + BAM_QC(ch_bam_qc, ch_genelists) ch_multiqc_files = ch_multiqc_files.mix( - BAM_QC.out.samtools_stats, + BAM_QC.out.mosdepth_global, + BAM_QC.out.mosdepth_regions, + BAM_QC.out.mosdepth_summary, + BAM_QC.out.riker_metrics, + BAM_QC.out.samtools_coverage, BAM_QC.out.samtools_flagstat, BAM_QC.out.samtools_idxstats, - BAM_QC.out.riker_metrics, + BAM_QC.out.samtools_stats, ) /* @@ -428,20 +402,20 @@ workflow PREPROCESSING { rna_junctions = FASTQ_TO_CRAM.out.rna_junctions align_reports = FASTQ_TO_CRAM.out.align_reports sormadup_metrics = FASTQ_TO_CRAM.out.sormadup_metrics - mosdepth_global = COVERAGE.out.mosdepth_global - mosdepth_summary = COVERAGE.out.mosdepth_summary - mosdepth_regions = COVERAGE.out.mosdepth_regions - mosdepth_per_base_d4 = COVERAGE.out.mosdepth_per_base_d4 - mosdepth_per_base_bed = COVERAGE.out.mosdepth_per_base_bed - mosdepth_per_base_csi = COVERAGE.out.mosdepth_per_base_csi - mosdepth_regions_bed = COVERAGE.out.mosdepth_regions_bed - mosdepth_regions_csi = COVERAGE.out.mosdepth_regions_csi - mosdepth_quantized_bed = COVERAGE.out.mosdepth_quantized_bed - mosdepth_quantized_csi = COVERAGE.out.mosdepth_quantized_csi - mosdepth_thresholds_bed = COVERAGE.out.mosdepth_thresholds_bed - mosdepth_thresholds_csi = COVERAGE.out.mosdepth_thresholds_csi - samtools_coverage = COVERAGE.out.samtools_coverage - panelcoverage = COVERAGE.out.panelcoverage + mosdepth_global = BAM_QC.out.mosdepth_global + mosdepth_summary = BAM_QC.out.mosdepth_summary + mosdepth_regions = BAM_QC.out.mosdepth_regions + mosdepth_per_base_d4 = BAM_QC.out.mosdepth_per_base_d4 + mosdepth_per_base_bed = BAM_QC.out.mosdepth_per_base_bed + mosdepth_per_base_csi = BAM_QC.out.mosdepth_per_base_csi + mosdepth_regions_bed = BAM_QC.out.mosdepth_regions_bed + mosdepth_regions_csi = BAM_QC.out.mosdepth_regions_csi + mosdepth_quantized_bed = BAM_QC.out.mosdepth_quantized_bed + mosdepth_quantized_csi = BAM_QC.out.mosdepth_quantized_csi + mosdepth_thresholds_bed = BAM_QC.out.mosdepth_thresholds_bed + mosdepth_thresholds_csi = BAM_QC.out.mosdepth_thresholds_csi + samtools_coverage = BAM_QC.out.samtools_coverage + panelcoverage = BAM_QC.out.panelcoverage samtools_stats = BAM_QC.out.samtools_stats samtools_flagstat = BAM_QC.out.samtools_flagstat samtools_idxstats = BAM_QC.out.samtools_idxstats From d61dc4e5064c1df905c8dedab7d1a605f5c30682 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 30 Jun 2026 14:29:40 +0200 Subject: [PATCH 18/62] granular riker output, fix unstable pdf snapshot --- main.nf | 104 +- modules.json | 2 +- modules/nf-core/riker/multi/main.nf | 19 +- modules/nf-core/riker/multi/riker-multi.diff | 29 +- subworkflows/local/bam_qc/main.nf | 18 +- subworkflows/local/coverage/main.nf | 63 - subworkflows/local/coverage/meta.yml | 0 tests/subworkflows/local/bam_qc/main.nf.test | 10 +- .../local/bam_qc/main.nf.test.snap | 1034 ++++++----------- tests/workflows/preprocessing.nf.test | 4 + tests/workflows/preprocessing.nf.test.snap | 821 +++++++++++-- workflows/preprocessing.nf | 35 +- 12 files changed, 1243 insertions(+), 896 deletions(-) delete mode 100644 subworkflows/local/coverage/main.nf delete mode 100644 subworkflows/local/coverage/meta.yml diff --git a/main.nf b/main.nf index 31c65fbd..5e413bd4 100644 --- a/main.nf +++ b/main.nf @@ -192,7 +192,23 @@ workflow { samtools_stats = PREPROCESSING.out.samtools_stats samtools_flagstat = PREPROCESSING.out.samtools_flagstat samtools_idxstats = PREPROCESSING.out.samtools_idxstats - riker_metrics = PREPROCESSING.out.riker_metrics + riker_alignment_metrics = PREPROCESSING.out.riker_alignment_metrics + riker_base_dist = PREPROCESSING.out.riker_base_dist + riker_mean_qual = PREPROCESSING.out.riker_mean_qual + riker_qual_dist = PREPROCESSING.out.riker_qual_dist + riker_error_mismatch = PREPROCESSING.out.riker_error_mismatch + riker_error_overlap = PREPROCESSING.out.riker_error_overlap + riker_error_indel = PREPROCESSING.out.riker_error_indel + riker_gcbias_detail = PREPROCESSING.out.riker_gcbias_detail + riker_gcbias_summary = PREPROCESSING.out.riker_gcbias_summary + riker_hybcap_metrics = PREPROCESSING.out.riker_hybcap_metrics + riker_hybcap_per_target = PREPROCESSING.out.riker_hybcap_per_target + riker_hybcap_per_base = PREPROCESSING.out.riker_hybcap_per_base + riker_isize_metrics = PREPROCESSING.out.riker_isize_metrics + riker_isize_histogram = PREPROCESSING.out.riker_isize_histogram + riker_wgs_metrics = PREPROCESSING.out.riker_wgs_metrics + riker_wgs_coverage = PREPROCESSING.out.riker_wgs_coverage + riker_pdf = PREPROCESSING.out.riker_pdf md5sums = PREPROCESSING.out.md5sums multiqc_report = PREPROCESSING.out.multiqc_report multiqc_data = PREPROCESSING.out.multiqc_data @@ -354,10 +370,90 @@ output { return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") } } - riker_metrics { + riker_alignment_metrics { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_base_dist { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_mean_qual { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_qual_dist { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_error_mismatch { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_error_overlap { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_error_indel { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_gcbias_detail { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_gcbias_summary { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_hybcap_metrics { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_hybcap_per_target { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_hybcap_per_base { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_isize_metrics { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_isize_histogram { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_wgs_metrics { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_wgs_coverage { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_pdf { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } md5sums { path { meta, _file -> diff --git a/modules.json b/modules.json index 8076039f..c72e5dd1 100644 --- a/modules.json +++ b/modules.json @@ -78,7 +78,7 @@ }, "riker/multi": { "branch": "master", - "git_sha": "6e16b1007d65bc44121ee1a520364d7d72d761ac", + "git_sha": "89e570609a9c76e86861b8acd0bc7e0aafaccab0", "installed_by": ["modules"], "patch": "modules/nf-core/riker/multi/riker-multi.diff" }, diff --git a/modules/nf-core/riker/multi/main.nf b/modules/nf-core/riker/multi/main.nf index d4858e71..1cfa6477 100644 --- a/modules/nf-core/riker/multi/main.nf +++ b/modules/nf-core/riker/multi/main.nf @@ -11,7 +11,23 @@ process RIKER_MULTI { tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) output: - tuple val(meta), path("*.{txt,pdf}"), emit: metrics + tuple val(meta), path("*.alignment-metrics.txt"), emit: alignment_metrics, optional: true + tuple val(meta), path("*.base-distribution-by-cycle.txt"), emit: base_dist, optional: true + tuple val(meta), path("*.mean-quality-by-cycle.txt"), emit: mean_qual, optional: true + tuple val(meta), path("*.quality-score-distribution.txt"), emit: qual_dist, optional: true + tuple val(meta), path("*.error-mismatch.txt"), emit: error_mismatch, optional: true + tuple val(meta), path("*.error-overlap.txt"), emit: error_overlap, optional: true + tuple val(meta), path("*.error-indel.txt"), emit: error_indel, optional: true + tuple val(meta), path("*.gcbias-detail.txt"), emit: gcbias_detail, optional: true + tuple val(meta), path("*.gcbias-summary.txt"), emit: gcbias_summary, optional: true + tuple val(meta), path("*.hybcap-metrics.txt"), emit: hybcap_metrics, optional: true + tuple val(meta), path("*.hybcap-per-target.txt"), emit: hybcap_per_target, optional: true + tuple val(meta), path("*.hybcap-per-base.txt*"), emit: hybcap_per_base, optional: true + tuple val(meta), path("*.isize-metrics.txt"), emit: isize_metrics, optional: true + tuple val(meta), path("*.isize-histogram.txt"), emit: isize_histogram, optional: true + tuple val(meta), path("*.wgs-metrics.txt"), emit: wgs_metrics, optional: true + tuple val(meta), path("*.wgs-coverage.txt"), emit: wgs_coverage, optional: true + tuple val(meta), path("*.pdf"), emit: pdf, optional: true tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker when: @@ -22,6 +38,7 @@ process RIKER_MULTI { def prefix = task.ext.prefix ?: "${meta.id}" def ref = fasta ? "-r ${fasta}" : '' def hybcap_opts = roi ? "--hybcap::baits ${roi} --hybcap::targets ${roi}" : '' + """ riker multi \\ -i ${bam} \\ diff --git a/modules/nf-core/riker/multi/riker-multi.diff b/modules/nf-core/riker/multi/riker-multi.diff index 8148ea37..f914fa2c 100644 --- a/modules/nf-core/riker/multi/riker-multi.diff +++ b/modules/nf-core/riker/multi/riker-multi.diff @@ -4,37 +4,17 @@ Changes in component 'nf-core/riker/multi' Changes in 'riker/multi/main.nf': --- modules/nf-core/riker/multi/main.nf +++ modules/nf-core/riker/multi/main.nf -@@ -8,27 +8,10 @@ +@@ -8,8 +8,7 @@ 'community.wave.seqera.io/library/riker:0.3.0--56fa17ae2be0828f' }" input: -- tuple val(meta), path(bam), path(bai), path(baits), path(targets) +- tuple val(meta), path(bam), path(bai), path(baits, stageAs: 'baits/*'), path(targets, stageAs: 'targets/*') - tuple val(meta2), path(fasta), path(fai) + tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) output: -- tuple val(meta), path("*.alignment-metrics.txt") , optional: true, emit: alignment_metrics -- tuple val(meta), path("*.base-distribution-by-cycle.txt") , optional: true, emit: base_dist -- tuple val(meta), path("*.mean-quality-by-cycle.txt") , optional: true, emit: mean_qual -- tuple val(meta), path("*.quality-score-distribution.txt") , optional: true, emit: qual_dist -- tuple val(meta), path("*.error-mismatch.txt") , optional: true, emit: error_mismatch -- tuple val(meta), path("*.error-overlap.txt") , optional: true, emit: error_overlap -- tuple val(meta), path("*.error-indel.txt") , optional: true, emit: error_indel -- tuple val(meta), path("*.gcbias-detail.txt") , optional: true, emit: gcbias_detail -- tuple val(meta), path("*.gcbias-summary.txt") , optional: true, emit: gcbias_summary -- tuple val(meta), path("*.hybcap-metrics.txt") , optional: true, emit: hybcap_metrics -- tuple val(meta), path("*.hybcap-per-target.txt") , optional: true, emit: hybcap_per_target -- tuple val(meta), path("*.hybcap-per-base.txt*") , optional: true, emit: hybcap_per_base -- tuple val(meta), path("*.isize-metrics.txt") , optional: true, emit: isize_metrics -- tuple val(meta), path("*.isize-histogram.txt") , optional: true, emit: isize_histogram -- tuple val(meta), path("*.wgs-metrics.txt") , optional: true, emit: wgs_metrics -- tuple val(meta), path("*.wgs-coverage.txt") , optional: true, emit: wgs_coverage -- tuple val(meta), path("*.pdf") , optional: true, emit: pdf -+ tuple val(meta), path("*.{txt,pdf}"), emit: metrics - tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker - - when: -@@ -38,10 +21,7 @@ + tuple val(meta), path("*.alignment-metrics.txt"), emit: alignment_metrics, optional: true +@@ -38,10 +37,8 @@ def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def ref = fasta ? "-r ${fasta}" : '' @@ -43,6 +23,7 @@ Changes in 'riker/multi/main.nf': - } - def hybcap_opts = (baits && targets) ? "--hybcap::baits ${baits} --hybcap::targets ${targets}" : '' + def hybcap_opts = roi ? "--hybcap::baits ${roi} --hybcap::targets ${roi}" : '' ++ """ riker multi \\ -i ${bam} \\ diff --git a/subworkflows/local/bam_qc/main.nf b/subworkflows/local/bam_qc/main.nf index 0ec802c5..01f51b91 100644 --- a/subworkflows/local/bam_qc/main.nf +++ b/subworkflows/local/bam_qc/main.nf @@ -91,7 +91,23 @@ workflow BAM_QC { mosdepth_thresholds_bed = MOSDEPTH.out.thresholds_bed mosdepth_thresholds_csi = MOSDEPTH.out.thresholds_csi panelcoverage = PANELCOVERAGE.out.regiondist - riker_metrics = RIKER_MULTI.out.metrics + riker_alignment_metrics = RIKER_MULTI.out.alignment_metrics + riker_base_dist = RIKER_MULTI.out.base_dist + riker_mean_qual = RIKER_MULTI.out.mean_qual + riker_qual_dist = RIKER_MULTI.out.qual_dist + riker_error_mismatch = RIKER_MULTI.out.error_mismatch + riker_error_overlap = RIKER_MULTI.out.error_overlap + riker_error_indel = RIKER_MULTI.out.error_indel + riker_gcbias_detail = RIKER_MULTI.out.gcbias_detail + riker_gcbias_summary = RIKER_MULTI.out.gcbias_summary + riker_hybcap_metrics = RIKER_MULTI.out.hybcap_metrics + riker_hybcap_per_target = RIKER_MULTI.out.hybcap_per_target + riker_hybcap_per_base = RIKER_MULTI.out.hybcap_per_base + riker_isize_metrics = RIKER_MULTI.out.isize_metrics + riker_isize_histogram = RIKER_MULTI.out.isize_histogram + riker_wgs_metrics = RIKER_MULTI.out.wgs_metrics + riker_wgs_coverage = RIKER_MULTI.out.wgs_coverage + riker_pdf = RIKER_MULTI.out.pdf samtools_coverage = SAMTOOLS_COVERAGE.out.coverage samtools_flagstat = SAMTOOLS_FLAGSTAT.out.flagstat samtools_idxstats = SAMTOOLS_IDXSTATS.out.idxstats diff --git a/subworkflows/local/coverage/main.nf b/subworkflows/local/coverage/main.nf deleted file mode 100644 index f2cc25a6..00000000 --- a/subworkflows/local/coverage/main.nf +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env nextflow - -// MODULES -include { MOSDEPTH } from "../../../modules/nf-core/mosdepth/main.nf" -include { SAMTOOLS_COVERAGE } from "../../../modules/nf-core/samtools/coverage/main" -include { PANELCOVERAGE } from "../../../modules/local/panelcoverage/main" - -workflow COVERAGE { - take: - ch_meta_cram_crai_fasta_fai_roi // channel: [mandatory] [meta, cram, crai, fasta, fai, roi] - ch_genelists // channel: [optional] [genelists] - - main: - MOSDEPTH( - ch_meta_cram_crai_fasta_fai_roi.map { meta, cram, crai, fasta, _fai, roi -> - return [meta, cram, crai, roi, fasta] - }, - ['NO_COVERAGE', 'LOW_COVERAGE', 'CALLABLE'] - ) - - SAMTOOLS_COVERAGE( - ch_meta_cram_crai_fasta_fai_roi.map { meta, cram, crai, fasta, fai, _roi -> - return [meta, cram, crai, fasta, fai] - } - ) - - PANELCOVERAGE( - MOSDEPTH.out.per_base_bed.join(MOSDEPTH.out.per_base_csi).combine(ch_genelists).map { meta, bed, index, genelists -> - // Because groovy typing sucks ass; apparently an array of 1 is automatically converted to a string... - if (genelists !instanceof List) { - genelists = [genelists] - } - def filtered_genelists = meta.tag.toLowerCase() == "seqcap" - ? genelists.findAll { genelist -> genelist.name.toLowerCase().contains("seqcap") } - : genelists.findAll { genelist -> !genelist.name.toLowerCase().contains("seqcap") } - - if (filtered_genelists.size() > 0) { - return [ - meta, - bed, - index, - filtered_genelists, - ] - } - } - ) - - emit: - mosdepth_global = MOSDEPTH.out.global_txt - mosdepth_summary = MOSDEPTH.out.summary_txt - mosdepth_regions = MOSDEPTH.out.regions_txt - mosdepth_per_base_d4 = MOSDEPTH.out.per_base_d4 - mosdepth_per_base_bed = MOSDEPTH.out.per_base_bed - mosdepth_per_base_csi = MOSDEPTH.out.per_base_csi - mosdepth_regions_bed = MOSDEPTH.out.regions_bed - mosdepth_regions_csi = MOSDEPTH.out.regions_csi - mosdepth_quantized_bed = MOSDEPTH.out.quantized_bed - mosdepth_quantized_csi = MOSDEPTH.out.quantized_csi - mosdepth_thresholds_bed = MOSDEPTH.out.thresholds_bed - mosdepth_thresholds_csi = MOSDEPTH.out.thresholds_csi - samtools_coverage = SAMTOOLS_COVERAGE.out.coverage - panelcoverage = PANELCOVERAGE.out.regiondist -} diff --git a/subworkflows/local/coverage/meta.yml b/subworkflows/local/coverage/meta.yml deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/subworkflows/local/bam_qc/main.nf.test b/tests/subworkflows/local/bam_qc/main.nf.test index 010b235e..095530f8 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test +++ b/tests/subworkflows/local/bam_qc/main.nf.test @@ -31,7 +31,7 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out).match() + assert snapshot(sanitizeOutput(workflow.out, unstableKeys:["riker_pdf"])).match() } } @@ -59,7 +59,7 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out).match() + assert snapshot(sanitizeOutput(workflow.out, unstableKeys:["riker_pdf"])).match() } } @@ -87,7 +87,7 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out).match() + assert snapshot(sanitizeOutput(workflow.out, unstableKeys:["riker_pdf"])).match() } } @@ -115,7 +115,7 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out).match() + assert snapshot(sanitizeOutput(workflow.out, unstableKeys:["riker_pdf"])).match() } } @@ -144,7 +144,7 @@ nextflow_workflow { then { assert workflow.success - assert snapshot(workflow.out).match() + assert snapshot(sanitizeOutput(workflow.out, unstableKeys:["riker_pdf"])).match() } } diff --git a/tests/subworkflows/local/bam_qc/main.nf.test.snap b/tests/subworkflows/local/bam_qc/main.nf.test.snap index 099c4a30..be3e26e3 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test.snap +++ b/tests/subworkflows/local/bam_qc/main.nf.test.snap @@ -2,7 +2,7 @@ "bam QC - basic - no roi": { "content": [ { - "0": [ + "mosdepth_global": [ [ { "id": "test", @@ -12,7 +12,7 @@ "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" ] ], - "1": [ + "mosdepth_per_base_bed": [ [ { "id": "test", @@ -22,45 +22,7 @@ "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" ] ], - "10": [ - - ], - "11": [ - - ], - "12": [ - - ], - "13": [ - - ], - "14": [ - - ], - "15": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" - ] - ], - "16": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" - ] - ], - "17": [ - - ], - "2": [ + "mosdepth_per_base_csi": [ [ { "id": "test", @@ -70,10 +32,10 @@ "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" ] ], - "3": [ + "mosdepth_per_base_d4": [ ], - "4": [ + "mosdepth_quantized_bed": [ [ { "id": "test", @@ -83,7 +45,7 @@ "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" ] ], - "5": [ + "mosdepth_quantized_csi": [ [ { "id": "test", @@ -93,16 +55,16 @@ "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" ] ], - "6": [ + "mosdepth_regions": [ ], - "7": [ + "mosdepth_regions_bed": [ ], - "8": [ + "mosdepth_regions_csi": [ ], - "9": [ + "mosdepth_summary": [ [ { "id": "test", @@ -112,88 +74,64 @@ "test.mosdepth.summary.txt:md5,6c29875b821ba44f5cc5254a2339db90" ] ], - "mosdepth_global": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" - ] + "mosdepth_thresholds_bed": [ + ], - "mosdepth_per_base_bed": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" - ] + "mosdepth_thresholds_csi": [ + ], - "mosdepth_per_base_csi": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" - ] + "panelcoverage": [ + ], - "mosdepth_per_base_d4": [ + "riker_alignment_metrics": [ ], - "mosdepth_quantized_bed": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] + "riker_base_dist": [ + ], - "mosdepth_quantized_csi": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" - ] + "riker_error_indel": [ + ], - "mosdepth_regions": [ + "riker_error_mismatch": [ ], - "mosdepth_regions_bed": [ + "riker_error_overlap": [ ], - "mosdepth_regions_csi": [ + "riker_gcbias_detail": [ ], - "mosdepth_summary": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.mosdepth.summary.txt:md5,6c29875b821ba44f5cc5254a2339db90" - ] + "riker_gcbias_summary": [ + ], - "mosdepth_thresholds_bed": [ + "riker_hybcap_metrics": [ ], - "mosdepth_thresholds_csi": [ + "riker_hybcap_per_base": [ ], - "panelcoverage": [ + "riker_hybcap_per_target": [ + + ], + "riker_isize_histogram": [ + + ], + "riker_isize_metrics": [ + + ], + "riker_mean_qual": [ + + ], + "riker_pdf": [ ], - "riker_metrics": [ + "riker_qual_dist": [ + + ], + "riker_wgs_coverage": [ + + ], + "riker_wgs_metrics": [ ], "samtools_coverage": [ @@ -224,7 +162,7 @@ ] } ], - "timestamp": "2026-06-30T13:45:28.834986", + "timestamp": "2026-06-30T14:27:56.863163", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -233,7 +171,7 @@ "bam QC - full - roi - WES": { "content": [ { - "0": [ + "mosdepth_global": [ [ { "id": "test", @@ -244,7 +182,7 @@ "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" ] ], - "1": [ + "mosdepth_per_base_bed": [ [ { "id": "test", @@ -255,13 +193,7 @@ "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" ] ], - "10": [ - - ], - "11": [ - - ], - "12": [ + "mosdepth_per_base_csi": [ [ { "id": "test", @@ -269,13 +201,13 @@ "qc_mode": "full", "tag": "WES" }, - [ - "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", - "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" ] ], - "13": [ + "mosdepth_per_base_d4": [ + + ], + "mosdepth_quantized_bed": [ [ { "id": "test", @@ -283,27 +215,10 @@ "qc_mode": "full", "tag": "WES" }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] + "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" ] ], - "14": [ + "mosdepth_quantized_csi": [ [ { "id": "test", @@ -311,10 +226,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" ] ], - "15": [ + "mosdepth_regions": [ [ { "id": "test", @@ -322,10 +237,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" ] ], - "16": [ + "mosdepth_regions_bed": [ [ { "id": "test", @@ -333,10 +248,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" ] ], - "17": [ + "mosdepth_regions_csi": [ [ { "id": "test", @@ -344,10 +259,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" ] ], - "2": [ + "mosdepth_summary": [ [ { "id": "test", @@ -355,24 +270,16 @@ "qc_mode": "full", "tag": "WES" }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" ] ], - "3": [ + "mosdepth_thresholds_bed": [ ], - "4": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "WES" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] + "mosdepth_thresholds_csi": [ + ], - "5": [ + "panelcoverage": [ [ { "id": "test", @@ -380,10 +287,13 @@ "qc_mode": "full", "tag": "WES" }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + [ + "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", + "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] ] ], - "6": [ + "riker_alignment_metrics": [ [ { "id": "test", @@ -391,10 +301,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb" ] ], - "7": [ + "riker_base_dist": [ [ { "id": "test", @@ -402,43 +312,19 @@ "qc_mode": "full", "tag": "WES" }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a" ] ], - "8": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "WES" - }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" - ] + "riker_error_indel": [ + ], - "9": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "WES" - }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" - ] + "riker_error_mismatch": [ + ], - "mosdepth_global": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "WES" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" - ] + "riker_error_overlap": [ + ], - "mosdepth_per_base_bed": [ + "riker_gcbias_detail": [ [ { "id": "test", @@ -446,10 +332,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63" ] ], - "mosdepth_per_base_csi": [ + "riker_gcbias_summary": [ [ { "id": "test", @@ -457,24 +343,19 @@ "qc_mode": "full", "tag": "WES" }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb" ] ], - "mosdepth_per_base_d4": [ + "riker_hybcap_metrics": [ ], - "mosdepth_quantized_bed": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "WES" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] + "riker_hybcap_per_base": [ + ], - "mosdepth_quantized_csi": [ + "riker_hybcap_per_target": [ + + ], + "riker_isize_histogram": [ [ { "id": "test", @@ -482,10 +363,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81" ] ], - "mosdepth_regions": [ + "riker_isize_metrics": [ [ { "id": "test", @@ -493,10 +374,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b" ] ], - "mosdepth_regions_bed": [ + "riker_mean_qual": [ [ { "id": "test", @@ -504,21 +385,28 @@ "qc_mode": "full", "tag": "WES" }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6" ] ], - "mosdepth_regions_csi": [ + "riker_pdf": [ [ { "id": "test", - "single_end": false, "qc_mode": "full", + "single_end": false, "tag": "WES" }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + [ + "test.base-distribution-by-cycle.pdf", + "test.gcbias-chart.pdf", + "test.isize-histogram.pdf", + "test.mean-quality-by-cycle.pdf", + "test.quality-score-distribution.pdf", + "test.wgs-coverage.pdf" + ] ] ], - "mosdepth_summary": [ + "riker_qual_dist": [ [ { "id": "test", @@ -526,16 +414,10 @@ "qc_mode": "full", "tag": "WES" }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] ], - "mosdepth_thresholds_bed": [ - - ], - "mosdepth_thresholds_csi": [ - - ], - "panelcoverage": [ + "riker_wgs_coverage": [ [ { "id": "test", @@ -543,13 +425,10 @@ "qc_mode": "full", "tag": "WES" }, - [ - "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", - "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5" ] ], - "riker_metrics": [ + "riker_wgs_metrics": [ [ { "id": "test", @@ -557,24 +436,7 @@ "qc_mode": "full", "tag": "WES" }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" ] ], "samtools_coverage": [ @@ -623,7 +485,7 @@ ] } ], - "timestamp": "2026-06-30T13:46:19.404056", + "timestamp": "2026-06-30T14:28:45.159533", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -632,197 +494,6 @@ "bam QC - full - roi - seqcap": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" - ] - ], - "10": [ - - ], - "11": [ - - ], - "12": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test_seqcap_Connective_tissue_per_exon.mosdepth.region.dist.txt:md5,e098c901acb1da8c2cf64a248306e71c" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] - ] - ], - "14": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" - ] - ], - "15": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" - ] - ], - "16": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" - ] - ], - "17": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" - ] - ], - "3": [ - - ], - "4": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" - ] - ], - "5": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" - ] - ], - "9": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" - ] - ], "mosdepth_global": [ [ { @@ -931,57 +602,7 @@ "mosdepth_thresholds_csi": [ ], - "panelcoverage": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test_seqcap_Connective_tissue_per_exon.mosdepth.region.dist.txt:md5,e098c901acb1da8c2cf64a248306e71c" - ] - ], - "riker_metrics": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] - ] - ], - "samtools_coverage": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "full", - "tag": "seqcap" - }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" - ] - ], - "samtools_flagstat": [ + "panelcoverage": [ [ { "id": "test", @@ -989,10 +610,10 @@ "qc_mode": "full", "tag": "seqcap" }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + "test_seqcap_Connective_tissue_per_exon.mosdepth.region.dist.txt:md5,e098c901acb1da8c2cf64a248306e71c" ] ], - "samtools_idxstats": [ + "riker_alignment_metrics": [ [ { "id": "test", @@ -1000,10 +621,10 @@ "qc_mode": "full", "tag": "seqcap" }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb" ] ], - "samtools_stats": [ + "riker_base_dist": [ [ { "id": "test", @@ -1011,178 +632,188 @@ "qc_mode": "full", "tag": "seqcap" }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a" ] - ] - } - ], - "timestamp": "2026-06-30T13:46:37.813735", - "meta": { - "nf-test": "0.9.5", - "nextflow": "26.04.4" - } - }, - "bam QC - full - no roi": { - "content": [ - { - "0": [ + ], + "riker_error_indel": [ + + ], + "riker_error_mismatch": [ + + ], + "riker_error_overlap": [ + + ], + "riker_gcbias_detail": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63" ] ], - "1": [ + "riker_gcbias_summary": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb" ] ], - "10": [ + "riker_hybcap_metrics": [ + + ], + "riker_hybcap_per_base": [ ], - "11": [ + "riker_hybcap_per_target": [ ], - "12": [ + "riker_isize_histogram": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - [ - "test_Treatable_ID_per_exon.mosdepth.region.dist.txt:md5,6c2b5237d98e0a2f118a3553c2ba478e", - "test_bladder_cancer_per_exon.mosdepth.region.dist.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81" ] ], - "13": [ + "riker_isize_metrics": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b" ] ], - "14": [ + "riker_mean_qual": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6" ] ], - "15": [ + "riker_pdf": [ [ { "id": "test", + "qc_mode": "full", "single_end": false, - "qc_mode": "full" + "tag": "seqcap" }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + [ + "test.base-distribution-by-cycle.pdf", + "test.gcbias-chart.pdf", + "test.isize-histogram.pdf", + "test.mean-quality-by-cycle.pdf", + "test.quality-score-distribution.pdf", + "test.wgs-coverage.pdf" + ] ] ], - "16": [ + "riker_qual_dist": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] ], - "17": [ + "riker_wgs_coverage": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5" ] ], - "2": [ + "riker_wgs_metrics": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" ] ], - "3": [ - - ], - "4": [ + "samtools_coverage": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" ] ], - "5": [ + "samtools_flagstat": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" ] ], - "6": [ - - ], - "7": [ - - ], - "8": [ - - ], - "9": [ + "samtools_idxstats": [ [ { "id": "test", "single_end": false, - "qc_mode": "full" + "qc_mode": "full", + "tag": "seqcap" }, - "test.mosdepth.summary.txt:md5,6c29875b821ba44f5cc5254a2339db90" + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] ], + "samtools_stats": [ + [ + { + "id": "test", + "single_end": false, + "qc_mode": "full", + "tag": "seqcap" + }, + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" + ] + ] + } + ], + "timestamp": "2026-06-30T14:29:02.372004", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam QC - full - no roi": { + "content": [ + { "mosdepth_global": [ [ { @@ -1274,215 +905,192 @@ ] ] ], - "riker_metrics": [ + "riker_alignment_metrics": [ [ { "id": "test", "single_end": false, "qc_mode": "full" }, - [ - "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb", - "test.base-distribution-by-cycle.pdf:md5,71ccfb355fc2fa585ecab03a3487a63b", - "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a", - "test.gcbias-chart.pdf:md5,275b5a861a8d6d976708ba0b13de2c8f", - "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63", - "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb", - "test.isize-histogram.pdf:md5,c18e427f1c7e4c8f164557da30ad9d71", - "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81", - "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b", - "test.mean-quality-by-cycle.pdf:md5,4ebf87a4d12db4269267b56d0441388e", - "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6", - "test.quality-score-distribution.pdf:md5,fd61e5e131a0b71d225decc167b29101", - "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc", - "test.wgs-coverage.pdf:md5,882aaad6e9c04de2f6d322f8b67d4ecf", - "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5", - "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" - ] + "test.alignment-metrics.txt:md5,6afbb56c56893875c8e580704f9553fb" ] ], - "samtools_coverage": [ + "riker_base_dist": [ [ { "id": "test", "single_end": false, "qc_mode": "full" }, - "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" + "test.base-distribution-by-cycle.txt:md5,a1554060830f234d63a282c89fa47b2a" ] ], - "samtools_flagstat": [ + "riker_error_indel": [ + + ], + "riker_error_mismatch": [ + + ], + "riker_error_overlap": [ + + ], + "riker_gcbias_detail": [ [ { "id": "test", "single_end": false, "qc_mode": "full" }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + "test.gcbias-detail.txt:md5,04f2b60028e4f604e398805c7e3d5c63" ] ], - "samtools_idxstats": [ + "riker_gcbias_summary": [ [ { "id": "test", "single_end": false, "qc_mode": "full" }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + "test.gcbias-summary.txt:md5,928803e32fb84268ae253de0ef5750cb" ] ], - "samtools_stats": [ + "riker_hybcap_metrics": [ + + ], + "riker_hybcap_per_base": [ + + ], + "riker_hybcap_per_target": [ + + ], + "riker_isize_histogram": [ [ { "id": "test", "single_end": false, "qc_mode": "full" }, - "test.stats:md5,ff81063faa5cf509f16044c4160733b5" - ] - ] - } - ], - "timestamp": "2026-06-30T13:45:47.29527", - "meta": { - "nf-test": "0.9.5", - "nextflow": "26.04.4" - } - }, - "bam QC - basic - roi": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false, - "qc_mode": "basic" - }, - "test.mosdepth.global.dist.txt:md5,ceec5e216dac6a4e15b961713ee8b16c" + "test.isize-histogram.txt:md5,377a5662dd0bd893e2fb9bcec50ccd81" ] ], - "1": [ + "riker_isize_metrics": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.per-base.bed.gz:md5,c89a207273626f8415df1710bc522e8e" + "test.isize-metrics.txt:md5,77611ea453436da4af1619283d8d1a7b" ] ], - "10": [ - - ], - "11": [ - - ], - "12": [ - - ], - "13": [ - - ], - "14": [ - - ], - "15": [ + "riker_mean_qual": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" + "test.mean-quality-by-cycle.txt:md5,2f257f4133b678c7c953cb30714548d6" ] ], - "16": [ + "riker_pdf": [ [ { "id": "test", - "single_end": false, - "qc_mode": "basic" + "qc_mode": "full", + "single_end": false }, - "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" + [ + "test.base-distribution-by-cycle.pdf", + "test.gcbias-chart.pdf", + "test.isize-histogram.pdf", + "test.mean-quality-by-cycle.pdf", + "test.quality-score-distribution.pdf", + "test.wgs-coverage.pdf" + ] ] ], - "17": [ - - ], - "2": [ + "riker_qual_dist": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.per-base.bed.gz.csi:md5,c89ce701cf04e44aa49f54e2341c4bf0" + "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] ], - "3": [ - - ], - "4": [ + "riker_wgs_coverage": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.quantized.bed.gz:md5,8975e3f5a62bb2ea6f349539daf8e9a4" + "test.wgs-coverage.txt:md5,b36c075591ac1e8c01ab181e072c65a5" ] ], - "5": [ + "riker_wgs_metrics": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.quantized.bed.gz.csi:md5,a4dd4f2635eaa215cc92ec03d754e955" + "test.wgs-metrics.txt:md5,a1fe4910710f106af7c995f929f4b7c9" ] ], - "6": [ + "samtools_coverage": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.mosdepth.region.dist.txt:md5,baffaa91e753347fd44c2e6e0a618d1f" + "test.coverage.txt:md5,2d81e108bf4175f2b892ab6e749fdf92" ] ], - "7": [ + "samtools_flagstat": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.regions.bed.gz:md5,82848481047cda38748ec0409db8a669" + "test.flagstat:md5,167e69b479663a15194ddf56cbc9e60e" ] ], - "8": [ + "samtools_idxstats": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.regions.bed.gz.csi:md5,d128b1a1648ebc007d22b5c4a23663a6" + "test.idxstats:md5,081d0431383fb7ea6b51b7077c6ec93c" ] ], - "9": [ + "samtools_stats": [ [ { "id": "test", "single_end": false, - "qc_mode": "basic" + "qc_mode": "full" }, - "test.mosdepth.summary.txt:md5,c929389c608f49ca01d800fb5cc94bb9" + "test.stats:md5,ff81063faa5cf509f16044c4160733b5" ] - ], + ] + } + ], + "timestamp": "2026-06-30T14:28:14.248686", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "bam QC - basic - roi": { + "content": [ + { "mosdepth_global": [ [ { @@ -1585,7 +1193,55 @@ "panelcoverage": [ ], - "riker_metrics": [ + "riker_alignment_metrics": [ + + ], + "riker_base_dist": [ + + ], + "riker_error_indel": [ + + ], + "riker_error_mismatch": [ + + ], + "riker_error_overlap": [ + + ], + "riker_gcbias_detail": [ + + ], + "riker_gcbias_summary": [ + + ], + "riker_hybcap_metrics": [ + + ], + "riker_hybcap_per_base": [ + + ], + "riker_hybcap_per_target": [ + + ], + "riker_isize_histogram": [ + + ], + "riker_isize_metrics": [ + + ], + "riker_mean_qual": [ + + ], + "riker_pdf": [ + + ], + "riker_qual_dist": [ + + ], + "riker_wgs_coverage": [ + + ], + "riker_wgs_metrics": [ ], "samtools_coverage": [ @@ -1616,7 +1272,7 @@ ] } ], - "timestamp": "2026-06-30T13:45:59.9134", + "timestamp": "2026-06-30T14:28:26.674146", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/tests/workflows/preprocessing.nf.test b/tests/workflows/preprocessing.nf.test index 7d9dc49b..4acffdb5 100644 --- a/tests/workflows/preprocessing.nf.test +++ b/tests/workflows/preprocessing.nf.test @@ -76,6 +76,7 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", + "riker_pdf", "samtools_coverage", "samtools_flagstat", "samtools_stats" @@ -153,6 +154,7 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", + "riker_pdf", "samtools_coverage", "samtools_flagstat", "samtools_stats" @@ -232,6 +234,7 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", + "riker_pdf", "samtools_coverage", "samtools_flagstat", "samtools_stats" @@ -301,6 +304,7 @@ nextflow_workflow { "multiqcsav_data", "multiqcsav_plots", "multiqcsav_report", + "riker_pdf", "samtools_coverage", "samtools_flagstat", "samtools_stats" diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index 0a5c026f..7b46d025 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -371,7 +371,7 @@ "panelcoverage": [ ], - "riker_metrics": [ + "riker_alignment_metrics": [ [ { "groupSize": 1, @@ -396,24 +396,312 @@ "id": "sample1" } }, + "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1" + ] + ], + "riker_base_dist": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3" + ] + ], + "riker_error_indel": [ + + ], + "riker_error_mismatch": [ + + ], + "riker_error_overlap": [ + + ], + "riker_gcbias_detail": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c" + ] + ], + "riker_gcbias_summary": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f" + ] + ], + "riker_hybcap_metrics": [ + + ], + "riker_hybcap_per_base": [ + + ], + "riker_hybcap_per_target": [ + + ], + "riker_isize_histogram": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "riker_isize_metrics": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "riker_mean_qual": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe" + ] + ], + "riker_pdf": [ + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WGS" + } + }, [ - "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", - "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", - "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", - "sample1.gcbias-chart.pdf:md5,76b876df43ac778292fc03bcdc90398c", - "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c", - "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f", - "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", - "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", - "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", - "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a", - "sample1.wgs-coverage.txt:md5,4387e3d5a1046eb409a8ebb451fabcc7", - "sample1.wgs-metrics.txt:md5,05c64580c5ea68ba1987c56c4cc31968" + "sample1.base-distribution-by-cycle.pdf", + "sample1.gcbias-chart.pdf", + "sample1.mean-quality-by-cycle.pdf", + "sample1.quality-score-distribution.pdf" ] ] ], + "riker_qual_dist": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" + ] + ], + "riker_wgs_coverage": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.wgs-coverage.txt:md5,4387e3d5a1046eb409a8ebb451fabcc7" + ] + ], + "riker_wgs_metrics": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WGS", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.wgs-metrics.txt:md5,05c64580c5ea68ba1987c56c4cc31968" + ] + ], "rna_junctions": [ ], @@ -562,7 +850,7 @@ ] } ], - "timestamp": "2026-06-30T13:42:49.210405", + "timestamp": "2026-06-30T14:25:16.877778", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1086,7 +1374,55 @@ "panelcoverage": [ ], - "riker_metrics": [ + "riker_alignment_metrics": [ + + ], + "riker_base_dist": [ + + ], + "riker_error_indel": [ + + ], + "riker_error_mismatch": [ + + ], + "riker_error_overlap": [ + + ], + "riker_gcbias_detail": [ + + ], + "riker_gcbias_summary": [ + + ], + "riker_hybcap_metrics": [ + + ], + "riker_hybcap_per_base": [ + + ], + "riker_hybcap_per_target": [ + + ], + "riker_isize_histogram": [ + + ], + "riker_isize_metrics": [ + + ], + "riker_mean_qual": [ + + ], + "riker_pdf": [ + + ], + "riker_qual_dist": [ + + ], + "riker_wgs_coverage": [ + + ], + "riker_wgs_metrics": [ ], "rna_junctions": [ @@ -1190,7 +1526,7 @@ ] } ], - "timestamp": "2026-06-30T13:44:13.001967", + "timestamp": "2026-06-30T14:26:38.2057", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1346,10 +1682,158 @@ "tag": "WES" } }, - "sample1.md5" + "sample1.md5" + ] + ], + "mosdepth_global": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mosdepth.global.dist.txt:md5,4574a0f755903d7ab7aa07297cc1efee" + ] + ], + "mosdepth_per_base_bed": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.per-base.bed.gz:md5,e5c10c94f3870f6ed2c75a904e9ade7f" + ] + ], + "mosdepth_per_base_csi": [ + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WES" + } + }, + "sample1.per-base.bed.gz.csi" + ] + ], + "mosdepth_per_base_d4": [ + + ], + "mosdepth_quantized_bed": [ + [ + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.quantized.bed.gz:md5,d54d469a692c3fe4a4e1db02c08be518" + ] + ], + "mosdepth_quantized_csi": [ + [ + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WES" + } + }, + "sample1.quantized.bed.gz.csi" ] ], - "mosdepth_global": [ + "mosdepth_regions": [ [ { "groupSize": 1, @@ -1375,10 +1859,10 @@ "id": "sample1" } }, - "sample1.mosdepth.global.dist.txt:md5,4574a0f755903d7ab7aa07297cc1efee" + "sample1.mosdepth.region.dist.txt:md5,388e05b0b4d7754be6fdc0b1b6eabed9" ] ], - "mosdepth_per_base_bed": [ + "mosdepth_regions_bed": [ [ { "groupSize": 1, @@ -1404,10 +1888,10 @@ "id": "sample1" } }, - "sample1.per-base.bed.gz:md5,e5c10c94f3870f6ed2c75a904e9ade7f" + "sample1.regions.bed.gz:md5,6b7cc84380695011ffd0681dc79cefaa" ] ], - "mosdepth_per_base_csi": [ + "mosdepth_regions_csi": [ [ { "groupSize": 1, @@ -1433,13 +1917,10 @@ "tag": "WES" } }, - "sample1.per-base.bed.gz.csi" + "sample1.regions.bed.gz.csi" ] ], - "mosdepth_per_base_d4": [ - - ], - "mosdepth_quantized_bed": [ + "mosdepth_summary": [ [ { "groupSize": 1, @@ -1465,39 +1946,82 @@ "id": "sample1" } }, - "sample1.quantized.bed.gz:md5,d54d469a692c3fe4a4e1db02c08be518" + "sample1.mosdepth.summary.txt:md5,f1f18d9bd23783bedb7f9e246e192a7e" ] ], - "mosdepth_quantized_csi": [ + "mosdepth_thresholds_bed": [ + + ], + "mosdepth_thresholds_csi": [ + + ], + "multiqc_data": [ + [ + { + "id": "test" + }, + "test_data" + ] + ], + "multiqc_plots": [ + + ], + "multiqc_report": [ + [ + { + "id": "test" + }, + "test.html" + ] + ], + "multiqcsav_data": [ + [ + + ] + ], + "multiqcsav_plots": [ + [ + + ] + ], + "multiqcsav_report": [ + [ + + ] + ], + "panelcoverage": [ + + ], + "riker_alignment_metrics": [ [ { "groupSize": 1, "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, "genome": "GRCh38", "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "qc_mode": "full", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WES" + "id": "sample1" } }, - "sample1.quantized.bed.gz.csi" + "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1" ] ], - "mosdepth_regions": [ + "riker_base_dist": [ [ { "groupSize": 1, @@ -1523,10 +2047,19 @@ "id": "sample1" } }, - "sample1.mosdepth.region.dist.txt:md5,388e05b0b4d7754be6fdc0b1b6eabed9" + "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3" ] ], - "mosdepth_regions_bed": [ + "riker_error_indel": [ + + ], + "riker_error_mismatch": [ + + ], + "riker_error_overlap": [ + + ], + "riker_gcbias_detail": [ [ { "groupSize": 1, @@ -1552,39 +2085,39 @@ "id": "sample1" } }, - "sample1.regions.bed.gz:md5,6b7cc84380695011ffd0681dc79cefaa" + "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c" ] ], - "mosdepth_regions_csi": [ + "riker_gcbias_summary": [ [ { "groupSize": 1, "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, "genome": "GRCh38", "genome_data": { - "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" }, - "id": "sample1", - "library": "test", - "markdup": "bamsormadup", - "organism": "Homo sapiens", - "qc_mode": "full", - "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", - "sample_type": "DNA", - "samplename": "sample1", - "single_end": false, - "tag": "WES" + "id": "sample1" } }, - "sample1.regions.bed.gz.csi" + "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f" ] ], - "mosdepth_summary": [ + "riker_hybcap_metrics": [ [ { "groupSize": 1, @@ -1610,53 +2143,137 @@ "id": "sample1" } }, - "sample1.mosdepth.summary.txt:md5,f1f18d9bd23783bedb7f9e246e192a7e" + "sample1.hybcap-metrics.txt:md5,0e5cf0bfd2f1142f56462ec7cf4c990c" ] ], - "mosdepth_thresholds_bed": [ + "riker_hybcap_per_base": [ ], - "mosdepth_thresholds_csi": [ + "riker_hybcap_per_target": [ ], - "multiqc_data": [ + "riker_isize_histogram": [ [ { - "id": "test" + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } }, - "test_data" + "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "multiqc_plots": [ - - ], - "multiqc_report": [ + "riker_isize_metrics": [ [ { - "id": "test" + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } }, - "test.html" - ] - ], - "multiqcsav_data": [ - [ - + "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "multiqcsav_plots": [ + "riker_mean_qual": [ [ - + { + "groupSize": 1, + "groupTarget": { + "samplename": "sample1", + "library": "test", + "organism": "Homo sapiens", + "tag": "WES", + "sample_type": "DNA", + "aligner": "bwamem", + "markdup": "bamsormadup", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "single_end": false, + "genome": "GRCh38", + "genome_data": { + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1" + } + }, + "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe" ] ], - "multiqcsav_report": [ + "riker_pdf": [ [ - + { + "groupSize": 1, + "groupTarget": { + "aligner": "bwamem", + "genome": "GRCh38", + "genome_data": { + "bwamem": "s3://test-data/genomics/homo_sapiens/genome/bwa/", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "gtf": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf" + }, + "id": "sample1", + "library": "test", + "markdup": "bamsormadup", + "organism": "Homo sapiens", + "qc_mode": "full", + "roi": "https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", + "sample_type": "DNA", + "samplename": "sample1", + "single_end": false, + "tag": "WES" + } + }, + [ + "sample1.base-distribution-by-cycle.pdf", + "sample1.gcbias-chart.pdf", + "sample1.mean-quality-by-cycle.pdf", + "sample1.quality-score-distribution.pdf" + ] ] ], - "panelcoverage": [ - - ], - "riker_metrics": [ + "riker_qual_dist": [ [ { "groupSize": 1, @@ -1682,22 +2299,14 @@ "id": "sample1" } }, - [ - "sample1.alignment-metrics.txt:md5,0c6f36de09941f6d379bed9e772e50c1", - "sample1.base-distribution-by-cycle.pdf:md5,0fbd0473740dc74751af4d4503511a5f", - "sample1.base-distribution-by-cycle.txt:md5,832a8f50ac2102d5ffc6d796bec099a3", - "sample1.gcbias-chart.pdf:md5,76b876df43ac778292fc03bcdc90398c", - "sample1.gcbias-detail.txt:md5,b2533e5ee58845d5c45b6d1461db846c", - "sample1.gcbias-summary.txt:md5,fd2ebca34401bfda1579b21062977b6f", - "sample1.hybcap-metrics.txt:md5,7cae4a6cf3b7b4bf0958553c1c89ed62", - "sample1.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample1.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "sample1.mean-quality-by-cycle.pdf:md5,f90eae685942493bdf1df90d39650c2c", - "sample1.mean-quality-by-cycle.txt:md5,022828223ec254dc82935ee886413fbe", - "sample1.quality-score-distribution.pdf:md5,0564c904cc1234189061a6f5362393f6", - "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" - ] + "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" ] + ], + "riker_wgs_coverage": [ + + ], + "riker_wgs_metrics": [ + ], "rna_junctions": [ @@ -1852,7 +2461,7 @@ ] } ], - "timestamp": "2026-06-30T13:41:19.764326", + "timestamp": "2026-06-30T14:23:56.444223", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/workflows/preprocessing.nf b/workflows/preprocessing.nf index 5c358589..78fc5e23 100644 --- a/workflows/preprocessing.nf +++ b/workflows/preprocessing.nf @@ -295,11 +295,26 @@ workflow PREPROCESSING { BAM_QC.out.mosdepth_global, BAM_QC.out.mosdepth_regions, BAM_QC.out.mosdepth_summary, - BAM_QC.out.riker_metrics, BAM_QC.out.samtools_coverage, BAM_QC.out.samtools_flagstat, BAM_QC.out.samtools_idxstats, BAM_QC.out.samtools_stats, + BAM_QC.out.riker_alignment_metrics, + BAM_QC.out.riker_base_dist, + BAM_QC.out.riker_mean_qual, + BAM_QC.out.riker_qual_dist, + BAM_QC.out.riker_error_mismatch, + BAM_QC.out.riker_error_overlap, + BAM_QC.out.riker_error_indel, + BAM_QC.out.riker_gcbias_detail, + BAM_QC.out.riker_gcbias_summary, + BAM_QC.out.riker_hybcap_metrics, + BAM_QC.out.riker_hybcap_per_target, + BAM_QC.out.riker_hybcap_per_base, + BAM_QC.out.riker_isize_metrics, + BAM_QC.out.riker_isize_histogram, + BAM_QC.out.riker_wgs_metrics, + BAM_QC.out.riker_wgs_coverage, ) /* @@ -419,7 +434,23 @@ workflow PREPROCESSING { samtools_stats = BAM_QC.out.samtools_stats samtools_flagstat = BAM_QC.out.samtools_flagstat samtools_idxstats = BAM_QC.out.samtools_idxstats - riker_metrics = BAM_QC.out.riker_metrics + riker_alignment_metrics = BAM_QC.out.riker_alignment_metrics + riker_base_dist = BAM_QC.out.riker_base_dist + riker_mean_qual = BAM_QC.out.riker_mean_qual + riker_qual_dist = BAM_QC.out.riker_qual_dist + riker_error_mismatch = BAM_QC.out.riker_error_mismatch + riker_error_overlap = BAM_QC.out.riker_error_overlap + riker_error_indel = BAM_QC.out.riker_error_indel + riker_gcbias_detail = BAM_QC.out.riker_gcbias_detail + riker_gcbias_summary = BAM_QC.out.riker_gcbias_summary + riker_hybcap_metrics = BAM_QC.out.riker_hybcap_metrics + riker_hybcap_per_target = BAM_QC.out.riker_hybcap_per_target + riker_hybcap_per_base = BAM_QC.out.riker_hybcap_per_base + riker_isize_metrics = BAM_QC.out.riker_isize_metrics + riker_isize_histogram = BAM_QC.out.riker_isize_histogram + riker_wgs_metrics = BAM_QC.out.riker_wgs_metrics + riker_wgs_coverage = BAM_QC.out.riker_wgs_coverage + riker_pdf = BAM_QC.out.riker_pdf md5sums = MD5SUM.out.checksum multiqcsav_report = MULTIQCSAV.out.report.toList() multiqcsav_data = MULTIQCSAV.out.data.toList() From 1b3e212f1392b7c69177a4a95eb143e42e206af6 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 30 Jun 2026 14:38:46 +0200 Subject: [PATCH 19/62] tweak test input --- tests/inputs/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/inputs/test.yml b/tests/inputs/test.yml index 3a432b4b..9002ac1c 100644 --- a/tests/inputs/test.yml +++ b/tests/inputs/test.yml @@ -13,7 +13,7 @@ tag: WES aligner: bwamem markdup: bamsormadup - run_coverage: true + qc_mode: basic fastq_1: https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/fastq/sample1_R1.fastq.gz fastq_2: https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/fastq/sample1_R2.fastq.gz - id: DNA1_L002 @@ -23,7 +23,7 @@ tag: WES aligner: bwamem markdup: bamsormadup - run_coverage: true + qc_mode: basic fastq_1: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/test_R1.fastq.gz fastq_2: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/test_R2.fastq.gz # RNA fastq inputs @@ -35,7 +35,7 @@ sample_type: RNA aligner: star markdup: bamsormadup - run_coverage: true + qc_mode: basic fastq_1: https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/fastq/sample1_R1.fastq.gz fastq_2: https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/fastq/sample1_R2.fastq.gz - id: RNA1_L002 @@ -46,6 +46,6 @@ sample_type: RNA aligner: star markdup: bamsormadup - run_coverage: true + qc_mode: basic fastq_1: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/test_R1.fastq.gz fastq_2: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/test_R2.fastq.gz From cfd8f20f929590356761ea89da33a9218ae4e0f1 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 12:52:52 +0200 Subject: [PATCH 20/62] fix test config --- conf/test.config | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/test.config b/conf/test.config index 8b6c7486..26275a2c 100644 --- a/conf/test.config +++ b/conf/test.config @@ -16,7 +16,7 @@ params { // Input data input = "${projectDir}/tests/inputs/test.yml" - igenomes_base = "s3://reference-data/genomes" + custom_config_base = null } process { @@ -28,3 +28,10 @@ process { } includeConfig "../tests/config/igenomes_test.config" + +aws { + client { + endpoint = 'https://s3.ugent.be' + s3PathStyleAccess = true + } +} \ No newline at end of file From b82e93f0c53348dbee9ab5a44f37ae0d29894823 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 12:59:46 +0200 Subject: [PATCH 21/62] add fgumi modules --- modules.json | 30 ++++ modules/nf-core/fgumi/extract/environment.yml | 7 + modules/nf-core/fgumi/extract/main.nf | 38 +++++ modules/nf-core/fgumi/extract/meta.yml | 70 ++++++++ .../nf-core/fgumi/extract/tests/main.nf.test | 73 +++++++++ .../fgumi/extract/tests/main.nf.test.snap | 54 ++++++ .../fgumi/extract/tests/nextflow.config | 5 + modules/nf-core/fgumi/filter/environment.yml | 7 + modules/nf-core/fgumi/filter/main.nf | 56 +++++++ modules/nf-core/fgumi/filter/meta.yml | 108 ++++++++++++ .../nf-core/fgumi/filter/tests/main.nf.test | 103 ++++++++++++ .../fgumi/filter/tests/main.nf.test.snap | 76 +++++++++ .../fgumi/filter/tests/nextflow.config | 5 + modules/nf-core/fgumi/group/environment.yml | 7 + modules/nf-core/fgumi/group/main.nf | 52 ++++++ modules/nf-core/fgumi/group/meta.yml | 100 ++++++++++++ .../nf-core/fgumi/group/tests/main.nf.test | 74 +++++++++ .../fgumi/group/tests/main.nf.test.snap | 86 ++++++++++ .../nf-core/fgumi/group/tests/nextflow.config | 5 + modules/nf-core/fgumi/simplex/environment.yml | 7 + modules/nf-core/fgumi/simplex/main.nf | 54 ++++++ modules/nf-core/fgumi/simplex/meta.yml | 98 +++++++++++ .../nf-core/fgumi/simplex/tests/main.nf.test | 108 ++++++++++++ .../fgumi/simplex/tests/main.nf.test.snap | 154 ++++++++++++++++++ .../fgumi/simplex/tests/nextflow.config | 5 + modules/nf-core/fgumi/sort/environment.yml | 7 + modules/nf-core/fgumi/sort/main.nf | 45 +++++ modules/nf-core/fgumi/sort/meta.yml | 82 ++++++++++ modules/nf-core/fgumi/sort/tests/main.nf.test | 89 ++++++++++ .../fgumi/sort/tests/main.nf.test.snap | 87 ++++++++++ .../nf-core/fgumi/sort/tests/nextflow.config | 5 + modules/nf-core/fgumi/zipper/environment.yml | 7 + modules/nf-core/fgumi/zipper/main.nf | 44 +++++ modules/nf-core/fgumi/zipper/meta.yml | 96 +++++++++++ .../nf-core/fgumi/zipper/tests/main.nf.test | 93 +++++++++++ .../fgumi/zipper/tests/main.nf.test.snap | 54 ++++++ .../fgumi/zipper/tests/nextflow.config | 10 ++ .../local/cram_umiconsensus_fgumi/main.nf | 70 ++++++++ 38 files changed, 2071 insertions(+) create mode 100644 modules/nf-core/fgumi/extract/environment.yml create mode 100644 modules/nf-core/fgumi/extract/main.nf create mode 100644 modules/nf-core/fgumi/extract/meta.yml create mode 100644 modules/nf-core/fgumi/extract/tests/main.nf.test create mode 100644 modules/nf-core/fgumi/extract/tests/main.nf.test.snap create mode 100644 modules/nf-core/fgumi/extract/tests/nextflow.config create mode 100644 modules/nf-core/fgumi/filter/environment.yml create mode 100644 modules/nf-core/fgumi/filter/main.nf create mode 100644 modules/nf-core/fgumi/filter/meta.yml create mode 100644 modules/nf-core/fgumi/filter/tests/main.nf.test create mode 100644 modules/nf-core/fgumi/filter/tests/main.nf.test.snap create mode 100644 modules/nf-core/fgumi/filter/tests/nextflow.config create mode 100644 modules/nf-core/fgumi/group/environment.yml create mode 100644 modules/nf-core/fgumi/group/main.nf create mode 100644 modules/nf-core/fgumi/group/meta.yml create mode 100644 modules/nf-core/fgumi/group/tests/main.nf.test create mode 100644 modules/nf-core/fgumi/group/tests/main.nf.test.snap create mode 100644 modules/nf-core/fgumi/group/tests/nextflow.config create mode 100644 modules/nf-core/fgumi/simplex/environment.yml create mode 100644 modules/nf-core/fgumi/simplex/main.nf create mode 100644 modules/nf-core/fgumi/simplex/meta.yml create mode 100644 modules/nf-core/fgumi/simplex/tests/main.nf.test create mode 100644 modules/nf-core/fgumi/simplex/tests/main.nf.test.snap create mode 100644 modules/nf-core/fgumi/simplex/tests/nextflow.config create mode 100644 modules/nf-core/fgumi/sort/environment.yml create mode 100644 modules/nf-core/fgumi/sort/main.nf create mode 100644 modules/nf-core/fgumi/sort/meta.yml create mode 100644 modules/nf-core/fgumi/sort/tests/main.nf.test create mode 100644 modules/nf-core/fgumi/sort/tests/main.nf.test.snap create mode 100644 modules/nf-core/fgumi/sort/tests/nextflow.config create mode 100644 modules/nf-core/fgumi/zipper/environment.yml create mode 100644 modules/nf-core/fgumi/zipper/main.nf create mode 100644 modules/nf-core/fgumi/zipper/meta.yml create mode 100644 modules/nf-core/fgumi/zipper/tests/main.nf.test create mode 100644 modules/nf-core/fgumi/zipper/tests/main.nf.test.snap create mode 100644 modules/nf-core/fgumi/zipper/tests/nextflow.config create mode 100644 subworkflows/local/cram_umiconsensus_fgumi/main.nf diff --git a/modules.json b/modules.json index c72e5dd1..641adb87 100644 --- a/modules.json +++ b/modules.json @@ -50,6 +50,36 @@ "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", "installed_by": ["modules"] }, + "fgumi/extract": { + "branch": "master", + "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", + "installed_by": ["modules"] + }, + "fgumi/filter": { + "branch": "master", + "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", + "installed_by": ["modules"] + }, + "fgumi/group": { + "branch": "master", + "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", + "installed_by": ["modules"] + }, + "fgumi/simplex": { + "branch": "master", + "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", + "installed_by": ["modules"] + }, + "fgumi/sort": { + "branch": "master", + "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", + "installed_by": ["modules"] + }, + "fgumi/zipper": { + "branch": "master", + "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", + "installed_by": ["modules"] + }, "gnu/sort": { "branch": "master", "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", diff --git a/modules/nf-core/fgumi/extract/environment.yml b/modules/nf-core/fgumi/extract/environment.yml new file mode 100644 index 00000000..68aafa2b --- /dev/null +++ b/modules/nf-core/fgumi/extract/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/extract/main.nf b/modules/nf-core/fgumi/extract/main.nf new file mode 100644 index 00000000..0012489b --- /dev/null +++ b/modules/nf-core/fgumi/extract/main.nf @@ -0,0 +1,38 @@ +process FGUMI_EXTRACT { + tag "${meta.id}" + label 'process_single' + + 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data' + : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" + + input: + tuple val(meta), path(reads), val(library) + + output: + tuple val(meta), path("*.bam"), emit: bam + tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + fgumi extract \\ + --inputs ${reads.join(' ')} \\ + --output ${prefix}.bam \\ + ${args} \\ + --sample ${prefix} \\ + --library "${library}" + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + """ +} diff --git a/modules/nf-core/fgumi/extract/meta.yml b/modules/nf-core/fgumi/extract/meta.yml new file mode 100644 index 00000000..7d62b590 --- /dev/null +++ b/modules/nf-core/fgumi/extract/meta.yml @@ -0,0 +1,70 @@ +name: fgumi_extract +description: Extract unique molecular indices (UMIs) from FASTQ files and write + an unaligned BAM file. +keywords: + - umi + - extract + - fastq + - bam +tools: + - fgumi: + description: High-performance tools for working with UMI-tagged sequencing + data. + homepage: https://github.com/fulcrumgenomics/fgumi + documentation: https://docs.rs/fgumi + tool_dev_url: https://github.com/fulcrumgenomics/fgumi + licence: + - "MIT" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: Input FASTQ files used for UMI extraction. + pattern: "*.fastq.gz" + ontologies: + - edam: http://edamontology.org/format_3989 + - library: + type: string + description: Library name to store in the output BAM read group. +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: Unaligned BAM with extracted UMIs in SAM tags. + pattern: "*.bam" + ontologies: [] + versions_fgumi: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgumi: + type: string + description: The tool name + - 'fgumi --version | sed "s/^fgumi //"': + 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 + - fgumi: + type: string + description: The tool name + - 'fgumi --version | sed "s/^fgumi //"': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@atrigila" +maintainers: + - "@atrigila" diff --git a/modules/nf-core/fgumi/extract/tests/main.nf.test b/modules/nf-core/fgumi/extract/tests/main.nf.test new file mode 100644 index 00000000..44ce2572 --- /dev/null +++ b/modules/nf-core/fgumi/extract/tests/main.nf.test @@ -0,0 +1,73 @@ +nextflow_process { + + name "Test Process FGUMI_EXTRACT" + script "../main.nf" + process "FGUMI_EXTRACT" + + tag "modules" + tag "modules_nfcore" + tag "fgumi" + tag "fgumi/extract" + + config "./nextflow.config" + + test("homo_sapiens - [fastq1, fastq2]") { + + when { + params { + module_args = '' + } + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test.umi_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test.umi_2.fastq.gz', checkIfExists: true) + ], + 'illumina', + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } + + test("homo_sapiens - [fastq1, fastq2] - stub") { + + options "-stub" + + when { + params { + module_args = "--read-structures +T +M" + } + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test.umi_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/fastq/test.umi_2.fastq.gz', checkIfExists: true) + ], + 'test', + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } +} diff --git a/modules/nf-core/fgumi/extract/tests/main.nf.test.snap b/modules/nf-core/fgumi/extract/tests/main.nf.test.snap new file mode 100644 index 00000000..ea6272b6 --- /dev/null +++ b/modules/nf-core/fgumi/extract/tests/main.nf.test.snap @@ -0,0 +1,54 @@ +{ + "homo_sapiens - [fastq1, fastq2]": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,8ff70d4f5b57e368a1b25d2828eae94a" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_EXTRACT", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T12:58:31.777515", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - [fastq1, fastq2] - stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_EXTRACT", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T12:58:36.320289", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/extract/tests/nextflow.config b/modules/nf-core/fgumi/extract/tests/nextflow.config new file mode 100644 index 00000000..54ef8845 --- /dev/null +++ b/modules/nf-core/fgumi/extract/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: FGUMI_EXTRACT { + ext.args = { "${params.module_args}" } + } +} diff --git a/modules/nf-core/fgumi/filter/environment.yml b/modules/nf-core/fgumi/filter/environment.yml new file mode 100644 index 00000000..68aafa2b --- /dev/null +++ b/modules/nf-core/fgumi/filter/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/filter/main.nf b/modules/nf-core/fgumi/filter/main.nf new file mode 100644 index 00000000..9578123b --- /dev/null +++ b/modules/nf-core/fgumi/filter/main.nf @@ -0,0 +1,56 @@ +process FGUMI_FILTER { + 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data' + : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" + + input: + tuple val(meta), path(bam) + tuple val(meta2), path(fasta) + val min_reads + val keep_rejected + + output: + tuple val(meta), path("${prefix}.bam") , emit: bam + tuple val(meta), path("${prefix}.rejects.bam"), emit: rejects, optional: true + tuple val(meta), path("${prefix}.stats.txt") , emit: stats + tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}_consensus_filtered" + def rejects_command = keep_rejected ? "--rejects ${prefix}.rejects.bam" : '' + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + + """ + fgumi filter \\ + --input ${bam} \\ + --output ${prefix}.bam \\ + --ref ${fasta} \\ + --min-reads ${min_reads} \\ + --threads ${task.cpus} \\ + --stats ${prefix}.stats.txt \\ + ${rejects_command} \\ + ${args} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}_consensus_filtered" + def rejects_command = keep_rejected ? "touch ${prefix}.rejects.bam" : '' + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + """ + touch ${prefix}.bam + ${rejects_command} + touch ${prefix}.stats.txt + """ +} diff --git a/modules/nf-core/fgumi/filter/meta.yml b/modules/nf-core/fgumi/filter/meta.yml new file mode 100644 index 00000000..b6af0220 --- /dev/null +++ b/modules/nf-core/fgumi/filter/meta.yml @@ -0,0 +1,108 @@ +name: "fgumi_filter" +description: | + Filters consensus reads generated by simplex or duplex consensus calling. + This is a high-performance replacement for fgbio FilterConsensusReads. +keywords: + - umi + - filter + - consensus + - bam +tools: + - "fgumi": + description: "High-performance tools for working with UMI-tagged sequencing data." + homepage: "https://github.com/fulcrumgenomics/fgumi" + documentation: "https://docs.rs/fgumi" + tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" + licence: + - "MIT" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Consensus BAM file to be filtered + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + - - meta2: + type: map + description: | + Groovy Map containing genome information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta,fna}" + ontologies: + - edam: "http://edamontology.org/format_1929" + - min_reads: + type: integer + description: Minimum number of reads required to keep a consensus read + - keep_rejected: + type: boolean + description: Whether to keep rejected reads in a separate BAM file +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.bam": + type: file + description: Filtered consensus BAM file + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + rejects: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.rejects.bam": + type: file + description: Optional BAM file containing reads that were filtered out + pattern: "*.rejects.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + stats: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.stats.txt": + type: file + description: Optional text file containing filtering statistics + pattern: "*.stats.txt" + ontologies: [] + versions_fgumi: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgumi: + type: string + description: The tool name + - 'fgumi --version | sed "s/^fgumi //"': + 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 + - fgumi: + type: string + description: The tool name + - 'fgumi --version | sed "s/^fgumi //"': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@sppearce" +maintainers: + - "@sppearce" diff --git a/modules/nf-core/fgumi/filter/tests/main.nf.test b/modules/nf-core/fgumi/filter/tests/main.nf.test new file mode 100644 index 00000000..26fd52cf --- /dev/null +++ b/modules/nf-core/fgumi/filter/tests/main.nf.test @@ -0,0 +1,103 @@ +nextflow_process { + + name "Test Process FGUMI_FILTER" + script "../main.nf" + process "FGUMI_FILTER" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "fgumi" + tag "fgumi/filter" + tag "fgumi/sort" + tag "fgumi/group" + tag "fgumi/simplex" + + setup { + run("FGUMI_SORT") { + script "../../sort/main.nf" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/umi/test.paired_end.unsorted_tagged.bam', checkIfExists: true) + ] + """ + } + + } + run("FGUMI_GROUP") { + script "../../group/main.nf" + process { + """ + input[0] = FGUMI_SORT.out.bam + input[1] = 'adjacency' + """ + } + } + run("FGUMI_SIMPLEX") { + script "../../simplex/main.nf" + process { + """ + input[0] = FGUMI_GROUP.out.bam + input[1] = 1 + input[2] = false + """ + } + } + } + + test("homo_sapiens - bam") { + + when { + process { + """ + input[0] = FGUMI_SIMPLEX.out.bam + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = 1 + input[3] = false + """ + } + } + + then { + assert process.success + assertAll( + // bam file is non deterministic in its output order + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ['bam'])).match() } + ) + } + + } + + test("homo_sapiens - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = FGUMI_SIMPLEX.out.bam + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ] + input[2] = 1 + input[3] = false + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } + +} diff --git a/modules/nf-core/fgumi/filter/tests/main.nf.test.snap b/modules/nf-core/fgumi/filter/tests/main.nf.test.snap new file mode 100644 index 00000000..3de4c61d --- /dev/null +++ b/modules/nf-core/fgumi/filter/tests/main.nf.test.snap @@ -0,0 +1,76 @@ +{ + "homo_sapiens - bam": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_consensus_filtered.bam" + ] + ], + "rejects": [ + + ], + "stats": [ + [ + { + "id": "test" + }, + "test_consensus_filtered.stats.txt:md5,88f50c970ee78378013d32614dde9b47" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_FILTER", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:02:25.899958", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - bam - stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_consensus_filtered.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rejects": [ + + ], + "stats": [ + [ + { + "id": "test" + }, + "test_consensus_filtered.stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_FILTER", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:02:33.747873", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/filter/tests/nextflow.config b/modules/nf-core/fgumi/filter/tests/nextflow.config new file mode 100644 index 00000000..28103edf --- /dev/null +++ b/modules/nf-core/fgumi/filter/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: FGUMI_SORT { + ext.args = '--order template-coordinate' + } +} diff --git a/modules/nf-core/fgumi/group/environment.yml b/modules/nf-core/fgumi/group/environment.yml new file mode 100644 index 00000000..68aafa2b --- /dev/null +++ b/modules/nf-core/fgumi/group/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/group/main.nf b/modules/nf-core/fgumi/group/main.nf new file mode 100644 index 00000000..8325f992 --- /dev/null +++ b/modules/nf-core/fgumi/group/main.nf @@ -0,0 +1,52 @@ +process FGUMI_GROUP { + 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data' + : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" + + input: + tuple val(meta), path(bam) + val strategy + + output: + tuple val(meta), path("*.bam") , emit: bam + tuple val(meta), path("*.family_size_histogram.txt"), emit: histogram + tuple val(meta), path("*.grouping_metrics.txt") , emit: metrics + tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + 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!") + } + + """ + fgumi group \\ + --input ${bam} \\ + --output ${prefix}.bam \\ + --strategy ${strategy} \\ + --family-size-histogram ${prefix}.family_size_histogram.txt \\ + --grouping-metrics ${prefix}.grouping_metrics.txt \\ + --threads ${task.cpus} \\ + ${args} + """ + + 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!") + } + """ + touch ${prefix}.bam + touch ${prefix}.family_size_histogram.txt + touch ${prefix}.grouping_metrics.txt + """ +} diff --git a/modules/nf-core/fgumi/group/meta.yml b/modules/nf-core/fgumi/group/meta.yml new file mode 100644 index 00000000..4a3a3c3c --- /dev/null +++ b/modules/nf-core/fgumi/group/meta.yml @@ -0,0 +1,100 @@ +name: "fgumi_group" +description: | + Groups reads together that appear to have come from the same original molecule. + Reads are grouped by template, and then templates are sorted by the 5' mapping positions + of the reads from the template. Reads that have the same end positions are then sub-grouped + by UMI sequence. This is a high-performance replacement for fgbio GroupReadsByUmi. +keywords: + - umi + - groupreads + - bam +tools: + - "fgumi": + description: "High-performance tools for working with UMI-tagged sequencing data." + homepage: "https://github.com/fulcrumgenomics/fgumi" + documentation: "https://docs.rs/fgumi" + tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" + licence: + - "MIT" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: | + BAM file containing reads with UMI tags. The file must be coordinate sorted. + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + - 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: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: UMI-grouped BAM file + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + histogram: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.family_size_histogram.txt": + type: file + description: Optional output of tag family size counts + pattern: "*.family_size_histogram.txt" + metrics: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.grouping_metrics.txt": + type: file + description: Optional output of UMI grouping metrics + pattern: "*.grouping_metrics.txt" + versions_fgumi: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgumi: + type: string + description: The tool name + - fgumi --version | sed "s/^fgumi //": + 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 + - fgumi: + type: string + description: The tool name + - fgumi --version | sed "s/^fgumi //": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@sppearce" +maintainers: + - "@sppearce" diff --git a/modules/nf-core/fgumi/group/tests/main.nf.test b/modules/nf-core/fgumi/group/tests/main.nf.test new file mode 100644 index 00000000..6ed0f513 --- /dev/null +++ b/modules/nf-core/fgumi/group/tests/main.nf.test @@ -0,0 +1,74 @@ +nextflow_process { + + name "Test Process FGUMI_GROUP" + script "../main.nf" + process "FGUMI_GROUP" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "fgumi" + tag "fgumi/group" + tag "fgumi/sort" + + test("sarscov2 - bam") { + + setup { + run("FGUMI_SORT") { + script "../../sort/main.nf" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/umi/test.paired_end.unsorted_tagged.bam', checkIfExists: true) + ] + """ + } + } + } + + when { + process { + """ + input[0] = FGUMI_SORT.out.bam + input[1] = 'adjacency' + """ + } + } + + then { + assert process.success + assertAll( + // bam file is non deterministic in its output order + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ['bam'])).match() } + ) + } + + } + + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/umi/test.paired_end.unsorted_tagged.bam', checkIfExists: true) + ] + input[1] = 'adjacency' + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } + +} diff --git a/modules/nf-core/fgumi/group/tests/main.nf.test.snap b/modules/nf-core/fgumi/group/tests/main.nf.test.snap new file mode 100644 index 00000000..6e1025ac --- /dev/null +++ b/modules/nf-core/fgumi/group/tests/main.nf.test.snap @@ -0,0 +1,86 @@ +{ + "sarscov2 - bam - stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_umi-grouped.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "histogram": [ + [ + { + "id": "test" + }, + "test_umi-grouped.family_size_histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "metrics": [ + [ + { + "id": "test" + }, + "test_umi-grouped.grouping_metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_GROUP", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:02:42.606299", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2 - bam": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_umi-grouped.bam" + ] + ], + "histogram": [ + [ + { + "id": "test" + }, + "test_umi-grouped.family_size_histogram.txt:md5,4f680ae7e7413c4b88f7ee82fd237162" + ] + ], + "metrics": [ + [ + { + "id": "test" + }, + "test_umi-grouped.grouping_metrics.txt:md5,6d32f1f0d9277fe6f07d5e6ff56e70ac" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_GROUP", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:02:38.63142", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/group/tests/nextflow.config b/modules/nf-core/fgumi/group/tests/nextflow.config new file mode 100644 index 00000000..28103edf --- /dev/null +++ b/modules/nf-core/fgumi/group/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: FGUMI_SORT { + ext.args = '--order template-coordinate' + } +} diff --git a/modules/nf-core/fgumi/simplex/environment.yml b/modules/nf-core/fgumi/simplex/environment.yml new file mode 100644 index 00000000..68aafa2b --- /dev/null +++ b/modules/nf-core/fgumi/simplex/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/simplex/main.nf b/modules/nf-core/fgumi/simplex/main.nf new file mode 100644 index 00000000..bd654c15 --- /dev/null +++ b/modules/nf-core/fgumi/simplex/main.nf @@ -0,0 +1,54 @@ +process FGUMI_SIMPLEX { + tag "${meta.id}" + label 'process_medium' + + 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data' + : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" + + input: + tuple val(meta), path(grouped_bam) + val min_reads + val keep_rejected + + output: + tuple val(meta), path("${prefix}.bam") , emit: bam + tuple val(meta), path("${prefix}.rejects.bam"), emit: rejects, optional: true + tuple val(meta), path("${prefix}.stats.txt") , emit: stats + tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}_simplex_unmapped" + def rejects_command = keep_rejected ? "--rejects ${prefix}.rejects.bam" : '' + + if ("${grouped_bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + + """ + fgumi simplex \\ + --input ${grouped_bam} \\ + --output ${prefix}.bam \\ + --min-reads ${min_reads} \\ + --threads ${task.cpus} \\ + --stats ${prefix}.stats.txt \\ + ${rejects_command} \\ + ${args} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}_simplex_unmapped" + if ("${grouped_bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + """ + touch ${prefix}.bam + touch ${prefix}.rejects.bam + touch ${prefix}.stats.txt + """ +} diff --git a/modules/nf-core/fgumi/simplex/meta.yml b/modules/nf-core/fgumi/simplex/meta.yml new file mode 100644 index 00000000..0f7a751a --- /dev/null +++ b/modules/nf-core/fgumi/simplex/meta.yml @@ -0,0 +1,98 @@ +name: "fgumi_simplex" +description: | + Calls simplex consensus sequences from reads with the same unique molecular tag. + This is a high-performance replacement for fgbio CallMolecularConsensusReads. +keywords: + - umi + - consensus + - simplex + - bam +tools: + - "fgumi": + description: "High-performance tools for working with UMI-tagged sequencing data." + homepage: "https://github.com/fulcrumgenomics/fgumi" + documentation: "https://docs.rs/fgumi" + tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" + licence: + - "MIT" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - grouped_bam: + type: file + description: | + The input SAM or BAM file, grouped by UMIs + pattern: "*.{bam,sam}" + ontologies: + - edam: "http://edamontology.org/format_2572" + - min_reads: + type: integer + description: Minimum number of original reads to build each consensus read. + - keep_rejected: + type: boolean + description: If true, output rejected reads to a separate BAM file +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.bam": + type: file + description: | + Output SAM or BAM file with simplex consensus reads. + pattern: "*.{bam,sam}" + ontologies: + - edam: "http://edamontology.org/format_2572" + rejects: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.rejects.bam": + type: file + description: Optional BAM file containing reads that were rejected + pattern: "*.rejects.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" # BAM + stats: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "${prefix}.stats.txt": + type: file + description: Optional text file containing consensus statistics + pattern: "*.stats.txt" + versions_fgumi: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgumi: + type: string + description: The tool name + - fgumi --version | sed "s/^fgumi //": + 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 + - fgumi: + type: string + description: The tool name + - fgumi --version | sed "s/^fgumi //": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@sppearce" +maintainers: + - "@sppearce" diff --git a/modules/nf-core/fgumi/simplex/tests/main.nf.test b/modules/nf-core/fgumi/simplex/tests/main.nf.test new file mode 100644 index 00000000..2442b881 --- /dev/null +++ b/modules/nf-core/fgumi/simplex/tests/main.nf.test @@ -0,0 +1,108 @@ +nextflow_process { + + name "Test Process FGUMI_SIMPLEX" + script "../main.nf" + process "FGUMI_SIMPLEX" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "fgumi" + tag "fgumi/simplex" + tag "fgumi/sort" + tag "fgumi/group" + + setup { + run("FGUMI_SORT") { + script "../../sort/main.nf" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/umi/test.paired_end.unsorted_tagged.bam', checkIfExists: true) + ] + """ + } + } + run("FGUMI_GROUP") { + script "../../group/main.nf" + process { + """ + input[0] = FGUMI_SORT.out.bam + input[1] = 'adjacency' + """ + } + } + } + + test("homo_sapiens - bam") { + + when { + process { + """ + input[0] = FGUMI_GROUP.out.bam + input[1] = 1 + input[2] = false + """ + } + } + + then { + assert process.success + assertAll( + // bam file is non deterministic in its output order + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ['bam'])).match() } + ) + } + + } + + test("homo_sapiens - bam - with rejects") { + + when { + process { + """ + input[0] = FGUMI_GROUP.out.bam + input[1] = 1 + input[2] = true + """ + } + } + + then { + assert process.success + assertAll( + // bam file is non deterministic in its output order + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ['bam', 'rejects'])).match() } + ) + } + + } + + test("homo_sapiens - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/umi/test.paired_end.umi_grouped.bam', checkIfExists: true) + ] + input[1] = 1 + input[2] = false + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/fgumi/simplex/tests/main.nf.test.snap b/modules/nf-core/fgumi/simplex/tests/main.nf.test.snap new file mode 100644 index 00000000..566a0e48 --- /dev/null +++ b/modules/nf-core/fgumi/simplex/tests/main.nf.test.snap @@ -0,0 +1,154 @@ +{ + "homo_sapiens - bam - with rejects": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.bam" + ] + ], + "rejects": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.rejects.bam" + ] + ], + "stats": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.stats.txt:md5,61bfbca538c809387368c351412732ee" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_SIMPLEX", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:03:21.948365", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - bam": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.bam" + ] + ], + "rejects": [ + + ], + "stats": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.stats.txt:md5,61bfbca538c809387368c351412732ee" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_SIMPLEX", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:03:15.753204", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.rejects.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "FGUMI_SIMPLEX", + "fgumi", + "0.4.0" + ] + ], + "bam": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rejects": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.rejects.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "stats": [ + [ + { + "id": "test" + }, + "test_simplex_unmapped.stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_SIMPLEX", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:03:28.332176", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/simplex/tests/nextflow.config b/modules/nf-core/fgumi/simplex/tests/nextflow.config new file mode 100644 index 00000000..28103edf --- /dev/null +++ b/modules/nf-core/fgumi/simplex/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: FGUMI_SORT { + ext.args = '--order template-coordinate' + } +} diff --git a/modules/nf-core/fgumi/sort/environment.yml b/modules/nf-core/fgumi/sort/environment.yml new file mode 100644 index 00000000..68aafa2b --- /dev/null +++ b/modules/nf-core/fgumi/sort/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/sort/main.nf b/modules/nf-core/fgumi/sort/main.nf new file mode 100644 index 00000000..a3262e5d --- /dev/null +++ b/modules/nf-core/fgumi/sort/main.nf @@ -0,0 +1,45 @@ +process FGUMI_SORT { + tag "${meta.id}" + label 'process_medium' + + 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data' + : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bam"), emit: bam + tuple val(meta), path("*.{csi,bai}"), emit: index, optional: true + tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}_sorted" + + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + + """ + fgumi sort \\ + --input ${bam} \\ + --output ${prefix}.bam \\ + --threads ${task.cpus} \\ + ${args} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}_sorted" + if ("${bam}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + """ + touch ${prefix}.bam + """ +} diff --git a/modules/nf-core/fgumi/sort/meta.yml b/modules/nf-core/fgumi/sort/meta.yml new file mode 100644 index 00000000..1dc25228 --- /dev/null +++ b/modules/nf-core/fgumi/sort/meta.yml @@ -0,0 +1,82 @@ +name: "fgumi_sort" +description: | + Sorts a SAM or BAM file. Several sort orders are available, including coordinate, + queryname, and template-coordinate. This is a high-performance replacement for fgbio SortBam. +keywords: + - sort + - bam + - sam +tools: + - "fgumi": + description: "High-performance tools for working with UMI-tagged sequencing data." + homepage: "https://github.com/fulcrumgenomics/fgumi" + documentation: "https://docs.rs/fgumi" + tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" + licence: + - "MIT" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: | + The input SAM or BAM file to be sorted. + pattern: "*.{bam,sam}" + ontologies: + - edam: "http://edamontology.org/format_2572" +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.bam": + type: file + description: | + Sorted output BAM file. + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + index: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{csi,bai}": + type: file + description: | + Index file if the bam file is coordinate sorted. + pattern: "*.{csi,bai}" + ontologies: + - edam: "http://edamontology.org/format_3327" + versions_fgumi: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fgumi: + type: string + description: The tool name + - 'fgumi --version | sed "s/^fgumi //"': + 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 + - fgumi: + type: string + description: The tool name + - 'fgumi --version | sed "s/^fgumi //"': + type: eval + description: The expression to obtain the version of the tool +authors: + - "@sppearce" +maintainers: + - "@sppearce" diff --git a/modules/nf-core/fgumi/sort/tests/main.nf.test b/modules/nf-core/fgumi/sort/tests/main.nf.test new file mode 100644 index 00000000..fc549bf5 --- /dev/null +++ b/modules/nf-core/fgumi/sort/tests/main.nf.test @@ -0,0 +1,89 @@ +nextflow_process { + + name "Test Process FGUMI_SORT" + script "../main.nf" + process "FGUMI_SORT" + + tag "modules" + tag "modules_nfcore" + tag "fgumi" + tag "fgumi/sort" + + test("sarscov2 - bam") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + bam(process.out.bam.get(0).get(1)).getReadsMD5(), + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - bam - template-coordinate") { + + when { + params { + module_args = '--order template-coordinate' + } + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + bam(process.out.bam.get(0).get(1)).getReadsMD5(), + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("sarscov2 - bam - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/fgumi/sort/tests/main.nf.test.snap b/modules/nf-core/fgumi/sort/tests/main.nf.test.snap new file mode 100644 index 00000000..ad6dfc3b --- /dev/null +++ b/modules/nf-core/fgumi/sort/tests/main.nf.test.snap @@ -0,0 +1,87 @@ +{ + "sarscov2 - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + [ + "FGUMI_SORT", + "fgumi", + "0.4.0" + ] + ], + "bam": [ + [ + { + "id": "test" + }, + "test_sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index": [ + + ], + "versions_fgumi": [ + [ + "FGUMI_SORT", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:03:56.414869", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2 - bam": { + "content": [ + "461d8083b03a321eb1902ad544fd7d2f", + { + "versions_fgumi": [ + [ + "FGUMI_SORT", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:03:43.67993", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "sarscov2 - bam - template-coordinate": { + "content": [ + "461d8083b03a321eb1902ad544fd7d2f", + { + "versions_fgumi": [ + [ + "FGUMI_SORT", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:03:47.645547", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/sort/tests/nextflow.config b/modules/nf-core/fgumi/sort/tests/nextflow.config new file mode 100644 index 00000000..4ad67e9b --- /dev/null +++ b/modules/nf-core/fgumi/sort/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: FGUMI_SORT { + ext.args = { params.module_args } + } +} diff --git a/modules/nf-core/fgumi/zipper/environment.yml b/modules/nf-core/fgumi/zipper/environment.yml new file mode 100644 index 00000000..68aafa2b --- /dev/null +++ b/modules/nf-core/fgumi/zipper/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/zipper/main.nf b/modules/nf-core/fgumi/zipper/main.nf new file mode 100644 index 00000000..b85206fc --- /dev/null +++ b/modules/nf-core/fgumi/zipper/main.nf @@ -0,0 +1,44 @@ +process FGUMI_ZIPPER { + tag "$meta.id" + label 'process_medium' + + 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data': + 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b' }" + + input: + tuple val(meta), path(bam), path(unmapped) + tuple val(meta2), path(fasta), path(fai), path(dict) + + output: + tuple val(meta), path("*.bam"), emit: bam + tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}_zipped" + if ("${bam}" == "${prefix}.bam" || "${unmapped}" == "${prefix}.bam") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } + """ + fgumi \\ + zipper \\ + --input ${bam} \\ + --unmapped ${unmapped} \\ + --reference ${fasta} \\ + --output ${prefix}.bam \\ + --threads ${task.cpus} \\ + ${args} + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}_zipped" + """ + touch ${prefix}.bam + """ +} diff --git a/modules/nf-core/fgumi/zipper/meta.yml b/modules/nf-core/fgumi/zipper/meta.yml new file mode 100644 index 00000000..682d62b2 --- /dev/null +++ b/modules/nf-core/fgumi/zipper/meta.yml @@ -0,0 +1,96 @@ +name: "fgumi_zipper" +description: Zip an unmapped UMI BAM together with its aligned BAM using fgumi +keywords: + - UMIs + - zipper + - bam + - alignment + - merge +tools: + - "fgumi": + description: "High-performance tools for UMI-tagged sequencing data." + homepage: "https://github.com/fulcrumgenomics/fgumi" + documentation: "https://fgumi.readthedocs.io/" + tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" + licence: + - "MIT" + identifier: biotools:fgumi +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - bam: + type: file + description: Aligned (mapped) BAM, in the same queryname order as the + unmapped BAM + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + - unmapped: + type: file + description: Unmapped UMI BAM (e.g. from fgumi extract), queryname order + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. `[ id:'genome' ]` + - fasta: + type: file + description: Reference genome FASTA file + pattern: "*.{fa,fasta,fna}" + ontologies: + - edam: "http://edamontology.org/data_2044" + - edam: "http://edamontology.org/format_1929" + - fai: + type: file + description: Reference genome FASTA index (.fai) + pattern: "*.fai" + ontologies: [] + - dict: + type: file + description: Reference sequence dictionary (.dict) + pattern: "*.dict" + ontologies: [] +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*.bam": + type: file + description: Zipped BAM with UMI tags transferred onto the aligned reads + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" + versions_fgumi: + - - ${task.process}: + type: string + description: The name of the process + - fgumi: + type: string + description: The name of the tool + - fgumi --version | sed "s/^fgumi //": + type: eval + description: The expression to obtain the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - fgumi: + type: string + description: The name of the tool + - fgumi --version | sed "s/^fgumi //": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@nh13" +maintainers: + - "@nh13" diff --git a/modules/nf-core/fgumi/zipper/tests/main.nf.test b/modules/nf-core/fgumi/zipper/tests/main.nf.test new file mode 100644 index 00000000..44dd2a62 --- /dev/null +++ b/modules/nf-core/fgumi/zipper/tests/main.nf.test @@ -0,0 +1,93 @@ +nextflow_process { + + name "Test Process FGUMI_ZIPPER" + script "../main.nf" + process "FGUMI_ZIPPER" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "fgumi" + tag "fgumi/zipper" + tag "fgumi/sort" + + setup { + run("FGUMI_SORT") { + script "../../sort/main.nf" + config "./nextflow.config" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ] + """ + } + } + run("FGUMI_SORT", alias: "FGUMI_SORT_UNMAPPED") { + script "../../sort/main.nf" + config "./nextflow.config" + process { + """ + input[0] = [ + [ id:'test' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ] + """ + } + } + } + + test("homo_sapiens - mapped + unmapped") { + + when { + process { + """ + input[0] = FGUMI_SORT.out.bam.join(FGUMI_SORT_UNMAPPED.out.bam) + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.dict', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["bam"])).match() } + ) + } + + } + + test("homo_sapiens - mapped + unmapped - stub") { + + options "-stub" + + when { + process { + """ + input[0] = FGUMI_SORT.out.bam.join(FGUMI_SORT_UNMAPPED.out.bam) + input[1] = [ + [ id:'genome' ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.dict', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } + +} diff --git a/modules/nf-core/fgumi/zipper/tests/main.nf.test.snap b/modules/nf-core/fgumi/zipper/tests/main.nf.test.snap new file mode 100644 index 00000000..e2d68def --- /dev/null +++ b/modules/nf-core/fgumi/zipper/tests/main.nf.test.snap @@ -0,0 +1,54 @@ +{ + "homo_sapiens - mapped + unmapped - stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_zipped.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_ZIPPER", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-29T13:35:32.697555", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - mapped + unmapped": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test_zipped.bam" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_ZIPPER", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-29T13:35:23.745077", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/zipper/tests/nextflow.config b/modules/nf-core/fgumi/zipper/tests/nextflow.config new file mode 100644 index 00000000..b72e20cf --- /dev/null +++ b/modules/nf-core/fgumi/zipper/tests/nextflow.config @@ -0,0 +1,10 @@ +process { + withName: 'FGUMI_SORT' { + ext.args = '--order queryname' + ext.prefix = 'test_mapped' + } + withName: 'FGUMI_SORT_UNMAPPED' { + ext.args = '--order queryname' + ext.prefix = 'test_unmapped' + } +} diff --git a/subworkflows/local/cram_umiconsensus_fgumi/main.nf b/subworkflows/local/cram_umiconsensus_fgumi/main.nf new file mode 100644 index 00000000..ec370baf --- /dev/null +++ b/subworkflows/local/cram_umiconsensus_fgumi/main.nf @@ -0,0 +1,70 @@ +#!/usr/bin/env nextflow + +// MODULES +include { FGUMI_EXTRACT } from "../../../modules/nf-core/fgumi/extract/main.nf" +include { FGUMI_FILTER } from "../../../modules/nf-core/fgumi/filter/main.nf" +include { FGUMI_GROUP } from "../../../modules/nf-core/fgumi/group/main.nf" +include { FGUMI_SIMPLEX } from "../../../modules/nf-core/fgumi/simplex/main.nf" +include { CRAM_SNAPZIPPER_FGUMI as RAW_CRAM_SNAPZIPPER_FGUMI } from "../cram_snapzipper_fgumi/main.nf" +include { CRAM_SNAPZIPPER_FGUMI as UMI_CRAM_SNAPZIPPER_FGUMI } from "../cram_snapzipper_fgumi/main.nf" + +// FUNCTIONS +include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' + +workflow CRAM_UMICONSENSUS_FGUMI { + take: + ch_meta_reads_aligner_index_fasta // channel: [mandatory] [meta, reads, aligner, index, fasta] + + main: + // Step numbers follow the fgumi basic workflow terminology (this path executes steps 1, 3, 4, 5, and 7). + // Step 1: build an unmapped BAM with UMI tags from input FASTQ. + FGUMI_EXTRACT( + ch_meta_reads_aligner_index_fasta + .map { meta, reads, _aligner, _index, _fasta, _fai -> [meta, reads, (meta.readgroup?.LB ?: meta.library ?: meta.id)] } + ) + + // Step 3: align with SNAP, zipper tags back, then template-coordinate sort. + RAW_CRAM_SNAPZIPPER_FGUMI( + FGUMI_EXTRACT.out.bam + .join( + ch_meta_reads_aligner_index_fasta.map { meta, _reads, _aligner, _index, fasta, fai -> + [meta, getGenomeAttribute(meta.genome_data, 'snap'), fasta, getGenomeAttribute(meta.genome_data, 'dict'), fai] + }, + ) + ) + + FGUMI_GROUP( + RAW_CRAM_SNAPZIPPER_FGUMI.out.bam, + (params.fgumi_group_strategy ?: 'adjacency') + ) + + FGUMI_SIMPLEX( + FGUMI_GROUP.out.bam, + (params.fgumi_simplex_min_reads ?: 1), + false + ) + + // Step 7: filter consensus reads, then coordinate-sort/index for downstream CRAM conversion. + FGUMI_FILTER( + FGUMI_SIMPLEX.out.bam + .join(ch_meta_reads_aligner_index_fasta) + .map { meta, simplex_bams, _reads, _aligner, _index, fasta, _fai -> [meta, simplex_bams, fasta] }, + '1,1,1', + false + ) + + UMI_CRAM_SNAPZIPPER_FGUMI( + FGUMI_FILTER.out.bam + .join(ch_meta_reads_aligner_index_fasta) + .map { meta, filtered_bams, _reads, _aligner, _index, fasta, fai -> [meta, filtered_bams, getGenomeAttribute(meta.genome_data, 'snap'), fasta, getGenomeAttribute(meta.genome_data, 'dict'), fai] } + ) + + emit: + cram = UMI_CRAM_SNAPZIPPER_FGUMI.out.bam + // Compatibility output kept for downstream interfaces; currently not produced by this branch. + zipper_diagnostics = channel.empty() + grouping_metrics = FGUMI_GROUP.out.metrics + family_size_histogram = FGUMI_GROUP.out.histogram + consensus_metrics = FGUMI_SIMPLEX.out.stats + filtering_metrics = FGUMI_FILTER.out.stats +} \ No newline at end of file From 96494529d117bbf38738af214135a3df4ea66079 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 13:04:41 +0200 Subject: [PATCH 22/62] add umi subwfs --- modules.json | 6 ++- modules/local/fgumi/snapalign/environment.yml | 7 +++ modules/local/fgumi/snapalign/main.nf | 45 +++++++++++++++++++ .../nf-core/fgumi/filter/fgumi-filter.diff | 21 +++++++++ modules/nf-core/fgumi/filter/main.nf | 3 +- .../nf-core/fgumi/zipper/fgumi-zipper.diff | 21 +++++++++ modules/nf-core/fgumi/zipper/main.nf | 3 +- .../local/cram_snapzipper_fgumi/main.nf | 45 +++++++++++++++++++ 8 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 modules/local/fgumi/snapalign/environment.yml create mode 100644 modules/local/fgumi/snapalign/main.nf create mode 100644 modules/nf-core/fgumi/filter/fgumi-filter.diff create mode 100644 modules/nf-core/fgumi/zipper/fgumi-zipper.diff create mode 100644 subworkflows/local/cram_snapzipper_fgumi/main.nf diff --git a/modules.json b/modules.json index 641adb87..139acb63 100644 --- a/modules.json +++ b/modules.json @@ -58,7 +58,8 @@ "fgumi/filter": { "branch": "master", "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/fgumi/filter/fgumi-filter.diff" }, "fgumi/group": { "branch": "master", @@ -78,7 +79,8 @@ "fgumi/zipper": { "branch": "master", "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/fgumi/zipper/fgumi-zipper.diff" }, "gnu/sort": { "branch": "master", diff --git a/modules/local/fgumi/snapalign/environment.yml b/modules/local/fgumi/snapalign/environment.yml new file mode 100644 index 00000000..e3507c34 --- /dev/null +++ b/modules/local/fgumi/snapalign/environment.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge + - bioconda +dependencies: + - bioconda::fgumi=0.4.0 + - bioconda::samtools=1.23.1 + - bioconda::snap-aligner=2.0.5 \ No newline at end of file diff --git a/modules/local/fgumi/snapalign/main.nf b/modules/local/fgumi/snapalign/main.nf new file mode 100644 index 00000000..dcca5a88 --- /dev/null +++ b/modules/local/fgumi/snapalign/main.nf @@ -0,0 +1,45 @@ +process FGUMI_SNAPALIGN { + 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/c5/c566f9e20f9eb4c5be9ff5a68e854f974caae916d67b4e03eb30eece186b73e8/data' + : 'community.wave.seqera.io/library/fgumi_samtools_snap-aligner:1708ad8bd6e764b6'}" + + input: + tuple val(meta), path(unmapped_bam), path(index, stageAs: "index/*"), path(fasta), path(dict) + + output: + tuple val(meta), path("${prefix}.snap.bam"), emit: mapped_bam + tuple val("${task.process}"), val('fgumi'), eval("fgumi --version | sed 's/^fgumi //;q'"), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def snap_args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}.fgumi" + + """ + # SNAP index directory is resolved from staged index content. + INDEX_FILE=\$(find -L ./ -name "OverflowTable*" -print -quit) + [ -z "\$INDEX_FILE" ] && echo "Snap index files not found" 1>&2 && exit 1 + INDEX=\$(dirname "\$INDEX_FILE") + + fgumi fastq --input ${unmapped_bam} \ + | snap-aligner paired \ + \$INDEX \ + -pairedInterleavedFastq - \ + -o ${prefix}.snap.bam \ + -t ${task.cpus} \ + ${snap_args} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}.fgumi" + """ + touch ${prefix}.snap.bam + touch ${unmapped_bam} + """ +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/filter/fgumi-filter.diff b/modules/nf-core/fgumi/filter/fgumi-filter.diff new file mode 100644 index 00000000..986d411e --- /dev/null +++ b/modules/nf-core/fgumi/filter/fgumi-filter.diff @@ -0,0 +1,21 @@ +Changes in component 'nf-core/fgumi/filter' +'modules/nf-core/fgumi/filter/meta.yml' is unchanged +'modules/nf-core/fgumi/filter/environment.yml' is unchanged +Changes in 'fgumi/filter/main.nf': +--- modules/nf-core/fgumi/filter/main.nf ++++ modules/nf-core/fgumi/filter/main.nf +@@ -8,8 +8,7 @@ + : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" + + input: +- tuple val(meta), path(bam) +- tuple val(meta2), path(fasta) ++ tuple val(meta), path(bam), path(fasta) + val min_reads + val keep_rejected + + +'modules/nf-core/fgumi/filter/tests/main.nf.test' is unchanged +'modules/nf-core/fgumi/filter/tests/nextflow.config' is unchanged +'modules/nf-core/fgumi/filter/tests/main.nf.test.snap' is unchanged +************************************************************ diff --git a/modules/nf-core/fgumi/filter/main.nf b/modules/nf-core/fgumi/filter/main.nf index 9578123b..b913165f 100644 --- a/modules/nf-core/fgumi/filter/main.nf +++ b/modules/nf-core/fgumi/filter/main.nf @@ -8,8 +8,7 @@ process FGUMI_FILTER { : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" input: - tuple val(meta), path(bam) - tuple val(meta2), path(fasta) + tuple val(meta), path(bam), path(fasta) val min_reads val keep_rejected diff --git a/modules/nf-core/fgumi/zipper/fgumi-zipper.diff b/modules/nf-core/fgumi/zipper/fgumi-zipper.diff new file mode 100644 index 00000000..c1e6a2e4 --- /dev/null +++ b/modules/nf-core/fgumi/zipper/fgumi-zipper.diff @@ -0,0 +1,21 @@ +Changes in component 'nf-core/fgumi/zipper' +'modules/nf-core/fgumi/zipper/environment.yml' is unchanged +Changes in 'fgumi/zipper/main.nf': +--- modules/nf-core/fgumi/zipper/main.nf ++++ modules/nf-core/fgumi/zipper/main.nf +@@ -8,8 +8,7 @@ + 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b' }" + + input: +- tuple val(meta), path(bam), path(unmapped) +- tuple val(meta2), path(fasta), path(fai), path(dict) ++ tuple val(meta), path(bam), path(unmapped), path(fasta), path(fai), path(dict) + + output: + tuple val(meta), path("*.bam"), emit: bam + +'modules/nf-core/fgumi/zipper/meta.yml' is unchanged +'modules/nf-core/fgumi/zipper/tests/main.nf.test' is unchanged +'modules/nf-core/fgumi/zipper/tests/main.nf.test.snap' is unchanged +'modules/nf-core/fgumi/zipper/tests/nextflow.config' is unchanged +************************************************************ diff --git a/modules/nf-core/fgumi/zipper/main.nf b/modules/nf-core/fgumi/zipper/main.nf index b85206fc..e54c07ef 100644 --- a/modules/nf-core/fgumi/zipper/main.nf +++ b/modules/nf-core/fgumi/zipper/main.nf @@ -8,8 +8,7 @@ process FGUMI_ZIPPER { 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b' }" input: - tuple val(meta), path(bam), path(unmapped) - tuple val(meta2), path(fasta), path(fai), path(dict) + tuple val(meta), path(bam), path(unmapped), path(fasta), path(fai), path(dict) output: tuple val(meta), path("*.bam"), emit: bam diff --git a/subworkflows/local/cram_snapzipper_fgumi/main.nf b/subworkflows/local/cram_snapzipper_fgumi/main.nf new file mode 100644 index 00000000..723b02d7 --- /dev/null +++ b/subworkflows/local/cram_snapzipper_fgumi/main.nf @@ -0,0 +1,45 @@ +#!/usr/bin/env nextflow + +// MODULES +include { FGUMI_SNAPALIGN } from "../../../modules/local/fgumi/snapalign/main.nf" +include { FGUMI_ZIPPER } from "../../../modules/nf-core/fgumi/zipper/main.nf" +include { FGUMI_SORT as FGUMI_TEMPLATE_SORT } from "../../../modules/nf-core/fgumi/sort/main.nf" +include { SAMTOOLS_SORT as SAMTOOLS_QNAME_SORT_UNMAPPED } from "../../../modules/nf-core/samtools/sort/main.nf" +include { SAMTOOLS_SORT as SAMTOOLS_QNAME_SORT_MAPPED } from "../../../modules/nf-core/samtools/sort/main.nf" + +workflow CRAM_SNAPZIPPER_FGUMI { + take: + ch_meta_unmapped_index_fasta_dict_fai + + main: + FGUMI_SNAPALIGN(ch_meta_unmapped_index_fasta_dict_fai.map { meta, unmapped_bam, index, fasta, dict, _fai -> [meta, unmapped_bam, index, fasta, dict] }) + + // Queryname sort the unmapped BAM in parallel with mapped BAM sort. + SAMTOOLS_QNAME_SORT_UNMAPPED( + ch_meta_unmapped_index_fasta_dict_fai.map { meta, unmapped_bam, _index, fasta, _dict, fai -> [meta, unmapped_bam, fasta, fai] }, + '' + ) + + // Sort mapped alignments by queryname and emit SAM for zipper stdin. + SAMTOOLS_QNAME_SORT_MAPPED( + FGUMI_SNAPALIGN.out.mapped_bam + .join( + ch_meta_unmapped_index_fasta_dict_fai.map { meta, _unmapped_bam, _index, fasta, _dict, fai -> [meta, fasta, fai] }, + ), + '' + ) + + FGUMI_ZIPPER( + SAMTOOLS_QNAME_SORT_MAPPED.out.bam + .join(SAMTOOLS_QNAME_SORT_UNMAPPED.out.bam) + .join( + ch_meta_unmapped_index_fasta_dict_fai.map { meta, _unmapped_bam, _index, fasta, dict, _fai -> [meta, fasta, dict] }, + ) + ) + + FGUMI_TEMPLATE_SORT(FGUMI_ZIPPER.out.bam) + + emit: + bam = FGUMI_TEMPLATE_SORT.out.bam + versions_fgumi = FGUMI_SNAPALIGN.out.versions_fgumi.mix(FGUMI_ZIPPER.out.versions_fgumi).mix(FGUMI_TEMPLATE_SORT.out.versions_fgumi) +} \ No newline at end of file From 5db4edb5621d17af3ce87b253b6230b2133d4f17 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 14:18:45 +0200 Subject: [PATCH 23/62] make it all work now --- assets/schema_input.json | 19 +++ assets/schema_sampleinfo.json | 19 +++ conf/modules.config | 111 ++++++++++++++++++ modules/nf-core/fgumi/simplex/main.nf | 3 +- .../local/cram_snapzipper_fgumi/main.nf | 12 +- .../local/fastq_to_aligned_cram/main.nf | 11 +- .../main.nf | 50 +++++--- tests/config/igenomes_test.config | 1 + tests/inputs/test.yml | 12 ++ 9 files changed, 212 insertions(+), 26 deletions(-) rename subworkflows/local/{cram_umiconsensus_fgumi => fastq_umiconsensus_fgumi}/main.nf (54%) diff --git a/assets/schema_input.json b/assets/schema_input.json index b7d61eb2..51ff67e7 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -53,6 +53,25 @@ "description": "Run markdup in UMI-aware mode. This applies to Samtools only and requires the UMI to be in the read name.", "default": false }, + "fgumi_aware": { + "meta": ["fgumi_aware"], + "type": "boolean", + "description": "Enable UMI-aware consensus processing through the fgumi branch.", + "default": false + }, + "fgumi_simplex_min_reads": { + "meta": ["fgumi_simplex_min_reads"], + "type": "integer", + "default": 1, + "minimum": 1, + "description": "Minimum number of reads required per UMI family for fgumi simplex consensus generation." + }, + "fgumi_snap_ignore_mismatched_pairs": { + "meta": ["fgumi_snap_ignore_mismatched_pairs"], + "type": "boolean", + "default": true, + "description": "Pass -I to SNAP to ignore mismatched read IDs in paired-end input." + }, "skip_trimming": { "meta": ["skip_trimming"], "type": "boolean", diff --git a/assets/schema_sampleinfo.json b/assets/schema_sampleinfo.json index e1acad33..6be4d4a9 100644 --- a/assets/schema_sampleinfo.json +++ b/assets/schema_sampleinfo.json @@ -93,6 +93,25 @@ "description": "Run markdup in UMI-aware mode. This applies to Samtools only and requires the UMI to be in the read name.", "default": false }, + "fgumi_aware": { + "meta": ["fgumi_aware"], + "type": "boolean", + "description": "Enable UMI-aware consensus processing through the fgumi branch.", + "default": false + }, + "fgumi_simplex_min_reads": { + "meta": ["fgumi_simplex_min_reads"], + "type": "integer", + "default": 1, + "minimum": 1, + "description": "Minimum number of reads required per UMI family for fgumi simplex consensus generation." + }, + "fgumi_snap_ignore_mismatched_pairs": { + "meta": ["fgumi_snap_ignore_mismatched_pairs"], + "type": "boolean", + "default": true, + "description": "Pass -I to SNAP to ignore mismatched read IDs in paired-end input." + }, "skip_trimming": { "meta": ["skip_trimming"], "type": "boolean", diff --git a/conf/modules.config b/conf/modules.config index b2e79466..562f4a32 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -231,6 +231,117 @@ process { } } + //// FGUMI extract (step 1) + withName: '.*FGUMI_EXTRACT' { + ext.prefix = { "${meta.id}.fgumi.unmapped" } + ext.args = { + [ + "--read-group-id ${meta.readgroup?.ID ?: meta.id}", + meta.readgroup?.PL ? "--platform ${meta.readgroup.PL}" : "", + meta.readgroup?.PU ? "--platform-unit \"${meta.readgroup.PU}\"" : "", + meta.readgroup?.PM ? "--platform-model \"${meta.readgroup.PM}\"" : "", + meta.readgroup?.CN ? "--sequencing-center \"${meta.readgroup.CN}\"" : "", + meta.readgroup?.PI ? "--predicted-insert-size ${meta.readgroup.PI}" : "", + meta.readgroup?.DS ? "--description \"${meta.readgroup.DS}\"" : "", + meta.readgroup?.DT ? "--run-date \"${meta.readgroup.DT}\"" : "", + "--read-structures ${meta.fgumi_read_structures ?: '+T +T'}", + ((meta.fgumi_extract_umis_from_read_names != null ? meta.fgumi_extract_umis_from_read_names : true) ? "--extract-umis-from-read-names" : ""), + ].join(" ").trim() + } + } + + //// FGUMI fastq | SNAP | zipper (step 3a) + withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:FGUMI_SNAPALIGN' { + ext.prefix = { "${meta.id}.fgumi" } + ext.args = { + [ + "-b-", + "-sm 20", + meta.fgumi_snap_ignore_mismatched_pairs ? "-I" : "", + "-hc-", + "-S id", + "-sa", + "-xf 2", + meta.readgroup ? "-R \"@RG\\t" + meta.readgroup.findResults { rg -> rg.value?.trim() ? "${rg.key}:${rg.value}" : null }.join("\\t") + "\"" : "", + ].join(" ").trim() + } + } + + //// Queryname sort unmapped BAM before zipper (step 3b) + withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_UNMAPPED' { + ext.prefix = { "${meta.id}.fgumi.unmapped.queryname" } + ext.args = "-n" + } + + //// Queryname sort mapped stream before zipper (step 3c) + withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_MAPPED' { + cpus = 16 + memory = 64.GB + ext.prefix = { "${meta.id}.fgumi.snap.queryname" } + ext.args = "-n" + } + + //// FGUMI zipper between queryname-sorted streams (step 3d) + withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:FGUMI_ZIPPER' { + ext.prefix = { "${meta.id}.fgumi" } + } + + //// FGUMI template-coordinate sort after zipper (step 3e) + withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:FGUMI_TEMPLATE_SORT' { + ext.prefix = { "${meta.id}.fgumi.template" } + ext.args = { + [ + "--order template-coordinate", + "--max-memory ${task.memory.toGiga()}G", + ].join(" ").trim() + } + } + + //// FGUMI group (step 4) + withName: '.*FGUMI_GROUP' { + cpus = 8 + memory = 32.GB + ext.prefix = { "${meta.id}.fgumi.group" } + ext.args = { "--edits ${meta.fgumi_group_edits != null ? meta.fgumi_group_edits : 1}" } + } + + //// FGUMI simplex (step 5) + withName: '.*FGUMI_SIMPLEX' { + ext.prefix = { "${meta.id}.fgumi.simplex" } + ext.args = { "--max-memory ${task.memory.toGiga()}G" } + } + + //// FGUMI filter + coordinate sort/index (step 7) + withName: '.*FGUMI_FILTER' { + ext.prefix = { "${meta.id}.fgumi.filter" } + } + + //// FGUMI consensus alignment (step 8) + withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_UNMAPPED' { + ext.prefix = { "${meta.id}.fgumi.unmapped.queryname" } + ext.args = "-n" + } + + withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_MAPPED' { + ext.prefix = { "${meta.id}.fgumi.snap.queryname" } + ext.args = "-n" + } + + withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:FGUMI_ZIPPER' { + ext.prefix = { "${meta.id}.fgumi" } + } + + withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:FGUMI_TEMPLATE_SORT' { + ext.prefix = { "${meta.id}.fgumi.template" } + ext.args = { + [ + "--order coordinate", + "--max-memory ${task.memory.toGiga()}G", + ].join(" ").trim() + } + } + + // QC //// Mosdepth withName: '.*BAM_QC:MOSDEPTH' { diff --git a/modules/nf-core/fgumi/simplex/main.nf b/modules/nf-core/fgumi/simplex/main.nf index bd654c15..794f65b3 100644 --- a/modules/nf-core/fgumi/simplex/main.nf +++ b/modules/nf-core/fgumi/simplex/main.nf @@ -8,8 +8,7 @@ process FGUMI_SIMPLEX { : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" input: - tuple val(meta), path(grouped_bam) - val min_reads + tuple val(meta), path(grouped_bam), val(min_reads) val keep_rejected output: diff --git a/subworkflows/local/cram_snapzipper_fgumi/main.nf b/subworkflows/local/cram_snapzipper_fgumi/main.nf index 723b02d7..7d140304 100644 --- a/subworkflows/local/cram_snapzipper_fgumi/main.nf +++ b/subworkflows/local/cram_snapzipper_fgumi/main.nf @@ -12,7 +12,12 @@ workflow CRAM_SNAPZIPPER_FGUMI { ch_meta_unmapped_index_fasta_dict_fai main: - FGUMI_SNAPALIGN(ch_meta_unmapped_index_fasta_dict_fai.map { meta, unmapped_bam, index, fasta, dict, _fai -> [meta, unmapped_bam, index, fasta, dict] }) + FGUMI_SNAPALIGN( + ch_meta_unmapped_index_fasta_dict_fai + .map { meta, unmapped_bam, index, fasta, dict, _fai -> + [meta, unmapped_bam, index, fasta, dict] + } + ) // Queryname sort the unmapped BAM in parallel with mapped BAM sort. SAMTOOLS_QNAME_SORT_UNMAPPED( @@ -32,9 +37,8 @@ workflow CRAM_SNAPZIPPER_FGUMI { FGUMI_ZIPPER( SAMTOOLS_QNAME_SORT_MAPPED.out.bam .join(SAMTOOLS_QNAME_SORT_UNMAPPED.out.bam) - .join( - ch_meta_unmapped_index_fasta_dict_fai.map { meta, _unmapped_bam, _index, fasta, dict, _fai -> [meta, fasta, dict] }, - ) + .join(ch_meta_unmapped_index_fasta_dict_fai) + .map { meta, mbam, ubam, _reads, _index, fasta, dict, fai -> [meta, mbam, ubam, fasta, fai, dict] }, ) FGUMI_TEMPLATE_SORT(FGUMI_ZIPPER.out.bam) diff --git a/subworkflows/local/fastq_to_aligned_cram/main.nf b/subworkflows/local/fastq_to_aligned_cram/main.nf index bf87f087..f6a7c33a 100644 --- a/subworkflows/local/fastq_to_aligned_cram/main.nf +++ b/subworkflows/local/fastq_to_aligned_cram/main.nf @@ -11,8 +11,9 @@ include { SAMTOOLS_SORMADUP } from "../../../modules/nf-core/samtools/sormad include { SAMTOOLS_SORT } from "../../../modules/nf-core/samtools/sort/main" // SUBWORKFLOWS -include { FASTQ_ALIGN_DNA } from '../../nf-core/fastq_align_dna/main' -include { FASTQ_ALIGN_RNA } from '../../local/fastq_align_rna/main' +include { FASTQ_ALIGN_DNA } from '../../nf-core/fastq_align_dna/main' +include { FASTQ_ALIGN_RNA } from '../../local/fastq_align_rna/main' +include { FASTQ_UMICONSENSUS_FGUMI } from '../fastq_umiconsensus_fgumi/main.nf' // FUNCTIONS include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' @@ -35,6 +36,8 @@ workflow FASTQ_TO_CRAM { .branch { meta, reads, aligner, index, fasta, fai, gtf -> rna: meta.sample_type == "RNA" return [meta, reads, "star", getGenomeAttribute(meta.genome_data, 'star'), gtf] + umi: meta.fgumi_aware == true + return [meta, reads] dna: true // catch all non-RNA samples as DNA, as some may be missing sample_type or have other sample types (e.g. tissue, cell line, etc.) that should be aligned with the DNA aligner //dna: meta.sample_type == "DNA" || meta.sample_type == "Tissue" @@ -44,6 +47,9 @@ workflow FASTQ_TO_CRAM { // align fastq files per sample // ALIGNMENT([meta,fastq], index, sort) + FASTQ_UMICONSENSUS_FGUMI( + ch_meta_reads_aligner_index_fasta_datatype.umi + ) FASTQ_ALIGN_DNA( ch_meta_reads_aligner_index_fasta_datatype.dna, false, @@ -60,6 +66,7 @@ workflow FASTQ_TO_CRAM { FASTQ_ALIGN_DNA.out.bam .mix(FASTQ_ALIGN_RNA.out.bam) + .mix(FASTQ_UMICONSENSUS_FGUMI.out.cram) .map { meta, files -> def gk = (meta.chunks as Integer ?: 1) return [ diff --git a/subworkflows/local/cram_umiconsensus_fgumi/main.nf b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf similarity index 54% rename from subworkflows/local/cram_umiconsensus_fgumi/main.nf rename to subworkflows/local/fastq_umiconsensus_fgumi/main.nf index ec370baf..8949259d 100644 --- a/subworkflows/local/cram_umiconsensus_fgumi/main.nf +++ b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf @@ -11,58 +11,72 @@ include { CRAM_SNAPZIPPER_FGUMI as UMI_CRAM_SNAPZIPPER_FGUMI } from "../cram_sn // FUNCTIONS include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' -workflow CRAM_UMICONSENSUS_FGUMI { +workflow FASTQ_UMICONSENSUS_FGUMI { take: - ch_meta_reads_aligner_index_fasta // channel: [mandatory] [meta, reads, aligner, index, fasta] + ch_meta_fastqs // channel: [mandatory] [meta, fastqs] main: // Step numbers follow the fgumi basic workflow terminology (this path executes steps 1, 3, 4, 5, and 7). // Step 1: build an unmapped BAM with UMI tags from input FASTQ. FGUMI_EXTRACT( - ch_meta_reads_aligner_index_fasta - .map { meta, reads, _aligner, _index, _fasta, _fai -> [meta, reads, (meta.readgroup?.LB ?: meta.library ?: meta.id)] } + ch_meta_fastqs + .map { meta, fastqs -> [meta, fastqs, (meta.readgroup?.LB ?: meta.library ?: meta.id)] } ) // Step 3: align with SNAP, zipper tags back, then template-coordinate sort. RAW_CRAM_SNAPZIPPER_FGUMI( FGUMI_EXTRACT.out.bam - .join( - ch_meta_reads_aligner_index_fasta.map { meta, _reads, _aligner, _index, fasta, fai -> - [meta, getGenomeAttribute(meta.genome_data, 'snap'), fasta, getGenomeAttribute(meta.genome_data, 'dict'), fai] - }, - ) + .join(ch_meta_fastqs) + .map { meta, ubams, _fastqs -> + [ + meta, + ubams, + getGenomeAttribute(meta.genome_data, 'snap'), + getGenomeAttribute(meta.genome_data, 'fasta'), + getGenomeAttribute(meta.genome_data, 'dict'), + getGenomeAttribute(meta.genome_data, 'fai') + ] + }, ) FGUMI_GROUP( RAW_CRAM_SNAPZIPPER_FGUMI.out.bam, - (params.fgumi_group_strategy ?: 'adjacency') + 'adjacency' ) FGUMI_SIMPLEX( - FGUMI_GROUP.out.bam, - (params.fgumi_simplex_min_reads ?: 1), + FGUMI_GROUP.out.bam.map { meta, bams -> [ meta, bams, meta.fgumi_simplex_min_reads ] }, false ) // Step 7: filter consensus reads, then coordinate-sort/index for downstream CRAM conversion. FGUMI_FILTER( FGUMI_SIMPLEX.out.bam - .join(ch_meta_reads_aligner_index_fasta) - .map { meta, simplex_bams, _reads, _aligner, _index, fasta, _fai -> [meta, simplex_bams, fasta] }, + .join(ch_meta_fastqs) + .map { meta, simplex_bams, _fastqs -> + [meta, simplex_bams, getGenomeAttribute(meta.genome_data, 'fasta')] + }, '1,1,1', false ) UMI_CRAM_SNAPZIPPER_FGUMI( FGUMI_FILTER.out.bam - .join(ch_meta_reads_aligner_index_fasta) - .map { meta, filtered_bams, _reads, _aligner, _index, fasta, fai -> [meta, filtered_bams, getGenomeAttribute(meta.genome_data, 'snap'), fasta, getGenomeAttribute(meta.genome_data, 'dict'), fai] } + .join(ch_meta_fastqs) + .map { meta, filtered_bams, _fastqs -> + [ + meta, + filtered_bams, + getGenomeAttribute(meta.genome_data, 'snap'), + getGenomeAttribute(meta.genome_data, 'fasta'), + getGenomeAttribute(meta.genome_data, 'dict'), + getGenomeAttribute(meta.genome_data, 'fai') + ] + } ) emit: cram = UMI_CRAM_SNAPZIPPER_FGUMI.out.bam - // Compatibility output kept for downstream interfaces; currently not produced by this branch. - zipper_diagnostics = channel.empty() grouping_metrics = FGUMI_GROUP.out.metrics family_size_histogram = FGUMI_GROUP.out.histogram consensus_metrics = FGUMI_SIMPLEX.out.stats diff --git a/tests/config/igenomes_test.config b/tests/config/igenomes_test.config index c3b2802d..4d3a6492 100644 --- a/tests/config/igenomes_test.config +++ b/tests/config/igenomes_test.config @@ -1,6 +1,7 @@ params.genomes = [ GRCh38: [ bwamem : "s3://test-data/genomics/homo_sapiens/genome/bwa/", + snap : "s3://test-data/genomics/homo_sapiens/genome/snap/", dict : "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", fai : "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", fasta : "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", diff --git a/tests/inputs/test.yml b/tests/inputs/test.yml index 9002ac1c..332a4a71 100644 --- a/tests/inputs/test.yml +++ b/tests/inputs/test.yml @@ -49,3 +49,15 @@ qc_mode: basic fastq_1: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/test_R1.fastq.gz fastq_2: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/test_R2.fastq.gz +- id: umi_sample + samplename: umi_sample + library: test_library + organism: Homo sapiens + tag: WES + sample_type: DNA + aligner: snap + markdup: bamsormadup + fgumi_aware: true + run_coverage: true + fastq_1: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R1_001.fastq.gz + fastq_2: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R2_001.fastq.gz \ No newline at end of file From 0bd2a01fb3482c0f66e50a3bba0e8317d0cf2880 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 15:38:39 +0200 Subject: [PATCH 24/62] address review comments + merge umi align subwf into one process --- conf/modules.config | 65 ++++++------------- modules/local/fgumi/snapalign/main.nf | 45 ------------- .../environment.yml | 1 - modules/local/fgumi/snapzipsort/main.nf | 59 +++++++++++++++++ .../local/cram_snapzipper_fgumi/main.nf | 49 -------------- .../local/fastq_umiconsensus_fgumi/main.nf | 21 +++--- 6 files changed, 89 insertions(+), 151 deletions(-) delete mode 100644 modules/local/fgumi/snapalign/main.nf rename modules/local/fgumi/{snapalign => snapzipsort}/environment.yml (78%) create mode 100644 modules/local/fgumi/snapzipsort/main.nf delete mode 100644 subworkflows/local/cram_snapzipper_fgumi/main.nf diff --git a/conf/modules.config b/conf/modules.config index 562f4a32..6dec67f4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -251,9 +251,9 @@ process { } //// FGUMI fastq | SNAP | zipper (step 3a) - withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:FGUMI_SNAPALIGN' { + withName: 'RAW_FGUMI_SNAPZIPSORT' { ext.prefix = { "${meta.id}.fgumi" } - ext.args = { + ext.args2 = { [ "-b-", "-sm 20", @@ -262,34 +262,11 @@ process { "-S id", "-sa", "-xf 2", + "-o -sam -", meta.readgroup ? "-R \"@RG\\t" + meta.readgroup.findResults { rg -> rg.value?.trim() ? "${rg.key}:${rg.value}" : null }.join("\\t") + "\"" : "", ].join(" ").trim() } - } - - //// Queryname sort unmapped BAM before zipper (step 3b) - withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_UNMAPPED' { - ext.prefix = { "${meta.id}.fgumi.unmapped.queryname" } - ext.args = "-n" - } - - //// Queryname sort mapped stream before zipper (step 3c) - withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_MAPPED' { - cpus = 16 - memory = 64.GB - ext.prefix = { "${meta.id}.fgumi.snap.queryname" } - ext.args = "-n" - } - - //// FGUMI zipper between queryname-sorted streams (step 3d) - withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:FGUMI_ZIPPER' { - ext.prefix = { "${meta.id}.fgumi" } - } - - //// FGUMI template-coordinate sort after zipper (step 3e) - withName: '.*RAW_CRAM_SNAPZIPPER_FGUMI:FGUMI_TEMPLATE_SORT' { - ext.prefix = { "${meta.id}.fgumi.template" } - ext.args = { + ext.args4 = { [ "--order template-coordinate", "--max-memory ${task.memory.toGiga()}G", @@ -299,8 +276,6 @@ process { //// FGUMI group (step 4) withName: '.*FGUMI_GROUP' { - cpus = 8 - memory = 32.GB ext.prefix = { "${meta.id}.fgumi.group" } ext.args = { "--edits ${meta.fgumi_group_edits != null ? meta.fgumi_group_edits : 1}" } } @@ -317,23 +292,22 @@ process { } //// FGUMI consensus alignment (step 8) - withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_UNMAPPED' { - ext.prefix = { "${meta.id}.fgumi.unmapped.queryname" } - ext.args = "-n" - } - - withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:SAMTOOLS_QNAME_SORT_MAPPED' { - ext.prefix = { "${meta.id}.fgumi.snap.queryname" } - ext.args = "-n" - } - - withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:FGUMI_ZIPPER' { + withName: 'UMI_FGUMI_SNAPZIPSORT' { ext.prefix = { "${meta.id}.fgumi" } - } - - withName: '.*UMI_CRAM_SNAPZIPPER_FGUMI:FGUMI_TEMPLATE_SORT' { - ext.prefix = { "${meta.id}.fgumi.template" } - ext.args = { + ext.args2 = { + [ + "-b-", + "-sm 20", + meta.fgumi_snap_ignore_mismatched_pairs ? "-I" : "", + "-hc-", + "-S id", + "-sa", + "-xf 2", + "-o -sam -", + meta.readgroup ? "-R \"@RG\\t" + meta.readgroup.findResults { rg -> rg.value?.trim() ? "${rg.key}:${rg.value}" : null }.join("\\t") + "\"" : "", + ].join(" ").trim() + } + ext.args4 = { [ "--order coordinate", "--max-memory ${task.memory.toGiga()}G", @@ -341,7 +315,6 @@ process { } } - // QC //// Mosdepth withName: '.*BAM_QC:MOSDEPTH' { diff --git a/modules/local/fgumi/snapalign/main.nf b/modules/local/fgumi/snapalign/main.nf deleted file mode 100644 index dcca5a88..00000000 --- a/modules/local/fgumi/snapalign/main.nf +++ /dev/null @@ -1,45 +0,0 @@ -process FGUMI_SNAPALIGN { - 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/c5/c566f9e20f9eb4c5be9ff5a68e854f974caae916d67b4e03eb30eece186b73e8/data' - : 'community.wave.seqera.io/library/fgumi_samtools_snap-aligner:1708ad8bd6e764b6'}" - - input: - tuple val(meta), path(unmapped_bam), path(index, stageAs: "index/*"), path(fasta), path(dict) - - output: - tuple val(meta), path("${prefix}.snap.bam"), emit: mapped_bam - tuple val("${task.process}"), val('fgumi'), eval("fgumi --version | sed 's/^fgumi //;q'"), topic: versions, emit: versions_fgumi - - when: - task.ext.when == null || task.ext.when - - script: - def snap_args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}.fgumi" - - """ - # SNAP index directory is resolved from staged index content. - INDEX_FILE=\$(find -L ./ -name "OverflowTable*" -print -quit) - [ -z "\$INDEX_FILE" ] && echo "Snap index files not found" 1>&2 && exit 1 - INDEX=\$(dirname "\$INDEX_FILE") - - fgumi fastq --input ${unmapped_bam} \ - | snap-aligner paired \ - \$INDEX \ - -pairedInterleavedFastq - \ - -o ${prefix}.snap.bam \ - -t ${task.cpus} \ - ${snap_args} - """ - - stub: - prefix = task.ext.prefix ?: "${meta.id}.fgumi" - """ - touch ${prefix}.snap.bam - touch ${unmapped_bam} - """ -} \ No newline at end of file diff --git a/modules/local/fgumi/snapalign/environment.yml b/modules/local/fgumi/snapzipsort/environment.yml similarity index 78% rename from modules/local/fgumi/snapalign/environment.yml rename to modules/local/fgumi/snapzipsort/environment.yml index e3507c34..48483c1d 100644 --- a/modules/local/fgumi/snapalign/environment.yml +++ b/modules/local/fgumi/snapzipsort/environment.yml @@ -3,5 +3,4 @@ channels: - bioconda dependencies: - bioconda::fgumi=0.4.0 - - bioconda::samtools=1.23.1 - bioconda::snap-aligner=2.0.5 \ No newline at end of file diff --git a/modules/local/fgumi/snapzipsort/main.nf b/modules/local/fgumi/snapzipsort/main.nf new file mode 100644 index 00000000..343d613c --- /dev/null +++ b/modules/local/fgumi/snapzipsort/main.nf @@ -0,0 +1,59 @@ +process FGUMI_SNAPZIPSORT { + 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/05/057cc55ab35ff976996184621e292608f3f53e5fae66aeb36a6ec13659ad6beb/data' + : 'community.wave.seqera.io/library/fgumi_snap-aligner:fa44bec655a3a203'}" + + input: + tuple val(meta), path(unmapped_bam), path(index, stageAs: "index/*"), path(fasta), path(fai), path(dict) + + output: + tuple val(meta), path("${prefix}.bam"), emit: bam + tuple val("${task.process}"), val('fgumi'), eval("fgumi --version | sed 's/^fgumi //;q'"), topic: versions, emit: versions_fgumi + tuple val("${task.process}"), val('snap-aligner'), eval("snap-aligner 2>&1 | sed 's/^.*version //;s/.\$//;q'"), topic: versions, emit: versions_snapaligner + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def args3 = task.ext.args3 ?: '' + def args4 = task.ext.args4 ?: '' + prefix = task.ext.prefix ?: "${meta.id}.fgumi" + + """ + # SNAP index directory is resolved from staged index content. + INDEX_FILE=\$(find -L ./ -name "OverflowTable*" -print -quit) + [ -z "\$INDEX_FILE" ] && echo "Snap index files not found" 1>&2 && exit 1 + INDEX=\$(dirname "\$INDEX_FILE") + + fgumi fastq \\ + --input ${unmapped_bam} \\ + ${args} \\ + | snap-aligner paired \\ + \$INDEX \\ + -pairedInterleavedFastq - \\ + -t ${task.cpus} \\ + ${args2} \\ + | fgumi zipper \\ + --unmapped ${unmapped_bam} \\ + --reference ${fasta} \\ + --threads ${task.cpus} \\ + ${args3} \\ + | fgumi sort \\ + --input - \\ + --output ${prefix}.bam \\ + --threads ${task.cpus} \\ + ${args4} + """ + + stub: + prefix = task.ext.prefix ?: "${meta.id}.fgumi" + """ + touch ${prefix}.bam + """ +} \ No newline at end of file diff --git a/subworkflows/local/cram_snapzipper_fgumi/main.nf b/subworkflows/local/cram_snapzipper_fgumi/main.nf deleted file mode 100644 index 7d140304..00000000 --- a/subworkflows/local/cram_snapzipper_fgumi/main.nf +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env nextflow - -// MODULES -include { FGUMI_SNAPALIGN } from "../../../modules/local/fgumi/snapalign/main.nf" -include { FGUMI_ZIPPER } from "../../../modules/nf-core/fgumi/zipper/main.nf" -include { FGUMI_SORT as FGUMI_TEMPLATE_SORT } from "../../../modules/nf-core/fgumi/sort/main.nf" -include { SAMTOOLS_SORT as SAMTOOLS_QNAME_SORT_UNMAPPED } from "../../../modules/nf-core/samtools/sort/main.nf" -include { SAMTOOLS_SORT as SAMTOOLS_QNAME_SORT_MAPPED } from "../../../modules/nf-core/samtools/sort/main.nf" - -workflow CRAM_SNAPZIPPER_FGUMI { - take: - ch_meta_unmapped_index_fasta_dict_fai - - main: - FGUMI_SNAPALIGN( - ch_meta_unmapped_index_fasta_dict_fai - .map { meta, unmapped_bam, index, fasta, dict, _fai -> - [meta, unmapped_bam, index, fasta, dict] - } - ) - - // Queryname sort the unmapped BAM in parallel with mapped BAM sort. - SAMTOOLS_QNAME_SORT_UNMAPPED( - ch_meta_unmapped_index_fasta_dict_fai.map { meta, unmapped_bam, _index, fasta, _dict, fai -> [meta, unmapped_bam, fasta, fai] }, - '' - ) - - // Sort mapped alignments by queryname and emit SAM for zipper stdin. - SAMTOOLS_QNAME_SORT_MAPPED( - FGUMI_SNAPALIGN.out.mapped_bam - .join( - ch_meta_unmapped_index_fasta_dict_fai.map { meta, _unmapped_bam, _index, fasta, _dict, fai -> [meta, fasta, fai] }, - ), - '' - ) - - FGUMI_ZIPPER( - SAMTOOLS_QNAME_SORT_MAPPED.out.bam - .join(SAMTOOLS_QNAME_SORT_UNMAPPED.out.bam) - .join(ch_meta_unmapped_index_fasta_dict_fai) - .map { meta, mbam, ubam, _reads, _index, fasta, dict, fai -> [meta, mbam, ubam, fasta, fai, dict] }, - ) - - FGUMI_TEMPLATE_SORT(FGUMI_ZIPPER.out.bam) - - emit: - bam = FGUMI_TEMPLATE_SORT.out.bam - versions_fgumi = FGUMI_SNAPALIGN.out.versions_fgumi.mix(FGUMI_ZIPPER.out.versions_fgumi).mix(FGUMI_TEMPLATE_SORT.out.versions_fgumi) -} \ No newline at end of file diff --git a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf index 8949259d..0a14afea 100644 --- a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf +++ b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf @@ -5,8 +5,9 @@ include { FGUMI_EXTRACT } from "../../../modules/nf-core/fgumi/extract/ include { FGUMI_FILTER } from "../../../modules/nf-core/fgumi/filter/main.nf" include { FGUMI_GROUP } from "../../../modules/nf-core/fgumi/group/main.nf" include { FGUMI_SIMPLEX } from "../../../modules/nf-core/fgumi/simplex/main.nf" -include { CRAM_SNAPZIPPER_FGUMI as RAW_CRAM_SNAPZIPPER_FGUMI } from "../cram_snapzipper_fgumi/main.nf" -include { CRAM_SNAPZIPPER_FGUMI as UMI_CRAM_SNAPZIPPER_FGUMI } from "../cram_snapzipper_fgumi/main.nf" +include { FGUMI_SNAPZIPSORT as RAW_FGUMI_SNAPZIPSORT } from "../../../modules/local/fgumi/snapzipsort/main.nf" +include { FGUMI_SNAPZIPSORT as UMI_FGUMI_SNAPZIPSORT } from "../../../modules/local/fgumi/snapzipsort/main.nf" + // FUNCTIONS include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' @@ -24,7 +25,7 @@ workflow FASTQ_UMICONSENSUS_FGUMI { ) // Step 3: align with SNAP, zipper tags back, then template-coordinate sort. - RAW_CRAM_SNAPZIPPER_FGUMI( + RAW_FGUMI_SNAPZIPSORT( FGUMI_EXTRACT.out.bam .join(ch_meta_fastqs) .map { meta, ubams, _fastqs -> @@ -33,14 +34,14 @@ workflow FASTQ_UMICONSENSUS_FGUMI { ubams, getGenomeAttribute(meta.genome_data, 'snap'), getGenomeAttribute(meta.genome_data, 'fasta'), - getGenomeAttribute(meta.genome_data, 'dict'), - getGenomeAttribute(meta.genome_data, 'fai') + getGenomeAttribute(meta.genome_data, 'fai'), + getGenomeAttribute(meta.genome_data, 'dict') ] }, ) FGUMI_GROUP( - RAW_CRAM_SNAPZIPPER_FGUMI.out.bam, + RAW_FGUMI_SNAPZIPSORT.out.bam, 'adjacency' ) @@ -60,7 +61,7 @@ workflow FASTQ_UMICONSENSUS_FGUMI { false ) - UMI_CRAM_SNAPZIPPER_FGUMI( + UMI_FGUMI_SNAPZIPSORT( FGUMI_FILTER.out.bam .join(ch_meta_fastqs) .map { meta, filtered_bams, _fastqs -> @@ -69,14 +70,14 @@ workflow FASTQ_UMICONSENSUS_FGUMI { filtered_bams, getGenomeAttribute(meta.genome_data, 'snap'), getGenomeAttribute(meta.genome_data, 'fasta'), - getGenomeAttribute(meta.genome_data, 'dict'), - getGenomeAttribute(meta.genome_data, 'fai') + getGenomeAttribute(meta.genome_data, 'fai'), + getGenomeAttribute(meta.genome_data, 'dict') ] } ) emit: - cram = UMI_CRAM_SNAPZIPPER_FGUMI.out.bam + cram = UMI_FGUMI_SNAPZIPSORT.out.bam grouping_metrics = FGUMI_GROUP.out.metrics family_size_histogram = FGUMI_GROUP.out.histogram consensus_metrics = FGUMI_SIMPLEX.out.stats From ab4543a2424e0352120f9ee3c223608cd417d0a0 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 15:39:42 +0200 Subject: [PATCH 25/62] remove unused modules --- modules.json | 11 --- modules/nf-core/fgumi/sort/environment.yml | 7 -- modules/nf-core/fgumi/sort/main.nf | 45 --------- modules/nf-core/fgumi/sort/meta.yml | 82 ---------------- modules/nf-core/fgumi/sort/tests/main.nf.test | 89 ----------------- .../fgumi/sort/tests/main.nf.test.snap | 87 ----------------- .../nf-core/fgumi/sort/tests/nextflow.config | 5 - modules/nf-core/fgumi/zipper/environment.yml | 7 -- .../nf-core/fgumi/zipper/fgumi-zipper.diff | 21 ---- modules/nf-core/fgumi/zipper/main.nf | 43 --------- modules/nf-core/fgumi/zipper/meta.yml | 96 ------------------- .../nf-core/fgumi/zipper/tests/main.nf.test | 93 ------------------ .../fgumi/zipper/tests/main.nf.test.snap | 54 ----------- .../fgumi/zipper/tests/nextflow.config | 10 -- 14 files changed, 650 deletions(-) delete mode 100644 modules/nf-core/fgumi/sort/environment.yml delete mode 100644 modules/nf-core/fgumi/sort/main.nf delete mode 100644 modules/nf-core/fgumi/sort/meta.yml delete mode 100644 modules/nf-core/fgumi/sort/tests/main.nf.test delete mode 100644 modules/nf-core/fgumi/sort/tests/main.nf.test.snap delete mode 100644 modules/nf-core/fgumi/sort/tests/nextflow.config delete mode 100644 modules/nf-core/fgumi/zipper/environment.yml delete mode 100644 modules/nf-core/fgumi/zipper/fgumi-zipper.diff delete mode 100644 modules/nf-core/fgumi/zipper/main.nf delete mode 100644 modules/nf-core/fgumi/zipper/meta.yml delete mode 100644 modules/nf-core/fgumi/zipper/tests/main.nf.test delete mode 100644 modules/nf-core/fgumi/zipper/tests/main.nf.test.snap delete mode 100644 modules/nf-core/fgumi/zipper/tests/nextflow.config diff --git a/modules.json b/modules.json index 139acb63..f5895ff8 100644 --- a/modules.json +++ b/modules.json @@ -71,17 +71,6 @@ "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", "installed_by": ["modules"] }, - "fgumi/sort": { - "branch": "master", - "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", - "installed_by": ["modules"] - }, - "fgumi/zipper": { - "branch": "master", - "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", - "installed_by": ["modules"], - "patch": "modules/nf-core/fgumi/zipper/fgumi-zipper.diff" - }, "gnu/sort": { "branch": "master", "git_sha": "6d46786420b4d7bc88eba026eb389c0c5535d120", diff --git a/modules/nf-core/fgumi/sort/environment.yml b/modules/nf-core/fgumi/sort/environment.yml deleted file mode 100644 index 68aafa2b..00000000 --- a/modules/nf-core/fgumi/sort/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/sort/main.nf b/modules/nf-core/fgumi/sort/main.nf deleted file mode 100644 index a3262e5d..00000000 --- a/modules/nf-core/fgumi/sort/main.nf +++ /dev/null @@ -1,45 +0,0 @@ -process FGUMI_SORT { - tag "${meta.id}" - label 'process_medium' - - 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data' - : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" - - input: - tuple val(meta), path(bam) - - output: - tuple val(meta), path("*.bam"), emit: bam - tuple val(meta), path("*.{csi,bai}"), emit: index, optional: true - tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}_sorted" - - if ("${bam}" == "${prefix}.bam") { - error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") - } - - """ - fgumi sort \\ - --input ${bam} \\ - --output ${prefix}.bam \\ - --threads ${task.cpus} \\ - ${args} - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}_sorted" - if ("${bam}" == "${prefix}.bam") { - error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") - } - """ - touch ${prefix}.bam - """ -} diff --git a/modules/nf-core/fgumi/sort/meta.yml b/modules/nf-core/fgumi/sort/meta.yml deleted file mode 100644 index 1dc25228..00000000 --- a/modules/nf-core/fgumi/sort/meta.yml +++ /dev/null @@ -1,82 +0,0 @@ -name: "fgumi_sort" -description: | - Sorts a SAM or BAM file. Several sort orders are available, including coordinate, - queryname, and template-coordinate. This is a high-performance replacement for fgbio SortBam. -keywords: - - sort - - bam - - sam -tools: - - "fgumi": - description: "High-performance tools for working with UMI-tagged sequencing data." - homepage: "https://github.com/fulcrumgenomics/fgumi" - documentation: "https://docs.rs/fgumi" - tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" - licence: - - "MIT" - identifier: "" -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: | - The input SAM or BAM file to be sorted. - pattern: "*.{bam,sam}" - ontologies: - - edam: "http://edamontology.org/format_2572" -output: - bam: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.bam": - type: file - description: | - Sorted output BAM file. - pattern: "*.bam" - ontologies: - - edam: "http://edamontology.org/format_2572" - index: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - "*.{csi,bai}": - type: file - description: | - Index file if the bam file is coordinate sorted. - pattern: "*.{csi,bai}" - ontologies: - - edam: "http://edamontology.org/format_3327" - versions_fgumi: - - - ${task.process}: - type: string - description: The process the versions were collected from - - fgumi: - type: string - description: The tool name - - 'fgumi --version | sed "s/^fgumi //"': - 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 - - fgumi: - type: string - description: The tool name - - 'fgumi --version | sed "s/^fgumi //"': - type: eval - description: The expression to obtain the version of the tool -authors: - - "@sppearce" -maintainers: - - "@sppearce" diff --git a/modules/nf-core/fgumi/sort/tests/main.nf.test b/modules/nf-core/fgumi/sort/tests/main.nf.test deleted file mode 100644 index fc549bf5..00000000 --- a/modules/nf-core/fgumi/sort/tests/main.nf.test +++ /dev/null @@ -1,89 +0,0 @@ -nextflow_process { - - name "Test Process FGUMI_SORT" - script "../main.nf" - process "FGUMI_SORT" - - tag "modules" - tag "modules_nfcore" - tag "fgumi" - tag "fgumi/sort" - - test("sarscov2 - bam") { - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assert process.success - assertAll( - { assert snapshot( - bam(process.out.bam.get(0).get(1)).getReadsMD5(), - process.out.findAll { key, val -> key.startsWith('versions') } - ).match() } - ) - } - - } - - test("sarscov2 - bam - template-coordinate") { - - when { - params { - module_args = '--order template-coordinate' - } - process { - """ - input[0] = [ - [ id:'test' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assert process.success - assertAll( - { assert snapshot( - bam(process.out.bam.get(0).get(1)).getReadsMD5(), - process.out.findAll { key, val -> key.startsWith('versions') } - ).match() } - ) - } - - } - - test("sarscov2 - bam - stub") { - - options "-stub" - - when { - process { - """ - input[0] = [ - [ id:'test' ], - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), - ] - """ - } - } - - then { - assert process.success - assertAll( - { assert snapshot(process.out).match() } - ) - } - - } - -} diff --git a/modules/nf-core/fgumi/sort/tests/main.nf.test.snap b/modules/nf-core/fgumi/sort/tests/main.nf.test.snap deleted file mode 100644 index ad6dfc3b..00000000 --- a/modules/nf-core/fgumi/sort/tests/main.nf.test.snap +++ /dev/null @@ -1,87 +0,0 @@ -{ - "sarscov2 - bam - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test" - }, - "test_sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - - ], - "2": [ - [ - "FGUMI_SORT", - "fgumi", - "0.4.0" - ] - ], - "bam": [ - [ - { - "id": "test" - }, - "test_sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "index": [ - - ], - "versions_fgumi": [ - [ - "FGUMI_SORT", - "fgumi", - "0.4.0" - ] - ] - } - ], - "timestamp": "2026-06-26T13:03:56.414869", - "meta": { - "nf-test": "0.9.5", - "nextflow": "25.10.4" - } - }, - "sarscov2 - bam": { - "content": [ - "461d8083b03a321eb1902ad544fd7d2f", - { - "versions_fgumi": [ - [ - "FGUMI_SORT", - "fgumi", - "0.4.0" - ] - ] - } - ], - "timestamp": "2026-06-26T13:03:43.67993", - "meta": { - "nf-test": "0.9.5", - "nextflow": "25.10.4" - } - }, - "sarscov2 - bam - template-coordinate": { - "content": [ - "461d8083b03a321eb1902ad544fd7d2f", - { - "versions_fgumi": [ - [ - "FGUMI_SORT", - "fgumi", - "0.4.0" - ] - ] - } - ], - "timestamp": "2026-06-26T13:03:47.645547", - "meta": { - "nf-test": "0.9.5", - "nextflow": "25.10.4" - } - } -} \ No newline at end of file diff --git a/modules/nf-core/fgumi/sort/tests/nextflow.config b/modules/nf-core/fgumi/sort/tests/nextflow.config deleted file mode 100644 index 4ad67e9b..00000000 --- a/modules/nf-core/fgumi/sort/tests/nextflow.config +++ /dev/null @@ -1,5 +0,0 @@ -process { - withName: FGUMI_SORT { - ext.args = { params.module_args } - } -} diff --git a/modules/nf-core/fgumi/zipper/environment.yml b/modules/nf-core/fgumi/zipper/environment.yml deleted file mode 100644 index 68aafa2b..00000000 --- a/modules/nf-core/fgumi/zipper/environment.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json -channels: - - conda-forge - - bioconda -dependencies: - - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/zipper/fgumi-zipper.diff b/modules/nf-core/fgumi/zipper/fgumi-zipper.diff deleted file mode 100644 index c1e6a2e4..00000000 --- a/modules/nf-core/fgumi/zipper/fgumi-zipper.diff +++ /dev/null @@ -1,21 +0,0 @@ -Changes in component 'nf-core/fgumi/zipper' -'modules/nf-core/fgumi/zipper/environment.yml' is unchanged -Changes in 'fgumi/zipper/main.nf': ---- modules/nf-core/fgumi/zipper/main.nf -+++ modules/nf-core/fgumi/zipper/main.nf -@@ -8,8 +8,7 @@ - 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b' }" - - input: -- tuple val(meta), path(bam), path(unmapped) -- tuple val(meta2), path(fasta), path(fai), path(dict) -+ tuple val(meta), path(bam), path(unmapped), path(fasta), path(fai), path(dict) - - output: - tuple val(meta), path("*.bam"), emit: bam - -'modules/nf-core/fgumi/zipper/meta.yml' is unchanged -'modules/nf-core/fgumi/zipper/tests/main.nf.test' is unchanged -'modules/nf-core/fgumi/zipper/tests/main.nf.test.snap' is unchanged -'modules/nf-core/fgumi/zipper/tests/nextflow.config' is unchanged -************************************************************ diff --git a/modules/nf-core/fgumi/zipper/main.nf b/modules/nf-core/fgumi/zipper/main.nf deleted file mode 100644 index e54c07ef..00000000 --- a/modules/nf-core/fgumi/zipper/main.nf +++ /dev/null @@ -1,43 +0,0 @@ -process FGUMI_ZIPPER { - tag "$meta.id" - label 'process_medium' - - 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data': - 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b' }" - - input: - tuple val(meta), path(bam), path(unmapped), path(fasta), path(fai), path(dict) - - output: - tuple val(meta), path("*.bam"), emit: bam - tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}_zipped" - if ("${bam}" == "${prefix}.bam" || "${unmapped}" == "${prefix}.bam") { - error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") - } - """ - fgumi \\ - zipper \\ - --input ${bam} \\ - --unmapped ${unmapped} \\ - --reference ${fasta} \\ - --output ${prefix}.bam \\ - --threads ${task.cpus} \\ - ${args} - """ - - stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}_zipped" - """ - touch ${prefix}.bam - """ -} diff --git a/modules/nf-core/fgumi/zipper/meta.yml b/modules/nf-core/fgumi/zipper/meta.yml deleted file mode 100644 index 682d62b2..00000000 --- a/modules/nf-core/fgumi/zipper/meta.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: "fgumi_zipper" -description: Zip an unmapped UMI BAM together with its aligned BAM using fgumi -keywords: - - UMIs - - zipper - - bam - - alignment - - merge -tools: - - "fgumi": - description: "High-performance tools for UMI-tagged sequencing data." - homepage: "https://github.com/fulcrumgenomics/fgumi" - documentation: "https://fgumi.readthedocs.io/" - tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" - licence: - - "MIT" - identifier: biotools:fgumi -input: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - bam: - type: file - description: Aligned (mapped) BAM, in the same queryname order as the - unmapped BAM - pattern: "*.bam" - ontologies: - - edam: "http://edamontology.org/format_2572" - - unmapped: - type: file - description: Unmapped UMI BAM (e.g. from fgumi extract), queryname order - pattern: "*.bam" - ontologies: - - edam: "http://edamontology.org/format_2572" - - - meta2: - type: map - description: | - Groovy Map containing reference information - e.g. `[ id:'genome' ]` - - fasta: - type: file - description: Reference genome FASTA file - pattern: "*.{fa,fasta,fna}" - ontologies: - - edam: "http://edamontology.org/data_2044" - - edam: "http://edamontology.org/format_1929" - - fai: - type: file - description: Reference genome FASTA index (.fai) - pattern: "*.fai" - ontologies: [] - - dict: - type: file - description: Reference sequence dictionary (.dict) - pattern: "*.dict" - ontologies: [] -output: - bam: - - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. `[ id:'sample1' ]` - - "*.bam": - type: file - description: Zipped BAM with UMI tags transferred onto the aligned reads - pattern: "*.bam" - ontologies: - - edam: "http://edamontology.org/format_2572" - versions_fgumi: - - - ${task.process}: - type: string - description: The name of the process - - fgumi: - type: string - description: The name of the tool - - fgumi --version | sed "s/^fgumi //": - type: eval - description: The expression to obtain the version of the tool -topics: - versions: - - - ${task.process}: - type: string - description: The name of the process - - fgumi: - type: string - description: The name of the tool - - fgumi --version | sed "s/^fgumi //": - type: eval - description: The expression to obtain the version of the tool -authors: - - "@nh13" -maintainers: - - "@nh13" diff --git a/modules/nf-core/fgumi/zipper/tests/main.nf.test b/modules/nf-core/fgumi/zipper/tests/main.nf.test deleted file mode 100644 index 44dd2a62..00000000 --- a/modules/nf-core/fgumi/zipper/tests/main.nf.test +++ /dev/null @@ -1,93 +0,0 @@ -nextflow_process { - - name "Test Process FGUMI_ZIPPER" - script "../main.nf" - process "FGUMI_ZIPPER" - config "./nextflow.config" - - tag "modules" - tag "modules_nfcore" - tag "fgumi" - tag "fgumi/zipper" - tag "fgumi/sort" - - setup { - run("FGUMI_SORT") { - script "../../sort/main.nf" - config "./nextflow.config" - process { - """ - input[0] = [ - [ id:'test' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ] - """ - } - } - run("FGUMI_SORT", alias: "FGUMI_SORT_UNMAPPED") { - script "../../sort/main.nf" - config "./nextflow.config" - process { - """ - input[0] = [ - [ id:'test' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ] - """ - } - } - } - - test("homo_sapiens - mapped + unmapped") { - - when { - process { - """ - input[0] = FGUMI_SORT.out.bam.join(FGUMI_SORT_UNMAPPED.out.bam) - input[1] = [ - [ id:'genome' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.dict', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["bam"])).match() } - ) - } - - } - - test("homo_sapiens - mapped + unmapped - stub") { - - options "-stub" - - when { - process { - """ - input[0] = FGUMI_SORT.out.bam.join(FGUMI_SORT_UNMAPPED.out.bam) - input[1] = [ - [ id:'genome' ], - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.dict', checkIfExists: true) - ] - """ - } - } - - then { - assertAll( - { assert process.success }, - { assert snapshot(sanitizeOutput(process.out)).match() } - ) - } - - } - -} diff --git a/modules/nf-core/fgumi/zipper/tests/main.nf.test.snap b/modules/nf-core/fgumi/zipper/tests/main.nf.test.snap deleted file mode 100644 index e2d68def..00000000 --- a/modules/nf-core/fgumi/zipper/tests/main.nf.test.snap +++ /dev/null @@ -1,54 +0,0 @@ -{ - "homo_sapiens - mapped + unmapped - stub": { - "content": [ - { - "bam": [ - [ - { - "id": "test" - }, - "test_zipped.bam:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "versions_fgumi": [ - [ - "FGUMI_ZIPPER", - "fgumi", - "0.4.0" - ] - ] - } - ], - "timestamp": "2026-06-29T13:35:32.697555", - "meta": { - "nf-test": "0.9.5", - "nextflow": "25.10.4" - } - }, - "homo_sapiens - mapped + unmapped": { - "content": [ - { - "bam": [ - [ - { - "id": "test" - }, - "test_zipped.bam" - ] - ], - "versions_fgumi": [ - [ - "FGUMI_ZIPPER", - "fgumi", - "0.4.0" - ] - ] - } - ], - "timestamp": "2026-06-29T13:35:23.745077", - "meta": { - "nf-test": "0.9.5", - "nextflow": "25.10.4" - } - } -} \ No newline at end of file diff --git a/modules/nf-core/fgumi/zipper/tests/nextflow.config b/modules/nf-core/fgumi/zipper/tests/nextflow.config deleted file mode 100644 index b72e20cf..00000000 --- a/modules/nf-core/fgumi/zipper/tests/nextflow.config +++ /dev/null @@ -1,10 +0,0 @@ -process { - withName: 'FGUMI_SORT' { - ext.args = '--order queryname' - ext.prefix = 'test_mapped' - } - withName: 'FGUMI_SORT_UNMAPPED' { - ext.args = '--order queryname' - ext.prefix = 'test_unmapped' - } -} From 43db36fb9682dfd3928a1b234c3577f6b53a4f3a Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 15:41:53 +0200 Subject: [PATCH 26/62] move snap output arg to process --- conf/modules.config | 2 -- modules/local/fgumi/snapzipsort/main.nf | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 6dec67f4..ea252702 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -262,7 +262,6 @@ process { "-S id", "-sa", "-xf 2", - "-o -sam -", meta.readgroup ? "-R \"@RG\\t" + meta.readgroup.findResults { rg -> rg.value?.trim() ? "${rg.key}:${rg.value}" : null }.join("\\t") + "\"" : "", ].join(" ").trim() } @@ -303,7 +302,6 @@ process { "-S id", "-sa", "-xf 2", - "-o -sam -", meta.readgroup ? "-R \"@RG\\t" + meta.readgroup.findResults { rg -> rg.value?.trim() ? "${rg.key}:${rg.value}" : null }.join("\\t") + "\"" : "", ].join(" ").trim() } diff --git a/modules/local/fgumi/snapzipsort/main.nf b/modules/local/fgumi/snapzipsort/main.nf index 343d613c..99fe4234 100644 --- a/modules/local/fgumi/snapzipsort/main.nf +++ b/modules/local/fgumi/snapzipsort/main.nf @@ -38,6 +38,7 @@ process FGUMI_SNAPZIPSORT { \$INDEX \\ -pairedInterleavedFastq - \\ -t ${task.cpus} \\ + -o -sam - \\ ${args2} \\ | fgumi zipper \\ --unmapped ${unmapped_bam} \\ From ddcd680be9183e832209ac42f9f1bc6f9815f1c1 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 16:18:28 +0200 Subject: [PATCH 27/62] add test for fgumi/snapzipsort --- modules/local/fgumi/snapzipsort/main.nf | 4 +- nf-test.config | 2 +- .../local/fgumi/snapzipsort/main.nf.test | 60 ++++++++++++++++ .../local/fgumi/snapzipsort/main.nf.test.snap | 70 +++++++++++++++++++ 4 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 tests/modules/local/fgumi/snapzipsort/main.nf.test create mode 100644 tests/modules/local/fgumi/snapzipsort/main.nf.test.snap diff --git a/modules/local/fgumi/snapzipsort/main.nf b/modules/local/fgumi/snapzipsort/main.nf index 99fe4234..d1bbed82 100644 --- a/modules/local/fgumi/snapzipsort/main.nf +++ b/modules/local/fgumi/snapzipsort/main.nf @@ -12,8 +12,8 @@ process FGUMI_SNAPZIPSORT { output: tuple val(meta), path("${prefix}.bam"), emit: bam - tuple val("${task.process}"), val('fgumi'), eval("fgumi --version | sed 's/^fgumi //;q'"), topic: versions, emit: versions_fgumi - tuple val("${task.process}"), val('snap-aligner'), eval("snap-aligner 2>&1 | sed 's/^.*version //;s/.\$//;q'"), topic: versions, emit: versions_snapaligner + tuple val("${task.process}"), val('fgumi'), eval("fgumi --version | sed 's/^fgumi //;q'"), topic: versions + tuple val("${task.process}"), val('snap-aligner'), eval("snap-aligner 2>&1 | sed 's/^.*version //;s/.\$//;q'"), topic: versions when: task.ext.when == null || task.ext.when diff --git a/nf-test.config b/nf-test.config index bda04274..c5d343b4 100644 --- a/nf-test.config +++ b/nf-test.config @@ -12,7 +12,7 @@ config { ignore = ['modules/nf-core/**/tests/*', 'subworkflows/nf-core/**/tests/*'] // run all test with defined profile(s) from the main nextflow.config - profile = "test,s3_ugent" + profile = "test" // list of filenames or patterns that should be trigger a full test run triggers = ['nextflow.config', 'nf-test.config', 'conf/test.config', 'tests/nextflow.config', 'tests/.nftignore'] diff --git a/tests/modules/local/fgumi/snapzipsort/main.nf.test b/tests/modules/local/fgumi/snapzipsort/main.nf.test new file mode 100644 index 00000000..5c2c404b --- /dev/null +++ b/tests/modules/local/fgumi/snapzipsort/main.nf.test @@ -0,0 +1,60 @@ +nextflow_process { + + name "Test Process FGUMI_SNAPZIPSORT" + script "modules/local/fgumi/snapzipsort/main.nf" + process "FGUMI_SNAPZIPSORT" + + tag "modules" + tag "modules/local" + tag "modules/local/fgumi/snapzipsort" + + topics "versions" + + test("homo sapiens - test") { + + when { + process { + """ + input[0] = [ + [id: "test", single_end: false ], + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/bams/umi.unmapped.bam", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/snap/", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", checkIfExists:true) + ] + """ + } + } + then { + assert process.success + assert snapshot(sanitizeOutput(process.out), topics).match() + } + + } + + test("homo sapiens - test - stub") { + options "-stub" + + when { + process { + """ + input[0] = [ + [id: "test", single_end: false ], + file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/bams/umi.unmapped.bam", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/snap/", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists:true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", checkIfExists:true) + ] + """ + } + } + then { + assert process.success + assert snapshot(sanitizeOutput(process.out), topics).match() + } + + } + +} diff --git a/tests/modules/local/fgumi/snapzipsort/main.nf.test.snap b/tests/modules/local/fgumi/snapzipsort/main.nf.test.snap new file mode 100644 index 00000000..44f4d134 --- /dev/null +++ b/tests/modules/local/fgumi/snapzipsort/main.nf.test.snap @@ -0,0 +1,70 @@ +{ + "homo sapiens - test": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fgumi.bam:md5,42aeef21615cf8f3a8908abb6229595c" + ] + ] + }, + { + "versions": [ + [ + "FGUMI_SNAPZIPSORT", + "fgumi", + "0.4.0" + ], + [ + "FGUMI_SNAPZIPSORT", + "snap-aligner", + "2.0.5" + ] + ] + } + ], + "timestamp": "2026-07-02T16:15:25.079107282", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "homo sapiens - test - stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test", + "single_end": false + }, + "test.fgumi.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ] + }, + { + "versions": [ + [ + "FGUMI_SNAPZIPSORT", + "fgumi", + "0.4.0" + ], + [ + "FGUMI_SNAPZIPSORT", + "snap-aligner", + "2.0.5" + ] + ] + } + ], + "timestamp": "2026-07-02T16:17:04.152576656", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + } +} \ No newline at end of file From 50379ed548d36809f7ba480a4a524fd0fb2ce719 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 16:54:18 +0200 Subject: [PATCH 28/62] add umiconsensus test --- conf/modules.config | 3 +- .../fastq_umiconsensus_fgumi/main.nf.test | 52 ++++++++ .../main.nf.test.snap | 113 ++++++++++++++++++ tests/workflows/preprocessing.nf.test.snap | 9 +- 4 files changed, 172 insertions(+), 5 deletions(-) create mode 100644 tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test create mode 100644 tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap diff --git a/conf/modules.config b/conf/modules.config index ea252702..5b304d28 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -244,8 +244,7 @@ process { meta.readgroup?.PI ? "--predicted-insert-size ${meta.readgroup.PI}" : "", meta.readgroup?.DS ? "--description \"${meta.readgroup.DS}\"" : "", meta.readgroup?.DT ? "--run-date \"${meta.readgroup.DT}\"" : "", - "--read-structures ${meta.fgumi_read_structures ?: '+T +T'}", - ((meta.fgumi_extract_umis_from_read_names != null ? meta.fgumi_extract_umis_from_read_names : true) ? "--extract-umis-from-read-names" : ""), + "--extract-umis-from-read-names" ].join(" ").trim() } } diff --git a/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test b/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test new file mode 100644 index 00000000..b1b4d573 --- /dev/null +++ b/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test @@ -0,0 +1,52 @@ +nextflow_workflow { + + name "Test Workflow FASTQ_UMICONSENSUS_FGUMI" + script "subworkflows/local/fastq_umiconsensus_fgumi/main.nf" + workflow "FASTQ_UMICONSENSUS_FGUMI" + + tag "subworkflows" + tag "subworkflows/local" + tag "subworkflows/local/fastq_umiconsensus_fgumi" + + test("umi consensus test") { + when { + workflow { + """ + // [meta, [fq_1,fq_2]] + input[0] = channel.of([ + [ + id:'test', + samplename:'test', + single_end:false, + sample_type:'DNA', + markdup: "bamsormadup", + fgumi_simplex_min_reads: 1, + fgumi_snap_ignore_mismatched_pairs: false, + genome_data: [ + snap: "s3://test-data/genomics/homo_sapiens/genome/snap/", + fasta: "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + fai: "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + dict: "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + ] + ], // meta map + [ + file("https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R1_001.fastq.gz", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R2_001.fastq.gz", checkIfExists: true) + ] + ]) + """ + } + } + + then { + assertAll( + { + assert workflow.success + assert snapshot( + sanitizeOutput(workflow.out) + ).match() + } + ) + } + } +} diff --git a/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap b/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap new file mode 100644 index 00000000..7df5795e --- /dev/null +++ b/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap @@ -0,0 +1,113 @@ +{ + "umi consensus test": { + "content": [ + { + "consensus_metrics": [ + [ + { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } + }, + "test.fgumi.simplex.stats.txt:md5,c259ad6db7c02de9e0f1b9f95a3d6ab0" + ] + ], + "cram": [ + [ + { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } + }, + "test.fgumi.bam:md5,fdad08ae32095f2fd8a3f9d5f7d697d1" + ] + ], + "family_size_histogram": [ + [ + { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } + }, + "test.fgumi.group.family_size_histogram.txt:md5,57742826c7e781f773840f1c977f5f0b" + ] + ], + "filtering_metrics": [ + [ + { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } + }, + "test.fgumi.filter.stats.txt:md5,01b1b32c9151552a623eef933b8d1f96" + ] + ], + "grouping_metrics": [ + [ + { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } + }, + "test.fgumi.group.grouping_metrics.txt:md5,deb6be58b11022b67145fe4e2c7ca299" + ] + ] + } + ], + "timestamp": "2026-07-02T16:50:47.876765096", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + } +} \ No newline at end of file diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index 7b46d025..9dbea4b3 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -886,6 +886,9 @@ "aligner": "bwamem", "markdup": "bamsormadup", "umi_aware": false, + "fgumi_aware": false, + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": true, "skip_trimming": false, "trim_front": 0, "trim_tail": 0, @@ -908,7 +911,7 @@ ] } ], - "timestamp": "2026-06-30T13:45:04.959946", + "timestamp": "2026-07-02T16:26:40.081547434", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -2143,7 +2146,7 @@ "id": "sample1" } }, - "sample1.hybcap-metrics.txt:md5,0e5cf0bfd2f1142f56462ec7cf4c990c" + "sample1.hybcap-metrics.txt:md5,7cae4a6cf3b7b4bf0958553c1c89ed62" ] ], "riker_hybcap_per_base": [ @@ -2461,7 +2464,7 @@ ] } ], - "timestamp": "2026-06-30T14:23:56.444223", + "timestamp": "2026-07-02T16:21:35.586757084", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" From 2967251c4efaf80578f9bda895e2d4dd99a28c16 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 16:56:46 +0200 Subject: [PATCH 29/62] fix linting --- conf/test.config | 2 +- modules.json | 3 ++- .../local/fgumi/snapzipsort/environment.yml | 2 +- modules/local/fgumi/snapzipsort/main.nf | 2 +- .../nf-core/fgumi/simplex/fgumi-simplex.diff | 21 +++++++++++++++++++ .../local/fastq_umiconsensus_fgumi/main.nf | 6 +++--- tests/inputs/test.yml | 2 +- 7 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 modules/nf-core/fgumi/simplex/fgumi-simplex.diff diff --git a/conf/test.config b/conf/test.config index 26275a2c..632e9126 100644 --- a/conf/test.config +++ b/conf/test.config @@ -34,4 +34,4 @@ aws { endpoint = 'https://s3.ugent.be' s3PathStyleAccess = true } -} \ No newline at end of file +} diff --git a/modules.json b/modules.json index f5895ff8..1ca0a2e1 100644 --- a/modules.json +++ b/modules.json @@ -69,7 +69,8 @@ "fgumi/simplex": { "branch": "master", "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/fgumi/simplex/fgumi-simplex.diff" }, "gnu/sort": { "branch": "master", diff --git a/modules/local/fgumi/snapzipsort/environment.yml b/modules/local/fgumi/snapzipsort/environment.yml index 48483c1d..a5682d01 100644 --- a/modules/local/fgumi/snapzipsort/environment.yml +++ b/modules/local/fgumi/snapzipsort/environment.yml @@ -3,4 +3,4 @@ channels: - bioconda dependencies: - bioconda::fgumi=0.4.0 - - bioconda::snap-aligner=2.0.5 \ No newline at end of file + - bioconda::snap-aligner=2.0.5 diff --git a/modules/local/fgumi/snapzipsort/main.nf b/modules/local/fgumi/snapzipsort/main.nf index d1bbed82..17f9b9e3 100644 --- a/modules/local/fgumi/snapzipsort/main.nf +++ b/modules/local/fgumi/snapzipsort/main.nf @@ -57,4 +57,4 @@ process FGUMI_SNAPZIPSORT { """ touch ${prefix}.bam """ -} \ No newline at end of file +} diff --git a/modules/nf-core/fgumi/simplex/fgumi-simplex.diff b/modules/nf-core/fgumi/simplex/fgumi-simplex.diff new file mode 100644 index 00000000..c81d7c67 --- /dev/null +++ b/modules/nf-core/fgumi/simplex/fgumi-simplex.diff @@ -0,0 +1,21 @@ +Changes in component 'nf-core/fgumi/simplex' +'modules/nf-core/fgumi/simplex/meta.yml' is unchanged +'modules/nf-core/fgumi/simplex/environment.yml' is unchanged +Changes in 'fgumi/simplex/main.nf': +--- modules/nf-core/fgumi/simplex/main.nf ++++ modules/nf-core/fgumi/simplex/main.nf +@@ -8,8 +8,7 @@ + : 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b'}" + + input: +- tuple val(meta), path(grouped_bam) +- val min_reads ++ tuple val(meta), path(grouped_bam), val(min_reads) + val keep_rejected + + output: + +'modules/nf-core/fgumi/simplex/tests/main.nf.test' is unchanged +'modules/nf-core/fgumi/simplex/tests/nextflow.config' is unchanged +'modules/nf-core/fgumi/simplex/tests/main.nf.test.snap' is unchanged +************************************************************ diff --git a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf index 0a14afea..cba74ade 100644 --- a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf +++ b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf @@ -54,7 +54,7 @@ workflow FASTQ_UMICONSENSUS_FGUMI { FGUMI_FILTER( FGUMI_SIMPLEX.out.bam .join(ch_meta_fastqs) - .map { meta, simplex_bams, _fastqs -> + .map { meta, simplex_bams, _fastqs -> [meta, simplex_bams, getGenomeAttribute(meta.genome_data, 'fasta')] }, '1,1,1', @@ -64,7 +64,7 @@ workflow FASTQ_UMICONSENSUS_FGUMI { UMI_FGUMI_SNAPZIPSORT( FGUMI_FILTER.out.bam .join(ch_meta_fastqs) - .map { meta, filtered_bams, _fastqs -> + .map { meta, filtered_bams, _fastqs -> [ meta, filtered_bams, @@ -82,4 +82,4 @@ workflow FASTQ_UMICONSENSUS_FGUMI { family_size_histogram = FGUMI_GROUP.out.histogram consensus_metrics = FGUMI_SIMPLEX.out.stats filtering_metrics = FGUMI_FILTER.out.stats -} \ No newline at end of file +} diff --git a/tests/inputs/test.yml b/tests/inputs/test.yml index 332a4a71..e71e7282 100644 --- a/tests/inputs/test.yml +++ b/tests/inputs/test.yml @@ -60,4 +60,4 @@ fgumi_aware: true run_coverage: true fastq_1: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R1_001.fastq.gz - fastq_2: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R2_001.fastq.gz \ No newline at end of file + fastq_2: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R2_001.fastq.gz From 7d96671ed7b657c3b00d984ea21447dc9aab123d Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Thu, 2 Jul 2026 17:56:43 +0200 Subject: [PATCH 30/62] fix md5sum --- tests/workflows/preprocessing.nf.test.snap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index 9dbea4b3..d0251381 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -2146,7 +2146,7 @@ "id": "sample1" } }, - "sample1.hybcap-metrics.txt:md5,7cae4a6cf3b7b4bf0958553c1c89ed62" + "sample1.hybcap-metrics.txt:md5,0e5cf0bfd2f1142f56462ec7cf4c990c" ] ], "riker_hybcap_per_base": [ @@ -2464,7 +2464,7 @@ ] } ], - "timestamp": "2026-07-02T16:21:35.586757084", + "timestamp": "2026-07-02T17:01:29.294260704", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" From 8ebcd1f8f1065b63273309a260663efbc345bb28 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Fri, 3 Jul 2026 10:55:20 +0200 Subject: [PATCH 31/62] add umi to multiqc + add umi test to fastq_to_aligned_cram --- .../local/fastq_to_aligned_cram/main.nf | 11 +- .../local/fastq_to_aligned_cram/main.nf.test | 48 ++++++++ .../fastq_to_aligned_cram/main.nf.test.snap | 112 +++++++++++++++--- workflows/preprocessing.nf | 5 +- 4 files changed, 156 insertions(+), 20 deletions(-) diff --git a/subworkflows/local/fastq_to_aligned_cram/main.nf b/subworkflows/local/fastq_to_aligned_cram/main.nf index f6a7c33a..d9f1c5eb 100644 --- a/subworkflows/local/fastq_to_aligned_cram/main.nf +++ b/subworkflows/local/fastq_to_aligned_cram/main.nf @@ -155,9 +155,10 @@ workflow FASTQ_TO_CRAM { ch_cram_crai.dump(tag: "FASTQ_TO_CRAM: cram and crai", pretty: true) emit: - cram_crai = ch_cram_crai - rna_splice_junctions = FASTQ_ALIGN_RNA.out.splice_junctions - rna_junctions = FASTQ_ALIGN_RNA.out.junctions - sormadup_metrics = ch_sormadup_metrics - align_reports = FASTQ_ALIGN_DNA.out.reports + cram_crai = ch_cram_crai + rna_splice_junctions = FASTQ_ALIGN_RNA.out.splice_junctions + rna_junctions = FASTQ_ALIGN_RNA.out.junctions + sormadup_metrics = ch_sormadup_metrics + align_reports = FASTQ_ALIGN_DNA.out.reports + family_size_histogram = FASTQ_UMICONSENSUS_FGUMI.out.family_size_histogram } diff --git a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test index f3082fc3..3394ea12 100644 --- a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test +++ b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test @@ -181,6 +181,54 @@ nextflow_workflow { } } + test("fastq to cram - umi") { + when { + workflow { + """ + // [meta, [fq_1,fq_2], aligner, index, fasta] + input[0] = Channel.of([ + [ + id: "test", + samplename: "test", + single_end: false, + sample_type: "DNA", + markdup: "false", + fgumi_aware: true, + fgumi_simplex_min_reads: 1, + fgumi_snap_ignore_mismatched_pairs: false, + genome_data: [ + snap: "s3://test-data/genomics/homo_sapiens/genome/snap/", + fasta: "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + fai: "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + dict: "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + ] + ], // meta map + [ + file("https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R1_001.fastq.gz", checkIfExists: true), + file("https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R2_001.fastq.gz", checkIfExists: true) + ], + "snap", // aligner + file("s3://test-data/genomics/homo_sapiens/genome/snap/", checkIfExists: true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna"), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai"), + [] + ]) + """ + } + } + + then { + assertAll( + { + assert workflow.success + assert snapshot( + sanitizeOutput(workflow.out, unstableKeys:["cram_crai"]) + ).match() + } + ) + } + } + test("fastq to cram - stub") { options: "-stub" when { diff --git a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap index a4452c59..9501156a 100644 --- a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap +++ b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap @@ -24,6 +24,9 @@ "test.merged.cram", "test.merged.cram.crai" ] + ], + "family_size_histogram": [ + ], "rna_junctions": [ @@ -36,10 +39,10 @@ ] } ], - "timestamp": "2026-02-11T20:19:51.825749", + "timestamp": "2026-07-03T10:49:36.809748622", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" + "nf-test": "0.9.5", + "nextflow": "26.04.4" } }, "fastq to cram - bwa - bamsormadup": { @@ -67,6 +70,9 @@ "test.cram", "test.cram.crai" ] + ], + "family_size_histogram": [ + ], "rna_junctions": [ @@ -95,10 +101,10 @@ ] } ], - "timestamp": "2026-02-11T20:10:31.616836", + "timestamp": "2026-07-03T10:46:02.767572226", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" + "nf-test": "0.9.5", + "nextflow": "26.04.4" } }, "fastq to cram - bwa - samtools sormadup": { @@ -126,6 +132,9 @@ "test.merged.cram", "test.merged.cram.crai" ] + ], + "family_size_histogram": [ + ], "rna_junctions": [ @@ -154,10 +163,10 @@ ] } ], - "timestamp": "2026-02-11T20:15:15.495706", + "timestamp": "2026-07-03T10:48:25.249088385", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" + "nf-test": "0.9.5", + "nextflow": "26.04.4" } }, "fastq to cram - star - bamsormadup": { @@ -186,6 +195,9 @@ "test.cram", "test.cram.crai" ] + ], + "family_size_histogram": [ + ], "rna_junctions": [ [ @@ -249,10 +261,10 @@ ] } ], - "timestamp": "2026-05-14T08:18:36.857986", + "timestamp": "2026-07-03T10:47:44.53060843", "meta": { "nf-test": "0.9.5", - "nextflow": "26.04.1" + "nextflow": "26.04.4" } }, "fastq to cram - bwa - samtools sort": { @@ -281,6 +293,78 @@ "test.merged.cram.crai" ] ], + "family_size_histogram": [ + + ], + "rna_junctions": [ + + ], + "rna_splice_junctions": [ + + ], + "sormadup_metrics": [ + + ] + } + ], + "timestamp": "2026-07-03T10:48:56.909948371", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "fastq to cram - umi": { + "content": [ + { + "align_reports": [ + + ], + "cram_crai": [ + [ + { + "groupSize": 1, + "groupTarget": { + "fgumi_aware": true, + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/" + }, + "id": "test", + "markdup": "false", + "sample_type": "DNA", + "samplename": "test", + "single_end": false + } + }, + "test.merged.cram", + "test.merged.cram.crai" + ] + ], + "family_size_histogram": [ + [ + { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "false", + "fgumi_aware": true, + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } + }, + "test.fgumi.group.family_size_histogram.txt:md5,57742826c7e781f773840f1c977f5f0b" + ] + ], "rna_junctions": [ ], @@ -292,10 +376,10 @@ ] } ], - "timestamp": "2026-02-11T20:16:26.285299", + "timestamp": "2026-07-03T10:54:15.783957564", "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.4" + "nf-test": "0.9.5", + "nextflow": "26.04.4" } } } \ No newline at end of file diff --git a/workflows/preprocessing.nf b/workflows/preprocessing.nf index 78fc5e23..c415dfdc 100644 --- a/workflows/preprocessing.nf +++ b/workflows/preprocessing.nf @@ -270,7 +270,10 @@ workflow PREPROCESSING { FASTQ_TO_CRAM( ch_meta_reads_aligner_index_fasta_gtf ) - ch_multiqc_files = ch_multiqc_files.mix(FASTQ_TO_CRAM.out.sormadup_metrics) + ch_multiqc_files = ch_multiqc_files.mix( + FASTQ_TO_CRAM.out.sormadup_metrics, + FASTQ_TO_CRAM.out.family_size_histogram + ) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 10a2baa1f8d72337e679efb0b577f5ce484c208b Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Mon, 6 Jul 2026 11:17:54 +0200 Subject: [PATCH 32/62] move umiconsensus output after markdup --- conf/modules.config | 1 + modules/local/fgumi/snapzipsort/main.nf | 1 + subworkflows/local/fastq_to_aligned_cram/main.nf | 2 +- subworkflows/local/fastq_umiconsensus_fgumi/main.nf | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 5b304d28..f2400e1b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -308,6 +308,7 @@ process { [ "--order coordinate", "--max-memory ${task.memory.toGiga()}G", + "--write-index", ].join(" ").trim() } } diff --git a/modules/local/fgumi/snapzipsort/main.nf b/modules/local/fgumi/snapzipsort/main.nf index 17f9b9e3..9da134ec 100644 --- a/modules/local/fgumi/snapzipsort/main.nf +++ b/modules/local/fgumi/snapzipsort/main.nf @@ -12,6 +12,7 @@ process FGUMI_SNAPZIPSORT { output: tuple val(meta), path("${prefix}.bam"), emit: bam + tuple val(meta), path("${prefix}.bam.bai"), emit: bai, optional: true tuple val("${task.process}"), val('fgumi'), eval("fgumi --version | sed 's/^fgumi //;q'"), topic: versions tuple val("${task.process}"), val('snap-aligner'), eval("snap-aligner 2>&1 | sed 's/^.*version //;s/.\$//;q'"), topic: versions diff --git a/subworkflows/local/fastq_to_aligned_cram/main.nf b/subworkflows/local/fastq_to_aligned_cram/main.nf index d9f1c5eb..c2eb6659 100644 --- a/subworkflows/local/fastq_to_aligned_cram/main.nf +++ b/subworkflows/local/fastq_to_aligned_cram/main.nf @@ -66,7 +66,6 @@ workflow FASTQ_TO_CRAM { FASTQ_ALIGN_DNA.out.bam .mix(FASTQ_ALIGN_RNA.out.bam) - .mix(FASTQ_UMICONSENSUS_FGUMI.out.cram) .map { meta, files -> def gk = (meta.chunks as Integer ?: 1) return [ @@ -131,6 +130,7 @@ workflow FASTQ_TO_CRAM { */ ch_markdup_index + .mix(FASTQ_UMICONSENSUS_FGUMI.out.bam) // no markdup for FGUMI as this is already solved by the tooling itself .branch { meta, reads, index -> bam: reads.getExtension() == "bam" return [meta, reads, index] diff --git a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf index cba74ade..177c4bf0 100644 --- a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf +++ b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf @@ -77,7 +77,7 @@ workflow FASTQ_UMICONSENSUS_FGUMI { ) emit: - cram = UMI_FGUMI_SNAPZIPSORT.out.bam + bam = UMI_FGUMI_SNAPZIPSORT.out.bam.join(UMI_FGUMI_SNAPZIPSORT.out.bai) grouping_metrics = FGUMI_GROUP.out.metrics family_size_histogram = FGUMI_GROUP.out.histogram consensus_metrics = FGUMI_SIMPLEX.out.stats From 9b73160e1e7163cfd66879ddd281ab60c71225e0 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Mon, 6 Jul 2026 11:32:34 +0200 Subject: [PATCH 33/62] bam output of snap (better efficiency with fgumi) --- modules/local/fgumi/snapzipsort/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/fgumi/snapzipsort/main.nf b/modules/local/fgumi/snapzipsort/main.nf index 9da134ec..71b462f5 100644 --- a/modules/local/fgumi/snapzipsort/main.nf +++ b/modules/local/fgumi/snapzipsort/main.nf @@ -39,7 +39,7 @@ process FGUMI_SNAPZIPSORT { \$INDEX \\ -pairedInterleavedFastq - \\ -t ${task.cpus} \\ - -o -sam - \\ + -o -bam - \\ ${args2} \\ | fgumi zipper \\ --unmapped ${unmapped_bam} \\ From 57dac82b4949179ef815b4ed37db795732ae686b Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Mon, 6 Jul 2026 12:58:12 +0200 Subject: [PATCH 34/62] merge data before fgumi group --- modules.json | 5 + modules/nf-core/fgumi/merge/environment.yml | 7 + modules/nf-core/fgumi/merge/main.nf | 37 +++++ modules/nf-core/fgumi/merge/meta.yml | 69 +++++++++ .../nf-core/fgumi/merge/tests/main.nf.test | 134 ++++++++++++++++++ .../fgumi/merge/tests/main.nf.test.snap | 85 +++++++++++ .../nf-core/fgumi/merge/tests/nextflow.config | 5 + .../local/fastq_umiconsensus_fgumi/main.nf | 34 ++++- 8 files changed, 375 insertions(+), 1 deletion(-) create mode 100644 modules/nf-core/fgumi/merge/environment.yml create mode 100644 modules/nf-core/fgumi/merge/main.nf create mode 100644 modules/nf-core/fgumi/merge/meta.yml create mode 100644 modules/nf-core/fgumi/merge/tests/main.nf.test create mode 100644 modules/nf-core/fgumi/merge/tests/main.nf.test.snap create mode 100644 modules/nf-core/fgumi/merge/tests/nextflow.config diff --git a/modules.json b/modules.json index 1ca0a2e1..bae40513 100644 --- a/modules.json +++ b/modules.json @@ -66,6 +66,11 @@ "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", "installed_by": ["modules"] }, + "fgumi/merge": { + "branch": "master", + "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", + "installed_by": ["modules"] + }, "fgumi/simplex": { "branch": "master", "git_sha": "c3e04783b2ac99ffc011745ec092614a7bef86ca", diff --git a/modules/nf-core/fgumi/merge/environment.yml b/modules/nf-core/fgumi/merge/environment.yml new file mode 100644 index 00000000..68aafa2b --- /dev/null +++ b/modules/nf-core/fgumi/merge/environment.yml @@ -0,0 +1,7 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + - "bioconda::fgumi=0.4.0" diff --git a/modules/nf-core/fgumi/merge/main.nf b/modules/nf-core/fgumi/merge/main.nf new file mode 100644 index 00000000..06fd3ffe --- /dev/null +++ b/modules/nf-core/fgumi/merge/main.nf @@ -0,0 +1,37 @@ +process FGUMI_MERGE { + tag "${meta.id}" + label 'process_medium' + + 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/4a/4a62b457c53300603da026225f95b4db04d1c9f8ba7f734787818fc105d51323/data': + 'community.wave.seqera.io/library/fgumi:0.4.0--1fb5dc6de05ce63b' }" + + input: + tuple val(meta), path(bams, stageAs: "?/*") + + output: + tuple val(meta), path("*.bam"), emit: bam + tuple val("${task.process}"), val('fgumi'), eval('fgumi --version | sed "s/^fgumi //"'), topic: versions, emit: versions_fgumi + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + fgumi \\ + merge \\ + --output ${prefix}.bam \\ + --threads $task.cpus \\ + ${args} \\ + ${bams} + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + """ +} diff --git a/modules/nf-core/fgumi/merge/meta.yml b/modules/nf-core/fgumi/merge/meta.yml new file mode 100644 index 00000000..7f2f92e7 --- /dev/null +++ b/modules/nf-core/fgumi/merge/meta.yml @@ -0,0 +1,69 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "fgumi_merge" +description: Merge pre-sorted BAM files into a single sorted BAM +keywords: + - merge + - bam + - alignment + - sort +tools: + - "fgumi": + description: "High-performance tools for UMI-tagged sequencing data." + homepage: "https://github.com/fulcrumgenomics/fgumi" + documentation: "https://fgumi.readthedocs.io/" + tool_dev_url: "https://github.com/fulcrumgenomics/fgumi" + licence: ["MIT"] + identifier: biotools:fgumi + +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - bams: + type: file + description: Multiple sorted BAM files to merge (all must be sorted in the same order) + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" # BAM + +output: + bam: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. `[ id:'sample1' ]` + - "*.bam": + type: file + description: Merged BAM file + pattern: "*.bam" + ontologies: + - edam: "http://edamontology.org/format_2572" # BAM + versions_fgumi: + - - "${task.process}": + type: string + description: The name of the process + - "fgumi": + type: string + description: The name of the tool + - "fgumi --version | sed \"s/^fgumi //\"": + type: eval + description: The expression to obtain the version of the tool + +topics: + versions: + - - ${task.process}: + type: string + description: The name of the process + - fgumi: + type: string + description: The name of the tool + - fgumi --version | sed "s/^fgumi //": + type: eval + description: The expression to obtain the version of the tool +authors: + - "@sppearce" +maintainers: + - "@sppearce" diff --git a/modules/nf-core/fgumi/merge/tests/main.nf.test b/modules/nf-core/fgumi/merge/tests/main.nf.test new file mode 100644 index 00000000..4bcb47ff --- /dev/null +++ b/modules/nf-core/fgumi/merge/tests/main.nf.test @@ -0,0 +1,134 @@ +nextflow_process { + + name "Test Process FGUMI_MERGE" + script "../main.nf" + process "FGUMI_MERGE" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "fgumi" + tag "fgumi/merge" + + test("homo_sapiens - one bam") { + + when { + params { + module_args = "" + } + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) ] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("homo_sapiens - multiple bams - template coordinate") { + + when { + params { + module_args = "--order template-coordinate" + } + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true) + ] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("homo_sapiens - multiple bams - coordinate sorted") { + + when { + params { + module_args = "--order coordinate" + } + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true) + ] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot( + bam(process.out.bam[0][1]).getReadsMD5(), + process.out.findAll { key, val -> key.startsWith('versions') } + ).match() } + ) + } + + } + + test("homo_sapiens - multiple bams - stub") { + + options "-stub" + + when { + params { + module_args = "" + } + process { + """ + input[0] = [ + [ id:'test' ], + [ + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam', checkIfExists: true) + ] + ] + """ + } + } + + then { + assert process.success + assertAll( + { assert snapshot(sanitizeOutput(process.out)).match() } + ) + } + + } + +} diff --git a/modules/nf-core/fgumi/merge/tests/main.nf.test.snap b/modules/nf-core/fgumi/merge/tests/main.nf.test.snap new file mode 100644 index 00000000..66a0e1b5 --- /dev/null +++ b/modules/nf-core/fgumi/merge/tests/main.nf.test.snap @@ -0,0 +1,85 @@ +{ + "homo_sapiens - multiple bams - coordinate sorted": { + "content": [ + "c4525b95f05075208347295e6a1fb232", + { + "versions_fgumi": [ + [ + "FGUMI_MERGE", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:02:58.477821", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - multiple bams - stub": { + "content": [ + { + "bam": [ + [ + { + "id": "test" + }, + "test.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_fgumi": [ + [ + "FGUMI_MERGE", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:03:04.945914", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - one bam": { + "content": [ + "2f11e4fe3390b8ad0a1852616fd1da04", + { + "versions_fgumi": [ + [ + "FGUMI_MERGE", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:02:46.649766", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + }, + "homo_sapiens - multiple bams - template coordinate": { + "content": [ + "b8f24ae3643e1dbf6172b352422007f6", + { + "versions_fgumi": [ + [ + "FGUMI_MERGE", + "fgumi", + "0.4.0" + ] + ] + } + ], + "timestamp": "2026-06-26T13:02:51.599253", + "meta": { + "nf-test": "0.9.5", + "nextflow": "25.10.4" + } + } +} \ No newline at end of file diff --git a/modules/nf-core/fgumi/merge/tests/nextflow.config b/modules/nf-core/fgumi/merge/tests/nextflow.config new file mode 100644 index 00000000..e79a9602 --- /dev/null +++ b/modules/nf-core/fgumi/merge/tests/nextflow.config @@ -0,0 +1,5 @@ +process { + withName: FGUMI_MERGE { + ext.args = params.module_args + } +} diff --git a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf index 177c4bf0..20cc8779 100644 --- a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf +++ b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf @@ -4,6 +4,7 @@ include { FGUMI_EXTRACT } from "../../../modules/nf-core/fgumi/extract/main.nf" include { FGUMI_FILTER } from "../../../modules/nf-core/fgumi/filter/main.nf" include { FGUMI_GROUP } from "../../../modules/nf-core/fgumi/group/main.nf" +include { FGUMI_MERGE } from "../../../modules/nf-core/fgumi/merge/main.nf" include { FGUMI_SIMPLEX } from "../../../modules/nf-core/fgumi/simplex/main.nf" include { FGUMI_SNAPZIPSORT as RAW_FGUMI_SNAPZIPSORT } from "../../../modules/local/fgumi/snapzipsort/main.nf" include { FGUMI_SNAPZIPSORT as UMI_FGUMI_SNAPZIPSORT } from "../../../modules/local/fgumi/snapzipsort/main.nf" @@ -40,8 +41,39 @@ workflow FASTQ_UMICONSENSUS_FGUMI { }, ) + def ch_merge_input = RAW_FGUMI_SNAPZIPSORT.out.bam + .map { meta, files -> + def gk = (meta.chunks as Integer ?: 1) + return [ + groupKey( + meta - meta.subMap('readgroup', 'chunks') + [id: meta.id ==~ /^\d{4}\..*$/ ? meta.id[5..-1] : meta.id], + gk, + ), + files, + ] + } + .groupTuple() + .map { meta, files -> + def gk = (meta.count as Integer ?: 1) + return [ + groupKey( + meta - meta.subMap('count') + [id: meta.samplename ?: meta.id], + gk, + ), + files, + ] + } + .groupTuple() + .map { meta, files -> + return [meta, files.flatten()] + } + + FGUMI_MERGE( + ch_merge_input + ) + FGUMI_GROUP( - RAW_FGUMI_SNAPZIPSORT.out.bam, + FGUMI_MERGE.out.bam, 'adjacency' ) From f2bb32d2d32d275fb1cfae63d8b220139e4177d8 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Mon, 6 Jul 2026 13:41:13 +0200 Subject: [PATCH 35/62] fix snaps --- .../local/fgumi/snapzipsort/main.nf.test.snap | 12 +- .../fastq_to_aligned_cram/main.nf.test.snap | 35 +++-- .../main.nf.test.snap | 146 ++++++++++-------- 3 files changed, 109 insertions(+), 84 deletions(-) diff --git a/tests/modules/local/fgumi/snapzipsort/main.nf.test.snap b/tests/modules/local/fgumi/snapzipsort/main.nf.test.snap index 44f4d134..bea6ad48 100644 --- a/tests/modules/local/fgumi/snapzipsort/main.nf.test.snap +++ b/tests/modules/local/fgumi/snapzipsort/main.nf.test.snap @@ -2,13 +2,16 @@ "homo sapiens - test": { "content": [ { + "bai": [ + + ], "bam": [ [ { "id": "test", "single_end": false }, - "test.fgumi.bam:md5,42aeef21615cf8f3a8908abb6229595c" + "test.fgumi.bam:md5,6bab0c75514fda4b4e7efbbae5e33cc8" ] ] }, @@ -27,7 +30,7 @@ ] } ], - "timestamp": "2026-07-02T16:15:25.079107282", + "timestamp": "2026-07-06T13:16:43.167620236", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -36,6 +39,9 @@ "homo sapiens - test - stub": { "content": [ { + "bai": [ + + ], "bam": [ [ { @@ -61,7 +67,7 @@ ] } ], - "timestamp": "2026-07-02T16:17:04.152576656", + "timestamp": "2026-07-06T13:18:57.541461241", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap index 9501156a..57650201 100644 --- a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap +++ b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap @@ -340,26 +340,29 @@ "single_end": false } }, - "test.merged.cram", - "test.merged.cram.crai" + "test.cram", + "test.cram.crai" ] ], "family_size_histogram": [ [ { - "id": "test", - "samplename": "test", - "single_end": false, - "sample_type": "DNA", - "markdup": "false", - "fgumi_aware": true, - "fgumi_simplex_min_reads": 1, - "fgumi_snap_ignore_mismatched_pairs": false, - "genome_data": { - "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + "groupSize": 1, + "groupTarget": { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "false", + "fgumi_aware": true, + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } } }, "test.fgumi.group.family_size_histogram.txt:md5,57742826c7e781f773840f1c977f5f0b" @@ -376,7 +379,7 @@ ] } ], - "timestamp": "2026-07-03T10:54:15.783957564", + "timestamp": "2026-07-06T13:26:52.23745498", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap b/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap index 7df5795e..68e5d648 100644 --- a/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap +++ b/tests/subworkflows/local/fastq_umiconsensus_fgumi/main.nf.test.snap @@ -2,61 +2,71 @@ "umi consensus test": { "content": [ { - "consensus_metrics": [ + "bam": [ [ { - "id": "test", - "samplename": "test", - "single_end": false, - "sample_type": "DNA", - "markdup": "bamsormadup", - "fgumi_simplex_min_reads": 1, - "fgumi_snap_ignore_mismatched_pairs": false, - "genome_data": { - "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + "groupSize": 1, + "groupTarget": { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } } }, - "test.fgumi.simplex.stats.txt:md5,c259ad6db7c02de9e0f1b9f95a3d6ab0" + "test.fgumi.bam:md5,d8847959ea89503e93669d3d5526813c", + "test.fgumi.bam.bai:md5,6b054c31ca1e0c5cdf99d6fdc6229654" ] ], - "cram": [ + "consensus_metrics": [ [ { - "id": "test", - "samplename": "test", - "single_end": false, - "sample_type": "DNA", - "markdup": "bamsormadup", - "fgumi_simplex_min_reads": 1, - "fgumi_snap_ignore_mismatched_pairs": false, - "genome_data": { - "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + "groupSize": 1, + "groupTarget": { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } } }, - "test.fgumi.bam:md5,fdad08ae32095f2fd8a3f9d5f7d697d1" + "test.fgumi.simplex.stats.txt:md5,c259ad6db7c02de9e0f1b9f95a3d6ab0" ] ], "family_size_histogram": [ [ { - "id": "test", - "samplename": "test", - "single_end": false, - "sample_type": "DNA", - "markdup": "bamsormadup", - "fgumi_simplex_min_reads": 1, - "fgumi_snap_ignore_mismatched_pairs": false, - "genome_data": { - "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + "groupSize": 1, + "groupTarget": { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } } }, "test.fgumi.group.family_size_histogram.txt:md5,57742826c7e781f773840f1c977f5f0b" @@ -65,18 +75,21 @@ "filtering_metrics": [ [ { - "id": "test", - "samplename": "test", - "single_end": false, - "sample_type": "DNA", - "markdup": "bamsormadup", - "fgumi_simplex_min_reads": 1, - "fgumi_snap_ignore_mismatched_pairs": false, - "genome_data": { - "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + "groupSize": 1, + "groupTarget": { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } } }, "test.fgumi.filter.stats.txt:md5,01b1b32c9151552a623eef933b8d1f96" @@ -85,18 +98,21 @@ "grouping_metrics": [ [ { - "id": "test", - "samplename": "test", - "single_end": false, - "sample_type": "DNA", - "markdup": "bamsormadup", - "fgumi_simplex_min_reads": 1, - "fgumi_snap_ignore_mismatched_pairs": false, - "genome_data": { - "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", - "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", - "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", - "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + "groupSize": 1, + "groupTarget": { + "id": "test", + "samplename": "test", + "single_end": false, + "sample_type": "DNA", + "markdup": "bamsormadup", + "fgumi_simplex_min_reads": 1, + "fgumi_snap_ignore_mismatched_pairs": false, + "genome_data": { + "snap": "s3://test-data/genomics/homo_sapiens/genome/snap/", + "fasta": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", + "fai": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", + "dict": "s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.dict" + } } }, "test.fgumi.group.grouping_metrics.txt:md5,deb6be58b11022b67145fe4e2c7ca299" @@ -104,7 +120,7 @@ ] } ], - "timestamp": "2026-07-02T16:50:47.876765096", + "timestamp": "2026-07-06T13:29:57.554096841", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" From c62f6188e375a20039a3964a97baf004efd20cb1 Mon Sep 17 00:00:00 2001 From: Nicolas Vannieuwkerke Date: Mon, 6 Jul 2026 13:50:56 +0200 Subject: [PATCH 36/62] update usage docs --- docs/usage.md | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 535d3c6d..fd5a23d2 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -41,27 +41,30 @@ A `fastq` samplesheet file consisting of paired-end data may look something like Following table shows the fields that are used by the `fastq` samplesheet: -| Column | Description | Required | -| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | -| `id` | Unique sample identifier | :heavy_check_mark: | -| `samplename` | The sample name corresponding to the sample in the Fastq file(s) | :heavy_check_mark: | -| `genome` | The genome build to use for the analysis. Currently supports `GRCh38`, `GRCm39` and `GRCz11` | :heavy_check_mark: (unless `organism` is given) | -| `organism` | Full name of the organism. Currently supports `Homo sapiens`, `Mus musculus` and `Danio rerio` | :heavy_check_mark: (unless `genome` is given) | -| `library` | Sample library name | :x: | -| `tag` | The tag used by the sample. Can be one of `WES`, `WGS`, `SeqCap` and `coPGT-M` | :x: | -| `aligner` | The aligner to use for this sample. Can be one of these: `bowtie2`, `bwamem`, `bwamem2`, `dragmap`, `strobe` and `snap`. Set to `false` to output fastq. | :heavy_check_mark: | -| `markdup` | Markdup algorithm to use for duplicate marking. Can be set to `bamsormadup`, `samtools` or `false` | :x: | -| `umi_aware` | Whether UMI-aware processing should be used. Only applies when `markdup` is set to `samtools` | :x: | -| `skip_trimming` | Skip adapter trimming step | :x: | -| `trim_front` | Number of bases to trim from the front of reads | :x: | -| `trim_tail` | Number of bases to trim from the tail of reads | :x: | -| `adapter_R1` | Adapter sequence for read 1 | :x: | -| `adapter_R2` | Adapter sequence for read 2 | :x: | -| `qc_mode` | QC mode for the sample. Can be set to `basic` or `full`. Basic QC includes samtools flagstat, idxstats and mosdepth. Full QC includes samtools stats, samtools coverage, riker metrics and panel coverage in addition to basic QC. | :x: | -| `roi` | The path to a BED file containing Regions Of Interest for coverage analysis | :x: | -| `sample_type` | Sample type (e.g., `DNA`, `RNA`) | :x: | -| `fastq_1` | FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :heavy_check_mark: | -| `fastq_2` | FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :x: | +| Column | Description | Required | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | +| `id` | Unique sample identifier | :heavy_check_mark: | +| `samplename` | The sample name corresponding to the sample in the Fastq file(s) | :heavy_check_mark: | +| `genome` | The genome build to use for the analysis. Currently supports `GRCh38`, `GRCm39` and `GRCz11` | :heavy_check_mark: (unless `organism` is given) | +| `organism` | Full name of the organism. Currently supports `Homo sapiens`, `Mus musculus` and `Danio rerio` | :heavy_check_mark: (unless `genome` is given) | +| `library` | Sample library name | :x: | +| `tag` | The tag used by the sample. Can be one of `WES`, `WGS`, `SeqCap` and `coPGT-M` | :x: | +| `aligner` | The aligner to use for this sample. Can be one of these: `bowtie2`, `bwamem`, `bwamem2`, `dragmap`, `strobe` and `snap`. Set to `false` to output fastq. | :heavy_check_mark: | +| `markdup` | Markdup algorithm to use for duplicate marking. Can be set to `bamsormadup`, `samtools` or `false` | :x: | +| `umi_aware` | Whether UMI-aware processing should be used. Only applies when `markdup` is set to `samtools` | :x: | +| `fgumi_aware` | Perform consensus calling using the `fgumi` toolsuite. This only works for DNA samples and will always run the SNAP aligner | :x: | +| `fgumi_simplex_min_reads` | Minimum number of reads required per UMI family for fgumi simplex consensus generation. Defaults to `1` and should be `1` or higher. | :x: | +| `fgumi_snap_ignore_mismatched_pairs` | Pass -I to SNAP to ignore mismatched read IDs in paired-end input when using the `fgumi` toolsuite (`fgumi_aware` set as `true`). Defaults to `true` | :x: | +| `skip_trimming` | Skip adapter trimming step | :x: | +| `trim_front` | Number of bases to trim from the front of reads | :x: | +| `trim_tail` | Number of bases to trim from the tail of reads | :x: | +| `adapter_R1` | Adapter sequence for read 1 | :x: | +| `adapter_R2` | Adapter sequence for read 2 | :x: | +| `qc_mode` | QC mode for the sample. Can be set to `basic` or `full`. Basic QC includes samtools flagstat, idxstats and mosdepth. Full QC includes samtools stats, samtools coverage, riker metrics and panel coverage in addition to basic QC. | :x: | +| `roi` | The path to a BED file containing Regions Of Interest for coverage analysis | :x: | +| `sample_type` | Sample type (e.g., `DNA`, `RNA`) | :x: | +| `fastq_1` | FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :heavy_check_mark: | +| `fastq_2` | FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz' | :x: | An [example samplesheet](../tests/inputs/test.yml) has been provided with the pipeline. From b13fec27a28579f7ae2152c95613c0d57c32ff32 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 7 Jul 2026 08:28:07 +0200 Subject: [PATCH 37/62] replace 'fgumi_aware' with more generic 'call_consensus' --- assets/schema_input.json | 4 +- assets/schema_sampleinfo.json | 4 +- docs/usage.md | 4 +- .../local/fastq_to_aligned_cram/main.nf | 2 +- tests/inputs/test.yml | 2 +- .../local/fastq_to_aligned_cram/main.nf.test | 2 +- .../fastq_to_aligned_cram/main.nf.test.snap | 54 ++--- tests/workflows/preprocessing.nf.test.snap | 184 +++++++++--------- 8 files changed, 128 insertions(+), 128 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index 51ff67e7..4b167dee 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -53,8 +53,8 @@ "description": "Run markdup in UMI-aware mode. This applies to Samtools only and requires the UMI to be in the read name.", "default": false }, - "fgumi_aware": { - "meta": ["fgumi_aware"], + "call_consensus": { + "meta": ["call_consensus"], "type": "boolean", "description": "Enable UMI-aware consensus processing through the fgumi branch.", "default": false diff --git a/assets/schema_sampleinfo.json b/assets/schema_sampleinfo.json index 6be4d4a9..582efe7b 100644 --- a/assets/schema_sampleinfo.json +++ b/assets/schema_sampleinfo.json @@ -93,8 +93,8 @@ "description": "Run markdup in UMI-aware mode. This applies to Samtools only and requires the UMI to be in the read name.", "default": false }, - "fgumi_aware": { - "meta": ["fgumi_aware"], + "call_consensus": { + "meta": ["call_consensus"], "type": "boolean", "description": "Enable UMI-aware consensus processing through the fgumi branch.", "default": false diff --git a/docs/usage.md b/docs/usage.md index fd5a23d2..ba7d005a 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -52,9 +52,9 @@ Following table shows the fields that are used by the `fastq` samplesheet: | `aligner` | The aligner to use for this sample. Can be one of these: `bowtie2`, `bwamem`, `bwamem2`, `dragmap`, `strobe` and `snap`. Set to `false` to output fastq. | :heavy_check_mark: | | `markdup` | Markdup algorithm to use for duplicate marking. Can be set to `bamsormadup`, `samtools` or `false` | :x: | | `umi_aware` | Whether UMI-aware processing should be used. Only applies when `markdup` is set to `samtools` | :x: | -| `fgumi_aware` | Perform consensus calling using the `fgumi` toolsuite. This only works for DNA samples and will always run the SNAP aligner | :x: | +| `call_consensus` | Perform consensus calling using the `fgumi` toolsuite. This only works for DNA samples and will always run the SNAP aligner | :x: | | `fgumi_simplex_min_reads` | Minimum number of reads required per UMI family for fgumi simplex consensus generation. Defaults to `1` and should be `1` or higher. | :x: | -| `fgumi_snap_ignore_mismatched_pairs` | Pass -I to SNAP to ignore mismatched read IDs in paired-end input when using the `fgumi` toolsuite (`fgumi_aware` set as `true`). Defaults to `true` | :x: | +| `fgumi_snap_ignore_mismatched_pairs` | Pass -I to SNAP to ignore mismatched read IDs in paired-end input when using the `fgumi` toolsuite (`call_consensus` set as `true`). Defaults to `true` | :x: | | `skip_trimming` | Skip adapter trimming step | :x: | | `trim_front` | Number of bases to trim from the front of reads | :x: | | `trim_tail` | Number of bases to trim from the tail of reads | :x: | diff --git a/subworkflows/local/fastq_to_aligned_cram/main.nf b/subworkflows/local/fastq_to_aligned_cram/main.nf index c2eb6659..029500da 100644 --- a/subworkflows/local/fastq_to_aligned_cram/main.nf +++ b/subworkflows/local/fastq_to_aligned_cram/main.nf @@ -36,7 +36,7 @@ workflow FASTQ_TO_CRAM { .branch { meta, reads, aligner, index, fasta, fai, gtf -> rna: meta.sample_type == "RNA" return [meta, reads, "star", getGenomeAttribute(meta.genome_data, 'star'), gtf] - umi: meta.fgumi_aware == true + umi: meta.call_consensus == true return [meta, reads] dna: true // catch all non-RNA samples as DNA, as some may be missing sample_type or have other sample types (e.g. tissue, cell line, etc.) that should be aligned with the DNA aligner diff --git a/tests/inputs/test.yml b/tests/inputs/test.yml index e71e7282..17ae8846 100644 --- a/tests/inputs/test.yml +++ b/tests/inputs/test.yml @@ -57,7 +57,7 @@ sample_type: DNA aligner: snap markdup: bamsormadup - fgumi_aware: true + call_consensus: true run_coverage: true fastq_1: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R1_001.fastq.gz fastq_2: https://github.com/nf-cmgg/test-datasets/raw/main/data/genomics/homo_sapiens/illumina/fastq/sample1_S31_R2_001.fastq.gz diff --git a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test index 3394ea12..72fe6d37 100644 --- a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test +++ b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test @@ -193,7 +193,7 @@ nextflow_workflow { single_end: false, sample_type: "DNA", markdup: "false", - fgumi_aware: true, + call_consensus: true, fgumi_simplex_min_reads: 1, fgumi_snap_ignore_mismatched_pairs: false, genome_data: [ diff --git a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap index 57650201..fa0f4ff7 100644 --- a/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap +++ b/tests/subworkflows/local/fastq_to_aligned_cram/main.nf.test.snap @@ -3,7 +3,7 @@ "content": [ { "align_reports": [ - + ], "cram_crai": [ [ @@ -26,16 +26,16 @@ ] ], "family_size_histogram": [ - + ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "sormadup_metrics": [ - + ] } ], @@ -49,7 +49,7 @@ "content": [ { "align_reports": [ - + ], "cram_crai": [ [ @@ -72,13 +72,13 @@ ] ], "family_size_histogram": [ - + ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "sormadup_metrics": [ [ @@ -111,7 +111,7 @@ "content": [ { "align_reports": [ - + ], "cram_crai": [ [ @@ -134,13 +134,13 @@ ] ], "family_size_histogram": [ - + ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "sormadup_metrics": [ [ @@ -173,7 +173,7 @@ "content": [ { "align_reports": [ - + ], "cram_crai": [ [ @@ -197,7 +197,7 @@ ] ], "family_size_histogram": [ - + ], "rna_junctions": [ [ @@ -271,7 +271,7 @@ "content": [ { "align_reports": [ - + ], "cram_crai": [ [ @@ -294,16 +294,16 @@ ] ], "family_size_histogram": [ - + ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "sormadup_metrics": [ - + ] } ], @@ -317,14 +317,14 @@ "content": [ { "align_reports": [ - + ], "cram_crai": [ [ { "groupSize": 1, "groupTarget": { - "fgumi_aware": true, + "call_consensus": true, "fgumi_simplex_min_reads": 1, "fgumi_snap_ignore_mismatched_pairs": false, "genome_data": { @@ -354,7 +354,7 @@ "single_end": false, "sample_type": "DNA", "markdup": "false", - "fgumi_aware": true, + "call_consensus": true, "fgumi_simplex_min_reads": 1, "fgumi_snap_ignore_mismatched_pairs": false, "genome_data": { @@ -369,13 +369,13 @@ ] ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "sormadup_metrics": [ - + ] } ], @@ -385,4 +385,4 @@ "nextflow": "26.04.4" } } -} \ No newline at end of file +} diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index d0251381..219de652 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -3,7 +3,7 @@ "content": [ { "align_reports": [ - + ], "crams": [ [ @@ -35,19 +35,19 @@ ] ], "demultiplex_interop": [ - + ], "demultiplex_logs": [ - + ], "demultiplex_reports": [ - + ], "falco_html": [ - + ], "falco_txt": [ - + ], "fastp_html": [ [ @@ -118,7 +118,7 @@ ] ], "fastq": [ - + ], "md5sums": [ [ @@ -233,7 +233,7 @@ ] ], "mosdepth_per_base_d4": [ - + ], "mosdepth_quantized_bed": [ [ @@ -292,13 +292,13 @@ ] ], "mosdepth_regions": [ - + ], "mosdepth_regions_bed": [ - + ], "mosdepth_regions_csi": [ - + ], "mosdepth_summary": [ [ @@ -329,10 +329,10 @@ ] ], "mosdepth_thresholds_bed": [ - + ], "mosdepth_thresholds_csi": [ - + ], "multiqc_data": [ [ @@ -343,7 +343,7 @@ ] ], "multiqc_plots": [ - + ], "multiqc_report": [ [ @@ -355,21 +355,21 @@ ], "multiqcsav_data": [ [ - + ] ], "multiqcsav_plots": [ [ - + ] ], "multiqcsav_report": [ [ - + ] ], "panelcoverage": [ - + ], "riker_alignment_metrics": [ [ @@ -428,13 +428,13 @@ ] ], "riker_error_indel": [ - + ], "riker_error_mismatch": [ - + ], "riker_error_overlap": [ - + ], "riker_gcbias_detail": [ [ @@ -493,13 +493,13 @@ ] ], "riker_hybcap_metrics": [ - + ], "riker_hybcap_per_base": [ - + ], "riker_hybcap_per_target": [ - + ], "riker_isize_histogram": [ [ @@ -703,10 +703,10 @@ ] ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "samtools_coverage": [ [ @@ -870,23 +870,23 @@ "library": "test", "tag": "WES", "purpose": [ - + ], "organism": "Homo sapiens", "genome": "GRCh38", "vivar_project": [ - + ], "binsize": [ - + ], "panels": [ - + ], "aligner": "bwamem", "markdup": "bamsormadup", "umi_aware": false, - "fgumi_aware": false, + "call_consensus": false, "fgumi_simplex_min_reads": 1, "fgumi_snap_ignore_mismatched_pairs": true, "skip_trimming": false, @@ -921,7 +921,7 @@ "content": [ { "align_reports": [ - + ], "crams": [ [ @@ -954,19 +954,19 @@ ] ], "demultiplex_interop": [ - + ], "demultiplex_logs": [ - + ], "demultiplex_reports": [ - + ], "falco_html": [ - + ], "falco_txt": [ - + ], "fastp_html": [ [ @@ -1039,7 +1039,7 @@ ] ], "fastq": [ - + ], "md5sums": [ [ @@ -1158,7 +1158,7 @@ ] ], "mosdepth_per_base_d4": [ - + ], "mosdepth_quantized_bed": [ [ @@ -1335,10 +1335,10 @@ ] ], "mosdepth_thresholds_bed": [ - + ], "mosdepth_thresholds_csi": [ - + ], "multiqc_data": [ [ @@ -1349,7 +1349,7 @@ ] ], "multiqc_plots": [ - + ], "multiqc_report": [ [ @@ -1361,81 +1361,81 @@ ], "multiqcsav_data": [ [ - + ] ], "multiqcsav_plots": [ [ - + ] ], "multiqcsav_report": [ [ - + ] ], "panelcoverage": [ - + ], "riker_alignment_metrics": [ - + ], "riker_base_dist": [ - + ], "riker_error_indel": [ - + ], "riker_error_mismatch": [ - + ], "riker_error_overlap": [ - + ], "riker_gcbias_detail": [ - + ], "riker_gcbias_summary": [ - + ], "riker_hybcap_metrics": [ - + ], "riker_hybcap_per_base": [ - + ], "riker_hybcap_per_target": [ - + ], "riker_isize_histogram": [ - + ], "riker_isize_metrics": [ - + ], "riker_mean_qual": [ - + ], "riker_pdf": [ - + ], "riker_qual_dist": [ - + ], "riker_wgs_coverage": [ - + ], "riker_wgs_metrics": [ - + ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "samtools_coverage": [ - + ], "samtools_flagstat": [ [ @@ -1496,7 +1496,7 @@ ] ], "samtools_stats": [ - + ], "sormadup_metrics": [ [ @@ -1539,7 +1539,7 @@ "content": [ { "align_reports": [ - + ], "crams": [ [ @@ -1572,19 +1572,19 @@ ] ], "demultiplex_interop": [ - + ], "demultiplex_logs": [ - + ], "demultiplex_reports": [ - + ], "falco_html": [ - + ], "falco_txt": [ - + ], "fastp_html": [ [ @@ -1657,7 +1657,7 @@ ] ], "fastq": [ - + ], "md5sums": [ [ @@ -1776,7 +1776,7 @@ ] ], "mosdepth_per_base_d4": [ - + ], "mosdepth_quantized_bed": [ [ @@ -1953,10 +1953,10 @@ ] ], "mosdepth_thresholds_bed": [ - + ], "mosdepth_thresholds_csi": [ - + ], "multiqc_data": [ [ @@ -1967,7 +1967,7 @@ ] ], "multiqc_plots": [ - + ], "multiqc_report": [ [ @@ -1979,21 +1979,21 @@ ], "multiqcsav_data": [ [ - + ] ], "multiqcsav_plots": [ [ - + ] ], "multiqcsav_report": [ [ - + ] ], "panelcoverage": [ - + ], "riker_alignment_metrics": [ [ @@ -2054,13 +2054,13 @@ ] ], "riker_error_indel": [ - + ], "riker_error_mismatch": [ - + ], "riker_error_overlap": [ - + ], "riker_gcbias_detail": [ [ @@ -2150,10 +2150,10 @@ ] ], "riker_hybcap_per_base": [ - + ], "riker_hybcap_per_target": [ - + ], "riker_isize_histogram": [ [ @@ -2306,16 +2306,16 @@ ] ], "riker_wgs_coverage": [ - + ], "riker_wgs_metrics": [ - + ], "rna_junctions": [ - + ], "rna_splice_junctions": [ - + ], "samtools_coverage": [ [ @@ -2470,4 +2470,4 @@ "nextflow": "26.04.4" } } -} \ No newline at end of file +} From a28b0a353ca3102ee6a4c1d8b3a5c247f2f97f06 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 7 Jul 2026 08:18:29 +0200 Subject: [PATCH 38/62] bump riker to v0.4.0 --- modules.json | 2 +- modules/nf-core/riker/multi/environment.yml | 2 +- modules/nf-core/riker/multi/main.nf | 4 +- modules/nf-core/riker/multi/riker-multi.diff | 2 +- .../riker/multi/tests/main.nf.test.snap | 38 +++++++++---------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/modules.json b/modules.json index bae40513..3b3c8352 100644 --- a/modules.json +++ b/modules.json @@ -105,7 +105,7 @@ }, "riker/multi": { "branch": "master", - "git_sha": "89e570609a9c76e86861b8acd0bc7e0aafaccab0", + "git_sha": "d39d55355103c4ba17887e8aea2884c60c74a70e", "installed_by": ["modules"], "patch": "modules/nf-core/riker/multi/riker-multi.diff" }, diff --git a/modules/nf-core/riker/multi/environment.yml b/modules/nf-core/riker/multi/environment.yml index c35c65db..26cbc6c3 100644 --- a/modules/nf-core/riker/multi/environment.yml +++ b/modules/nf-core/riker/multi/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::riker=0.3.0 + - bioconda::riker=0.4.0 diff --git a/modules/nf-core/riker/multi/main.nf b/modules/nf-core/riker/multi/main.nf index 1cfa6477..cb3a60bb 100644 --- a/modules/nf-core/riker/multi/main.nf +++ b/modules/nf-core/riker/multi/main.nf @@ -4,8 +4,8 @@ process RIKER_MULTI { 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/62/62ce363fc85eaa178522adfc3ddbc4a145d7a4136981e060151886e34e7a55d5/data' : - 'community.wave.seqera.io/library/riker:0.3.0--56fa17ae2be0828f' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/54/54c7820b49cfb5fada32c1825ac8a46c05d0085105c50055cbce4c37701ab95e/data' : + 'community.wave.seqera.io/library/riker:0.4.0--4e7eeb0beed906c0' }" input: tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) diff --git a/modules/nf-core/riker/multi/riker-multi.diff b/modules/nf-core/riker/multi/riker-multi.diff index f914fa2c..0323a195 100644 --- a/modules/nf-core/riker/multi/riker-multi.diff +++ b/modules/nf-core/riker/multi/riker-multi.diff @@ -5,7 +5,7 @@ Changes in 'riker/multi/main.nf': --- modules/nf-core/riker/multi/main.nf +++ modules/nf-core/riker/multi/main.nf @@ -8,8 +8,7 @@ - 'community.wave.seqera.io/library/riker:0.3.0--56fa17ae2be0828f' }" + 'community.wave.seqera.io/library/riker:0.4.0--4e7eeb0beed906c0' }" input: - tuple val(meta), path(bam), path(bai), path(baits, stageAs: 'baits/*'), path(targets, stageAs: 'targets/*') diff --git a/modules/nf-core/riker/multi/tests/main.nf.test.snap b/modules/nf-core/riker/multi/tests/main.nf.test.snap index ddcb045c..4d153a6b 100644 --- a/modules/nf-core/riker/multi/tests/main.nf.test.snap +++ b/modules/nf-core/riker/multi/tests/main.nf.test.snap @@ -98,7 +98,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -109,7 +109,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:14.218483", + "timestamp": "2026-07-06T20:45:42.506133", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -173,7 +173,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -184,7 +184,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:34.577471", + "timestamp": "2026-07-06T20:46:07.676789", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -285,7 +285,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "2": [ @@ -506,7 +506,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -529,7 +529,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:55.911661", + "timestamp": "2026-07-06T20:46:40.6783", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -648,7 +648,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -671,7 +671,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:24.050675", + "timestamp": "2026-07-06T20:45:55.069603", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -747,7 +747,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -758,7 +758,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:38.560042", + "timestamp": "2026-07-06T20:46:13.97817", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -863,7 +863,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -874,7 +874,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:29.86666", + "timestamp": "2026-07-06T20:46:01.359899", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1017,7 +1017,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -1040,7 +1040,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:46.49651", + "timestamp": "2026-07-06T20:46:27.65229", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1122,7 +1122,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -1133,7 +1133,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:42.518635", + "timestamp": "2026-07-06T20:46:20.402347", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1212,7 +1212,7 @@ [ "RIKER_MULTI", "riker", - "0.3.0" + "0.4.0" ] ], "wgs_coverage": [ @@ -1235,7 +1235,7 @@ ] } ], - "timestamp": "2026-06-25T12:52:19.59208", + "timestamp": "2026-07-06T20:45:48.825587", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" From bf595a9ee54aadbbb6b57e38754da18cfc2136db Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 7 Jul 2026 11:25:11 +0200 Subject: [PATCH 39/62] bump riker, add rna support, nextflow lint --- conf/containers_conda_lock_files_amd64.config | 12 +- conf/containers_conda_lock_files_arm64.config | 12 +- conf/containers_docker_amd64.config | 12 +- conf/containers_docker_arm64.config | 12 +- .../containers_singularity_https_amd64.config | 12 +- .../containers_singularity_https_arm64.config | 12 +- conf/containers_singularity_oras_amd64.config | 12 +- conf/containers_singularity_oras_arm64.config | 12 +- conf/modules.config | 12 +- conf/test.config | 2 +- main.nf | 202 +++++++----- modules.json | 2 +- modules/local/fgumi/snapzipsort/main.nf | 2 +- modules/nf-core/riker/multi/main.nf | 61 ++-- modules/nf-core/riker/multi/meta.yml | 175 +++++++--- modules/nf-core/riker/multi/riker-multi.diff | 19 +- .../nf-core/riker/multi/tests/main.nf.test | 158 +++++++-- .../riker/multi/tests/main.nf.test.snap | 305 +++++++++++++++--- subworkflows/local/bam_qc/main.nf | 139 ++++---- subworkflows/local/fastq_align_rna/main.nf | 4 +- .../local/fastq_to_aligned_cram/main.nf | 12 +- .../local/fastq_umiconsensus_fgumi/main.nf | 28 +- .../main.nf | 2 +- tests/subworkflows/local/bam_qc/main.nf.test | 15 +- .../local/bam_qc/main.nf.test.snap | 70 +++- tests/workflows/preprocessing.nf.test.snap | 42 ++- workflows/preprocessing.nf | 115 +++---- 27 files changed, 1057 insertions(+), 404 deletions(-) diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config index 1280a9e1..6271f94a 100644 --- a/conf/containers_conda_lock_files_amd64.config +++ b/conf/containers_conda_lock_files_amd64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' } } -process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt' } } +process { + withName: MULTIQC { + container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' + } +} +process { + withName: MULTIQCSAV { + container = 'modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt' + } +} diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config index d08dd327..b3dce38a 100644 --- a/conf/containers_conda_lock_files_arm64.config +++ b/conf/containers_conda_lock_files_arm64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' } } -process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt' } } +process { + withName: MULTIQC { + container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' + } +} +process { + withName: MULTIQCSAV { + container = 'modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt' + } +} diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config index 00c5e960..38771432 100644 --- a/conf/containers_docker_amd64.config +++ b/conf/containers_docker_amd64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc' } } -process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9b10d606ce2f36b6' } } +process { + withName: MULTIQC { + container = 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc' + } +} +process { + withName: MULTIQCSAV { + container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9b10d606ce2f36b6' + } +} diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config index 14270ce7..f670be39 100644 --- a/conf/containers_docker_arm64.config +++ b/conf/containers_docker_arm64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5' } } -process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:077315907ed11315' } } +process { + withName: MULTIQC { + container = 'community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5' + } +} +process { + withName: MULTIQCSAV { + container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:077315907ed11315' + } +} diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config index df7923dd..2810c5ee 100644 --- a/conf/containers_singularity_https_amd64.config +++ b/conf/containers_singularity_https_amd64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' } } -process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c1/c1311ac2bfb96d77487985fce321b25bbea85f574f9932b827ed6cafe7f75963/data' } } +process { + withName: MULTIQC { + container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' + } +} +process { + withName: MULTIQCSAV { + container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c1/c1311ac2bfb96d77487985fce321b25bbea85f574f9932b827ed6cafe7f75963/data' + } +} diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config index e486ec26..015e93de 100644 --- a/conf/containers_singularity_https_arm64.config +++ b/conf/containers_singularity_https_arm64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data' } } -process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/05/053f6d8c55b57e04b654070a3bd6eaa90685590158019d35c16092d301b80cb1/data' } } +process { + withName: MULTIQC { + container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data' + } +} +process { + withName: MULTIQCSAV { + container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/05/053f6d8c55b57e04b654070a3bd6eaa90685590158019d35c16092d301b80cb1/data' + } +} diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config index 31457ab0..3fa96080 100644 --- a/conf/containers_singularity_oras_amd64.config +++ b/conf/containers_singularity_oras_amd64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2' } } -process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:a26da1aa4e8d32a6' } } +process { + withName: MULTIQC { + container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2' + } +} +process { + withName: MULTIQCSAV { + container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:a26da1aa4e8d32a6' + } +} diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config index bad6f0f2..0718e57c 100644 --- a/conf/containers_singularity_oras_arm64.config +++ b/conf/containers_singularity_oras_arm64.config @@ -1,2 +1,10 @@ -process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81' } } -process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:d1ed21d66511158d' } } +process { + withName: MULTIQC { + container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81' + } +} +process { + withName: MULTIQCSAV { + container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:d1ed21d66511158d' + } +} diff --git a/conf/modules.config b/conf/modules.config index f2400e1b..841bb789 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -250,7 +250,7 @@ process { } //// FGUMI fastq | SNAP | zipper (step 3a) - withName: 'RAW_FGUMI_SNAPZIPSORT' { + withName: RAW_FGUMI_SNAPZIPSORT { ext.prefix = { "${meta.id}.fgumi" } ext.args2 = { [ @@ -264,7 +264,7 @@ process { meta.readgroup ? "-R \"@RG\\t" + meta.readgroup.findResults { rg -> rg.value?.trim() ? "${rg.key}:${rg.value}" : null }.join("\\t") + "\"" : "", ].join(" ").trim() } - ext.args4 = { + ext.args4 = { [ "--order template-coordinate", "--max-memory ${task.memory.toGiga()}G", @@ -290,7 +290,7 @@ process { } //// FGUMI consensus alignment (step 8) - withName: 'UMI_FGUMI_SNAPZIPSORT' { + withName: UMI_FGUMI_SNAPZIPSORT { ext.prefix = { "${meta.id}.fgumi" } ext.args2 = { [ @@ -304,7 +304,7 @@ process { meta.readgroup ? "-R \"@RG\\t" + meta.readgroup.findResults { rg -> rg.value?.trim() ? "${rg.key}:${rg.value}" : null }.join("\\t") + "\"" : "", ].join(" ").trim() } - ext.args4 = { + ext.args4 = { [ "--order coordinate", "--max-memory ${task.memory.toGiga()}G", @@ -340,7 +340,7 @@ process { //// Riker/multi withName: '.*BAM_QC:RIKER_MULTI' { - ext.args = {"--tools alignment basic gcbias isize" + (meta.roi ? " hybcap" : " wgs")} + ext.args = { "--tools alignment basic gcbias isize" + (meta.roi ? " hybcap" : " wgs") + (meta.sample_type == "RNA" ? " rna" : "") } } //// MD5SUM @@ -378,5 +378,5 @@ process { env { // Set TMPDIR for all modules - TMPDIR = "\$PWD" + TMPDIR = "\$PWD" } diff --git a/conf/test.config b/conf/test.config index 632e9126..0feb22b8 100644 --- a/conf/test.config +++ b/conf/test.config @@ -31,7 +31,7 @@ includeConfig "../tests/config/igenomes_test.config" aws { client { - endpoint = 'https://s3.ugent.be' + endpoint = 'https://s3.ugent.be' s3PathStyleAccess = true } } diff --git a/main.nf b/main.nf index 5e413bd4..55cf77de 100644 --- a/main.nf +++ b/main.nf @@ -146,7 +146,7 @@ workflow { : [file("${projectDir}/assets/multiqc_config.yml", checkIfExists: true)], params.multiqc_logo ? params.multiqc_logo : [], params.multiqc_methods_description ? params.multiqc_methods_description : file("${projectDir}/assets/methods_description_template.yml", checkIfExists: true), - params.outdir + params.outdir, ) // @@ -162,60 +162,64 @@ workflow { ) publish: - demultiplex_reports = PREPROCESSING.out.demultiplex_reports.transpose() - demultiplex_logs = PREPROCESSING.out.demultiplex_logs.transpose() - demultiplex_interop = PREPROCESSING.out.demultiplex_interop.transpose(by: 1) - fastq = PREPROCESSING.out.fastq.transpose() - falco_html = PREPROCESSING.out.falco_html.transpose() - falco_txt = PREPROCESSING.out.falco_txt.transpose() - fastp_json = PREPROCESSING.out.fastp_json - fastp_html = PREPROCESSING.out.fastp_html - crams = PREPROCESSING.out.crams - rna_splice_junctions = PREPROCESSING.out.rna_splice_junctions - rna_junctions = PREPROCESSING.out.rna_junctions - align_reports = PREPROCESSING.out.align_reports - sormadup_metrics = PREPROCESSING.out.sormadup_metrics - mosdepth_global = PREPROCESSING.out.mosdepth_global - mosdepth_summary = PREPROCESSING.out.mosdepth_summary - mosdepth_regions = PREPROCESSING.out.mosdepth_regions - mosdepth_per_base_d4 = PREPROCESSING.out.mosdepth_per_base_d4 - mosdepth_per_base_bed = PREPROCESSING.out.mosdepth_per_base_bed - mosdepth_per_base_csi = PREPROCESSING.out.mosdepth_per_base_csi - mosdepth_regions_bed = PREPROCESSING.out.mosdepth_regions_bed - mosdepth_regions_csi = PREPROCESSING.out.mosdepth_regions_csi - mosdepth_quantized_bed = PREPROCESSING.out.mosdepth_quantized_bed - mosdepth_quantized_csi = PREPROCESSING.out.mosdepth_quantized_csi - mosdepth_thresholds_bed = PREPROCESSING.out.mosdepth_thresholds_bed - mosdepth_thresholds_csi = PREPROCESSING.out.mosdepth_thresholds_csi - samtools_coverage = PREPROCESSING.out.samtools_coverage - panelcoverage = PREPROCESSING.out.panelcoverage - samtools_stats = PREPROCESSING.out.samtools_stats - samtools_flagstat = PREPROCESSING.out.samtools_flagstat - samtools_idxstats = PREPROCESSING.out.samtools_idxstats - riker_alignment_metrics = PREPROCESSING.out.riker_alignment_metrics - riker_base_dist = PREPROCESSING.out.riker_base_dist - riker_mean_qual = PREPROCESSING.out.riker_mean_qual - riker_qual_dist = PREPROCESSING.out.riker_qual_dist - riker_error_mismatch = PREPROCESSING.out.riker_error_mismatch - riker_error_overlap = PREPROCESSING.out.riker_error_overlap - riker_error_indel = PREPROCESSING.out.riker_error_indel - riker_gcbias_detail = PREPROCESSING.out.riker_gcbias_detail - riker_gcbias_summary = PREPROCESSING.out.riker_gcbias_summary - riker_hybcap_metrics = PREPROCESSING.out.riker_hybcap_metrics - riker_hybcap_per_target = PREPROCESSING.out.riker_hybcap_per_target - riker_hybcap_per_base = PREPROCESSING.out.riker_hybcap_per_base - riker_isize_metrics = PREPROCESSING.out.riker_isize_metrics - riker_isize_histogram = PREPROCESSING.out.riker_isize_histogram - riker_wgs_metrics = PREPROCESSING.out.riker_wgs_metrics - riker_wgs_coverage = PREPROCESSING.out.riker_wgs_coverage - riker_pdf = PREPROCESSING.out.riker_pdf - md5sums = PREPROCESSING.out.md5sums - multiqc_report = PREPROCESSING.out.multiqc_report - multiqc_data = PREPROCESSING.out.multiqc_data - multiqc_plots = PREPROCESSING.out.multiqc_plots - multiqcsav_report = PREPROCESSING.out.multiqcsav_report - multiqcsav_data = PREPROCESSING.out.multiqcsav_data - multiqcsav_plots = PREPROCESSING.out.multiqcsav_plots + demultiplex_reports = PREPROCESSING.out.demultiplex_reports.transpose() + demultiplex_logs = PREPROCESSING.out.demultiplex_logs.transpose() + demultiplex_interop = PREPROCESSING.out.demultiplex_interop.transpose(by: 1) + fastq = PREPROCESSING.out.fastq.transpose() + falco_html = PREPROCESSING.out.falco_html.transpose() + falco_txt = PREPROCESSING.out.falco_txt.transpose() + fastp_json = PREPROCESSING.out.fastp_json + fastp_html = PREPROCESSING.out.fastp_html + crams = PREPROCESSING.out.crams + rna_splice_junctions = PREPROCESSING.out.rna_splice_junctions + rna_junctions = PREPROCESSING.out.rna_junctions + align_reports = PREPROCESSING.out.align_reports + sormadup_metrics = PREPROCESSING.out.sormadup_metrics + mosdepth_global = PREPROCESSING.out.mosdepth_global + mosdepth_summary = PREPROCESSING.out.mosdepth_summary + mosdepth_regions = PREPROCESSING.out.mosdepth_regions + mosdepth_per_base_d4 = PREPROCESSING.out.mosdepth_per_base_d4 + mosdepth_per_base_bed = PREPROCESSING.out.mosdepth_per_base_bed + mosdepth_per_base_csi = PREPROCESSING.out.mosdepth_per_base_csi + mosdepth_regions_bed = PREPROCESSING.out.mosdepth_regions_bed + mosdepth_regions_csi = PREPROCESSING.out.mosdepth_regions_csi + mosdepth_quantized_bed = PREPROCESSING.out.mosdepth_quantized_bed + mosdepth_quantized_csi = PREPROCESSING.out.mosdepth_quantized_csi + mosdepth_thresholds_bed = PREPROCESSING.out.mosdepth_thresholds_bed + mosdepth_thresholds_csi = PREPROCESSING.out.mosdepth_thresholds_csi + samtools_coverage = PREPROCESSING.out.samtools_coverage + panelcoverage = PREPROCESSING.out.panelcoverage + samtools_stats = PREPROCESSING.out.samtools_stats + samtools_flagstat = PREPROCESSING.out.samtools_flagstat + samtools_idxstats = PREPROCESSING.out.samtools_idxstats + riker_alignment_metrics = PREPROCESSING.out.riker_alignment_metrics + riker_base_dist = PREPROCESSING.out.riker_base_dist + riker_mean_qual = PREPROCESSING.out.riker_mean_qual + riker_qual_dist = PREPROCESSING.out.riker_qual_dist + riker_error_mismatch = PREPROCESSING.out.riker_error_mismatch + riker_error_overlap = PREPROCESSING.out.riker_error_overlap + riker_error_indel = PREPROCESSING.out.riker_error_indel + riker_gcbias_detail = PREPROCESSING.out.riker_gcbias_detail + riker_gcbias_summary = PREPROCESSING.out.riker_gcbias_summary + riker_hybcap_metrics = PREPROCESSING.out.riker_hybcap_metrics + riker_hybcap_per_target = PREPROCESSING.out.riker_hybcap_per_target + riker_hybcap_per_base = PREPROCESSING.out.riker_hybcap_per_base + riker_isize_metrics = PREPROCESSING.out.riker_isize_metrics + riker_isize_histogram = PREPROCESSING.out.riker_isize_histogram + riker_wgs_metrics = PREPROCESSING.out.riker_wgs_metrics + riker_wgs_coverage = PREPROCESSING.out.riker_wgs_coverage + riker_pdf = PREPROCESSING.out.riker_pdf + riker_rna_biotype = PREPROCESSING.out.riker_rna_biotype + riker_rna_insert_size_histogram = PREPROCESSING.out.riker_rna_insert_size_histogram + riker_rna_insert_size = PREPROCESSING.out.riker_rna_insert_size + riker_rna_metrics = PREPROCESSING.out.riker_rna_metrics + md5sums = PREPROCESSING.out.md5sums + multiqc_report = PREPROCESSING.out.multiqc_report + multiqc_data = PREPROCESSING.out.multiqc_data + multiqc_plots = PREPROCESSING.out.multiqc_plots + multiqcsav_report = PREPROCESSING.out.multiqcsav_report + multiqcsav_data = PREPROCESSING.out.multiqcsav_data + multiqcsav_plots = PREPROCESSING.out.multiqcsav_plots } output { @@ -372,88 +376,108 @@ output { } riker_alignment_metrics { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_base_dist { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_mean_qual { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_qual_dist { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_error_mismatch { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_error_overlap { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_error_indel { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_gcbias_detail { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_gcbias_summary { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_hybcap_metrics { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_hybcap_per_target { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_hybcap_per_base { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_isize_metrics { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_isize_histogram { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_wgs_metrics { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_wgs_coverage { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } riker_pdf { path { meta, _file -> - return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") - } + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_rna_biotype { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_rna_insert_size_histogram { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_rna_insert_size { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } + } + riker_rna_metrics { + path { meta, _file -> + return (meta.library ? "${meta.library}/${meta.samplename}/" : "${meta.samplename}/") + } } md5sums { path { meta, _file -> diff --git a/modules.json b/modules.json index 3b3c8352..73619772 100644 --- a/modules.json +++ b/modules.json @@ -105,7 +105,7 @@ }, "riker/multi": { "branch": "master", - "git_sha": "d39d55355103c4ba17887e8aea2884c60c74a70e", + "git_sha": "89b094a1b914b1e0844b4c0cc901cda5eddd569b", "installed_by": ["modules"], "patch": "modules/nf-core/riker/multi/riker-multi.diff" }, diff --git a/modules/local/fgumi/snapzipsort/main.nf b/modules/local/fgumi/snapzipsort/main.nf index 71b462f5..88c34893 100644 --- a/modules/local/fgumi/snapzipsort/main.nf +++ b/modules/local/fgumi/snapzipsort/main.nf @@ -1,5 +1,5 @@ process FGUMI_SNAPZIPSORT { - tag "$meta.id" + tag "${meta.id}" label 'process_high' conda "${moduleDir}/environment.yml" diff --git a/modules/nf-core/riker/multi/main.nf b/modules/nf-core/riker/multi/main.nf index cb3a60bb..e557e754 100644 --- a/modules/nf-core/riker/multi/main.nf +++ b/modules/nf-core/riker/multi/main.nf @@ -8,26 +8,30 @@ process RIKER_MULTI { 'community.wave.seqera.io/library/riker:0.4.0--4e7eeb0beed906c0' }" input: - tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) + tuple val(meta), path(bam), path(bai), path(error_vcf), path(error_vcf_idx), path(error_intervals), path(gcbias_exclude_intervals), path(hybcap_baits, stageAs: 'baits/*'), path(hybcap_targets, stageAs: 'targets/*'), path(rna_gene_model), path(rna_ribosomal_intervals), path(wgs_intervals), path(fasta), path(fai) output: - tuple val(meta), path("*.alignment-metrics.txt"), emit: alignment_metrics, optional: true - tuple val(meta), path("*.base-distribution-by-cycle.txt"), emit: base_dist, optional: true - tuple val(meta), path("*.mean-quality-by-cycle.txt"), emit: mean_qual, optional: true - tuple val(meta), path("*.quality-score-distribution.txt"), emit: qual_dist, optional: true - tuple val(meta), path("*.error-mismatch.txt"), emit: error_mismatch, optional: true - tuple val(meta), path("*.error-overlap.txt"), emit: error_overlap, optional: true - tuple val(meta), path("*.error-indel.txt"), emit: error_indel, optional: true - tuple val(meta), path("*.gcbias-detail.txt"), emit: gcbias_detail, optional: true - tuple val(meta), path("*.gcbias-summary.txt"), emit: gcbias_summary, optional: true - tuple val(meta), path("*.hybcap-metrics.txt"), emit: hybcap_metrics, optional: true - tuple val(meta), path("*.hybcap-per-target.txt"), emit: hybcap_per_target, optional: true - tuple val(meta), path("*.hybcap-per-base.txt*"), emit: hybcap_per_base, optional: true - tuple val(meta), path("*.isize-metrics.txt"), emit: isize_metrics, optional: true - tuple val(meta), path("*.isize-histogram.txt"), emit: isize_histogram, optional: true - tuple val(meta), path("*.wgs-metrics.txt"), emit: wgs_metrics, optional: true - tuple val(meta), path("*.wgs-coverage.txt"), emit: wgs_coverage, optional: true - tuple val(meta), path("*.pdf"), emit: pdf, optional: true + tuple val(meta), path("*.alignment-metrics.txt"), emit: alignment_metrics, optional: true + tuple val(meta), path("*.base-distribution-by-cycle.txt"), emit: base_dist, optional: true + tuple val(meta), path("*.error-indel.txt"), emit: error_indel, optional: true + tuple val(meta), path("*.error-mismatch.txt"), emit: error_mismatch, optional: true + tuple val(meta), path("*.error-overlap.txt"), emit: error_overlap, optional: true + tuple val(meta), path("*.gcbias-detail.txt"), emit: gcbias_detail, optional: true + tuple val(meta), path("*.gcbias-summary.txt"), emit: gcbias_summary, optional: true + tuple val(meta), path("*.hybcap-metrics.txt"), emit: hybcap_metrics, optional: true + tuple val(meta), path("*.hybcap-per-base.txt*"), emit: hybcap_per_base, optional: true + tuple val(meta), path("*.hybcap-per-target.txt"), emit: hybcap_per_target, optional: true + tuple val(meta), path("*.isize-histogram.txt"), emit: isize_histogram, optional: true + tuple val(meta), path("*.isize-metrics.txt"), emit: isize_metrics, optional: true + tuple val(meta), path("*.mean-quality-by-cycle.txt"), emit: mean_qual, optional: true + tuple val(meta), path("*.pdf"), emit: pdf, optional: true + tuple val(meta), path("*.quality-score-distribution.txt"), emit: qual_dist, optional: true + tuple val(meta), path("*.rna-biotype.txt"), emit: rna_biotype, optional: true + tuple val(meta), path("*.rna-insert-size-histogram.txt"), emit: rna_insert_size_histogram, optional: true + tuple val(meta), path("*.rna-insert-size.txt"), emit: rna_insert_size, optional: true + tuple val(meta), path("*.rna-metrics.txt"), emit: rna_metrics, optional: true + tuple val(meta), path("*.wgs-coverage.txt"), emit: wgs_coverage, optional: true + tuple val(meta), path("*.wgs-metrics.txt"), emit: wgs_metrics, optional: true tuple val("${task.process}"), val('riker'), eval("riker --version 2>&1 | sed 's/riker //'") , topic: versions, emit: versions_riker when: @@ -36,16 +40,31 @@ process RIKER_MULTI { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def ref = fasta ? "-r ${fasta}" : '' - def hybcap_opts = roi ? "--hybcap::baits ${roi} --hybcap::targets ${roi}" : '' + def reference_arg = fasta ? "--reference ${fasta}" : '' + if ((hybcap_baits as Boolean) ^ (hybcap_targets as Boolean)) { + error "RIKER_MULTI: both 'baits' and 'targets' must be provided together, or neither" + } + def error_vcf_arg = error_vcf && error_vcf_idx ? "--error::vcf ${error_vcf}" : '' + def error_intervals_arg = error_intervals ? "--error::intervals ${error_intervals}" : '' + def gcbias_exclude_intervals_arg = gcbias_exclude_intervals ? "--gcbias::exclude-intervals ${gcbias_exclude_intervals}" : '' + def hybcap_opts = (hybcap_baits && hybcap_targets) ? "--hybcap::baits ${hybcap_baits} --hybcap::targets ${hybcap_targets}" : '' + def rna_gene_model_arg = rna_gene_model ? "--rna::gene-model ${rna_gene_model}" : '' + def rna_ribosomal_intervals_arg = rna_ribosomal_intervals ? "--rna::ribosomal-intervals ${rna_ribosomal_intervals}" : '' + def wgs_intervals_arg = wgs_intervals ? "--wgs::intervals ${wgs_intervals}" : '' """ riker multi \\ -i ${bam} \\ - ${ref} \\ + ${reference_arg} \\ -o ${prefix} \\ --threads ${task.cpus} \\ ${hybcap_opts} \\ + ${error_vcf_arg} \\ + ${error_intervals_arg} \\ + ${gcbias_exclude_intervals_arg} \\ + ${rna_gene_model_arg} \\ + ${rna_ribosomal_intervals_arg} \\ + ${wgs_intervals_arg} \\ ${args} """ diff --git a/modules/nf-core/riker/multi/meta.yml b/modules/nf-core/riker/multi/meta.yml index 93066a98..3e980ea8 100644 --- a/modules/nf-core/riker/multi/meta.yml +++ b/modules/nf-core/riker/multi/meta.yml @@ -12,6 +12,7 @@ keywords: - insert size - gc bias - coverage + - rna tools: - riker: description: | @@ -40,18 +41,61 @@ input: pattern: "*.{bai,crai}" ontologies: - edam: "http://edamontology.org/format_3327" # BAI - - baits: + - error_vcf: + type: file + description: VCF file containing known variants for error metrics. Must be bgzipped and indexed. + pattern: "*.vcf.gz" + ontologies: + - edam: "http://edamontology.org/format_3016" # VCF + - error_vcf_idx: + type: file + description: Index for the VCF file. + pattern: "*.vcf..gz.{tbi,csi}" + ontologies: + - edam: "http://edamontology.org/format_3616" # TBI/CSI + - error_intervals: + type: file + description: IntervalList or BED file containing regions to exclude from error metrics. Optional. + pattern: "*.{interval_list,bed}" + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - gcbias_exclude_intervals: + type: file + description: IntervalList or BED file containing regions to exclude from GC bias metrics. Optional. + pattern: "*.{interval_list,bed}" + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - hybcap_baits: type: file description: Bait interval file (IntervalList or BED). Required when running the hybcap tool. Optional otherwise. pattern: "*.{interval_list,bed}" ontologies: - edam: "http://edamontology.org/format_3003" # BED - - targets: + - hybcap_targets: type: file description: Target interval file (IntervalList or BED). Required when running the hybcap tool. Optional otherwise. pattern: "*.{interval_list,bed}" ontologies: - edam: "http://edamontology.org/format_3003" # BED + - rna_gene_model: + type: file + description: GTF or GFF file containing gene models. Required when running the rna tool. Optional otherwise. + pattern: "*.{gtf,gff}" + ontologies: + - edam: "http://edamontology.org/format_2306" # GTF + - edam: "http://edamontology.org/format_1975" # GFF + - rna_ribosomal_intervals: + type: file + description: Explicit ribosomal intervals (BED or Picard IntervalList), unioned with biotype-derived rRNA genes from the gene model + pattern: "*.{interval_list,bed}" + ontologies: + - edam: "http://edamontology.org/format_3003" # BED + - wgs_intervals: + type: file + description: IntervalList or BED file containing intervals for whole-genome coverage metrics. Required when running the wgs tool. Optional otherwise. + pattern: "*.{interval_list,bed}" + ontologies: + - edam: "http://edamontology.org/format_3003" # BED - - meta2: type: map description: | @@ -90,24 +134,14 @@ output: pattern: "*.base-distribution-by-cycle.txt" ontologies: - edam: "http://edamontology.org/format_3475" # TSV - mean_qual: - - - meta: - type: map - description: Groovy Map containing sample information - - "*.mean-quality-by-cycle.txt": - type: file - description: Mean quality by cycle (basic tool) - pattern: "*.mean-quality-by-cycle.txt" - ontologies: - - edam: "http://edamontology.org/format_3475" # TSV - qual_dist: + error_indel: - - meta: type: map description: Groovy Map containing sample information - - "*.quality-score-distribution.txt": + - "*.error-indel.txt": type: file - description: Quality score distribution (basic tool) - pattern: "*.quality-score-distribution.txt" + description: Indel error metrics (error tool) + pattern: "*.error-indel.txt" ontologies: - edam: "http://edamontology.org/format_3475" # TSV error_mismatch: @@ -130,16 +164,6 @@ output: pattern: "*.error-overlap.txt" ontologies: - edam: "http://edamontology.org/format_3475" # TSV - error_indel: - - - meta: - type: map - description: Groovy Map containing sample information - - "*.error-indel.txt": - type: file - description: Indel error metrics (error tool) - pattern: "*.error-indel.txt" - ontologies: - - edam: "http://edamontology.org/format_3475" # TSV gcbias_detail: - - meta: type: map @@ -170,24 +194,24 @@ output: pattern: "*.hybcap-metrics.txt" ontologies: - edam: "http://edamontology.org/format_3475" # TSV - hybcap_per_target: + hybcap_per_base: - - meta: type: map description: Groovy Map containing sample information - - "*.hybcap-per-target.txt": + - "*.hybcap-per-base.txt*": type: file - description: Per-target coverage metrics (hybcap tool, optional) - pattern: "*.hybcap-per-target.txt" + description: Per-base coverage values (hybcap tool, optional) + pattern: "*.hybcap-per-base.txt{,.gz}" ontologies: - edam: "http://edamontology.org/format_3475" # TSV - hybcap_per_base: + hybcap_per_target: - - meta: type: map description: Groovy Map containing sample information - - "*.hybcap-per-base.txt*": + - "*.hybcap-per-target.txt": type: file - description: Per-base coverage values (hybcap tool, optional) - pattern: "*.hybcap-per-base.txt{,.gz}" + description: Per-target coverage metrics (hybcap tool, optional) + pattern: "*.hybcap-per-target.txt" ontologies: - edam: "http://edamontology.org/format_3475" # TSV isize_metrics: @@ -210,6 +234,76 @@ output: pattern: "*.isize-histogram.txt" ontologies: - edam: "http://edamontology.org/format_3475" # TSV + mean_qual: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.mean-quality-by-cycle.txt": + type: file + description: Mean quality by cycle (basic tool) + pattern: "*.mean-quality-by-cycle.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + pdf: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.pdf": + type: file + description: PDF plots from any tool that generates them + pattern: "*.pdf" + ontologies: + - edam: "http://edamontology.org/format_3508" # PDF + qual_dist: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.quality-score-distribution.txt": + type: file + description: Quality score distribution (basic tool) + pattern: "*.quality-score-distribution.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + rna_biotype: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.rna-biotype.txt": + type: file + description: RNA biotype metrics (rna tool) + pattern: "*.rna-biotype.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + rna_insert_size: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.rna-insert-size.txt": + type: file + description: RNA insert size metrics (rna tool) + pattern: "*.rna-insert-size.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + rna_insert_size_histogram: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.rna-insert-size-histogram.txt": + type: file + description: RNA insert size histogram (rna tool) + pattern: "*.rna-insert-size-histogram.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV + rna_metrics: + - - meta: + type: map + description: Groovy Map containing sample information + - "*.rna-metrics.txt": + type: file + description: RNA summary metrics (rna tool) + pattern: "*.rna-metrics.txt" + ontologies: + - edam: "http://edamontology.org/format_3475" # TSV wgs_metrics: - - meta: type: map @@ -230,16 +324,6 @@ output: pattern: "*.wgs-coverage.txt" ontologies: - edam: "http://edamontology.org/format_3475" # TSV - pdf: - - - meta: - type: map - description: Groovy Map containing sample information - - "*.pdf": - type: file - description: PDF plots from any tool that generates them - pattern: "*.pdf" - ontologies: - - edam: "http://edamontology.org/format_3508" # PDF versions_riker: - - ${task.process}: type: string @@ -263,5 +347,8 @@ topics: description: The expression to obtain the version of the tool authors: - "@emmcauley" + - "@matthdsm" + - "@tfenne" maintainers: - "@emmcauley" + - "@matthdsm" diff --git a/modules/nf-core/riker/multi/riker-multi.diff b/modules/nf-core/riker/multi/riker-multi.diff index 0323a195..ca626a12 100644 --- a/modules/nf-core/riker/multi/riker-multi.diff +++ b/modules/nf-core/riker/multi/riker-multi.diff @@ -8,25 +8,12 @@ Changes in 'riker/multi/main.nf': 'community.wave.seqera.io/library/riker:0.4.0--4e7eeb0beed906c0' }" input: -- tuple val(meta), path(bam), path(bai), path(baits, stageAs: 'baits/*'), path(targets, stageAs: 'targets/*') +- tuple val(meta), path(bam), path(bai), path(error_vcf), path(error_vcf_idx), path(error_intervals), path(gcbias_exclude_intervals), path(hybcap_baits, stageAs: 'baits/*'), path(hybcap_targets, stageAs: 'targets/*'), path(rna_gene_model), path(rna_ribosomal_intervals), path(wgs_intervals) - tuple val(meta2), path(fasta), path(fai) -+ tuple val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai) ++ tuple val(meta), path(bam), path(bai), path(error_vcf), path(error_vcf_idx), path(error_intervals), path(gcbias_exclude_intervals), path(hybcap_baits, stageAs: 'baits/*'), path(hybcap_targets, stageAs: 'targets/*'), path(rna_gene_model), path(rna_ribosomal_intervals), path(wgs_intervals), path(fasta), path(fai) output: - tuple val(meta), path("*.alignment-metrics.txt"), emit: alignment_metrics, optional: true -@@ -38,10 +37,8 @@ - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def ref = fasta ? "-r ${fasta}" : '' -- if ((baits as Boolean) ^ (targets as Boolean)) { -- error "RIKER_MULTI: both 'baits' and 'targets' must be provided together, or neither" -- } -- def hybcap_opts = (baits && targets) ? "--hybcap::baits ${baits} --hybcap::targets ${targets}" : '' -+ def hybcap_opts = roi ? "--hybcap::baits ${roi} --hybcap::targets ${roi}" : '' -+ - """ - riker multi \\ - -i ${bam} \\ + tuple val(meta), path("*.alignment-metrics.txt"), emit: alignment_metrics, optional: true 'modules/nf-core/riker/multi/tests/main.nf.test.snap' is unchanged 'modules/nf-core/riker/multi/tests/nextflow.config' is unchanged diff --git a/modules/nf-core/riker/multi/tests/main.nf.test b/modules/nf-core/riker/multi/tests/main.nf.test index 616c9db3..3b7b6db0 100644 --- a/modules/nf-core/riker/multi/tests/main.nf.test +++ b/modules/nf-core/riker/multi/tests/main.nf.test @@ -19,11 +19,18 @@ nextflow_process { process { """ input[0] = [ - [ id:'test', single_end:false ], - 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), - [], - [] + [ id:'test', single_end:false ], // meta + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), // bam + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true), // bai + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [[],[],[]] """ @@ -50,8 +57,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), - [], - [] + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [ [ id:'genome' ], @@ -82,8 +96,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), - [], - [] + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [ [ id:'genome' ], @@ -114,8 +135,15 @@ nextflow_process { [ id:'test', single_end:false ], file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true), - [], - [] + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [ [ id:'genome' ], @@ -146,8 +174,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), // hybcap_baits + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true), // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [ [ id:'genome' ], @@ -178,8 +213,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), - [], - [] + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [ [ id:'genome' ], @@ -210,8 +252,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), - [], - [] + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [ [ id:'genome' ], @@ -242,8 +291,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true), + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [ [ id:'genome' ], @@ -273,9 +329,15 @@ nextflow_process { input[0] = [ [ id:'test', single_end:false ], 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), + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/baits.interval_list', checkIfExists: true), - [] + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [[],[],[]] """ @@ -299,8 +361,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), - [], - file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true) + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/picard/targets.interval_list', checkIfExists: true), + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [[],[],[]] """ @@ -312,6 +381,40 @@ nextflow_process { } } + test("homo_sapiens - paired_end - bam - rna") { + when { + params { + module_args = '--tools rna' + } + process { + """ + input[0] = [ + [ id:'test', single_end:false ], + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.rna.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/bam/test.rna.paired_end.sorted.bam.bai', checkIfExists: true), + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.gff3', checkIfExists: true), + [], // rna_ribosomal_intervals + [] // wgs_intervals + ] + input[1] = [[],[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(sanitizeOutput(process.out, unstableKeys: ["pdf","rna_biotype","rna_insert_size_histogram"])).match() } + ) + } + } + test("sarscov2 - paired_end - bam - stub") { options "-stub" @@ -326,8 +429,15 @@ nextflow_process { [ id:'test', single_end:false ], 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), - [], - [] + [], // error_vcf + [], // error_vcf_idx + [], // error_intervals + [], // gcbias_exclude_intervals + [], // hybcap_baits + [], // hybcap_targets + [], // rna_gene_model + [], // rna_ribosomal_intervals + [] // wgs_intervals ] input[1] = [[],[],[]] """ diff --git a/modules/nf-core/riker/multi/tests/main.nf.test.snap b/modules/nf-core/riker/multi/tests/main.nf.test.snap index 4d153a6b..8fafc3b9 100644 --- a/modules/nf-core/riker/multi/tests/main.nf.test.snap +++ b/modules/nf-core/riker/multi/tests/main.nf.test.snap @@ -93,6 +93,18 @@ }, "test.quality-score-distribution.txt:md5,d5f17682727e31f05dc8b29b7c06b3ab" ] + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -109,7 +121,7 @@ ] } ], - "timestamp": "2026-07-06T20:45:42.506133", + "timestamp": "2026-07-07T09:44:52.527265", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -168,6 +180,18 @@ ], "qual_dist": [ + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -184,61 +208,145 @@ ] } ], - "timestamp": "2026-07-06T20:46:07.676789", + "timestamp": "2026-07-07T09:26:06.548242", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" } }, - "sarscov2 - paired_end - bam - stub": { + "homo_sapiens - paired_end - bam - rna": { "content": [ { - "0": [ + "alignment_metrics": [ + + ], + "base_dist": [ + + ], + "error_indel": [ + + ], + "error_mismatch": [ + + ], + "error_overlap": [ + + ], + "gcbias_detail": [ + + ], + "gcbias_summary": [ + + ], + "hybcap_metrics": [ + + ], + "hybcap_per_base": [ + + ], + "hybcap_per_target": [ + + ], + "isize_histogram": [ + + ], + "isize_metrics": [ + + ], + "mean_qual": [ + + ], + "pdf": [ [ { "id": "test", "single_end": false }, - "test.alignment-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.rna-coverage.pdf" ] ], - "1": [ + "qual_dist": [ + + ], + "rna_biotype": [ [ { "id": "test", "single_end": false }, - "test.base-distribution-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.rna-biotype.txt" ] ], - "10": [ + "rna_insert_size": [ [ { "id": "test", "single_end": false }, - "test.hybcap-per-target.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.rna-insert-size.txt:md5,1ba71842d0e1f52b9a92067126ed5ec1" ] ], - "11": [ + "rna_insert_size_histogram": [ [ { "id": "test", "single_end": false }, - "test.hybcap-per-base.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.rna-insert-size-histogram.txt" ] ], - "12": [ + "rna_metrics": [ [ { "id": "test", "single_end": false }, - "test.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.rna-metrics.txt:md5,bf9772f8a31ded0f3e7e3102204394cd" ] ], - "13": [ + "versions_riker": [ + [ + "RIKER_MULTI", + "riker", + "0.4.0" + ] + ], + "wgs_coverage": [ + + ], + "wgs_metrics": [ + + ] + } + ], + "timestamp": "2026-07-07T10:27:34.959307", + "meta": { + "nf-test": "0.9.5", + "nextflow": "26.04.4" + } + }, + "sarscov2 - paired_end - bam - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.alignment-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "test.base-distribution-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ [ { "id": "test", @@ -247,25 +355,25 @@ "test.isize-histogram.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "14": [ + "11": [ [ { "id": "test", "single_end": false }, - "test.wgs-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.isize-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "15": [ + "12": [ [ { "id": "test", "single_end": false }, - "test.wgs-coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.mean-quality-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "16": [ + "13": [ [ { "id": "test", @@ -280,12 +388,35 @@ "test.wgs-coverage.pdf:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] + ], + "14": [ + [ + { + "id": "test", + "single_end": false + }, + "test.quality-score-distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "15": [ + + ], + "16": [ + ], "17": [ + + ], + "18": [ + + ], + "19": [ [ - "RIKER_MULTI", - "riker", - "0.4.0" + { + "id": "test", + "single_end": false + }, + "test.wgs-coverage.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "2": [ @@ -294,7 +425,23 @@ "id": "test", "single_end": false }, - "test.mean-quality-by-cycle.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.error-indel.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "20": [ + [ + { + "id": "test", + "single_end": false + }, + "test.wgs-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "21": [ + [ + "RIKER_MULTI", + "riker", + "0.4.0" ] ], "3": [ @@ -303,7 +450,7 @@ "id": "test", "single_end": false }, - "test.quality-score-distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.error-mismatch.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "4": [ @@ -312,7 +459,7 @@ "id": "test", "single_end": false }, - "test.error-mismatch.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.error-overlap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "5": [ @@ -321,7 +468,7 @@ "id": "test", "single_end": false }, - "test.error-overlap.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.gcbias-detail.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "6": [ @@ -330,7 +477,7 @@ "id": "test", "single_end": false }, - "test.error-indel.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.gcbias-summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "7": [ @@ -339,7 +486,7 @@ "id": "test", "single_end": false }, - "test.gcbias-detail.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.hybcap-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "8": [ @@ -348,7 +495,7 @@ "id": "test", "single_end": false }, - "test.gcbias-summary.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.hybcap-per-base.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "9": [ @@ -357,7 +504,7 @@ "id": "test", "single_end": false }, - "test.hybcap-metrics.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.hybcap-per-target.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "alignment_metrics": [ @@ -501,6 +648,18 @@ }, "test.quality-score-distribution.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -529,7 +688,7 @@ ] } ], - "timestamp": "2026-07-06T20:46:40.6783", + "timestamp": "2026-07-07T09:45:41.308154", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -643,6 +802,18 @@ }, "test.quality-score-distribution.txt:md5,d5f17682727e31f05dc8b29b7c06b3ab" ] + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -671,7 +842,7 @@ ] } ], - "timestamp": "2026-07-06T20:45:55.069603", + "timestamp": "2026-07-07T09:25:55.275289", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -742,6 +913,18 @@ ], "qual_dist": [ + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -758,7 +941,7 @@ ] } ], - "timestamp": "2026-07-06T20:46:13.97817", + "timestamp": "2026-07-07T09:26:11.118178", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -858,6 +1041,18 @@ }, "test.quality-score-distribution.txt:md5,1e4ceaf9de78390f1f542eec5dc7275f" ] + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -874,7 +1069,7 @@ ] } ], - "timestamp": "2026-07-06T20:46:01.359899", + "timestamp": "2026-07-07T09:26:01.234753", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1012,6 +1207,18 @@ }, "test.quality-score-distribution.txt:md5,d5f17682727e31f05dc8b29b7c06b3ab" ] + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -1040,7 +1247,7 @@ ] } ], - "timestamp": "2026-07-06T20:46:27.65229", + "timestamp": "2026-07-07T09:26:20.013113", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1117,6 +1324,18 @@ ], "qual_dist": [ + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -1133,7 +1352,7 @@ ] } ], - "timestamp": "2026-07-06T20:46:20.402347", + "timestamp": "2026-07-07T09:26:15.635157", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1207,6 +1426,18 @@ ], "qual_dist": [ + ], + "rna_biotype": [ + + ], + "rna_insert_size": [ + + ], + "rna_insert_size_histogram": [ + + ], + "rna_metrics": [ + ], "versions_riker": [ [ @@ -1235,7 +1466,7 @@ ] } ], - "timestamp": "2026-07-06T20:45:48.825587", + "timestamp": "2026-07-07T09:25:50.544718", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/subworkflows/local/bam_qc/main.nf b/subworkflows/local/bam_qc/main.nf index 01f51b91..b09123e1 100644 --- a/subworkflows/local/bam_qc/main.nf +++ b/subworkflows/local/bam_qc/main.nf @@ -8,55 +8,79 @@ include { SAMTOOLS_STATS } from '../../../modules/nf-core/samtools/stats/main workflow BAM_QC { take: - ch_bam_bai_roi_fasta_fai // channel: [ val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai)] + ch_bam_bai_roi_fasta_fai_gtf // channel: [ val(meta), path(bam), path(bai), path(roi), path(fasta), path(fai), path(gtf)] ch_genelists // channel: [optional] [genelists] main: - ch_bam_bai_roi_fasta_fai - .map { meta, bam, bai, _roi, fasta, fai -> + ch_bam_bai_roi_fasta_fai_gtf + .map { meta, bam, bai, _roi, fasta, fai, _gtf -> return [meta, bam, bai, fasta, fai] } .set { ch_bam_bai_fasta_fai } // basic QC - SAMTOOLS_FLAGSTAT(ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> - return [meta, bam, bai] - }) - SAMTOOLS_IDXSTATS(ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> - return [meta, bam, bai] - }) + SAMTOOLS_FLAGSTAT( + ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> + return [meta, bam, bai] + } + ) + SAMTOOLS_IDXSTATS( + ch_bam_bai_fasta_fai.map { meta, bam, bai, _fasta, _fai -> + return [meta, bam, bai] + } + ) MOSDEPTH( - ch_bam_bai_roi_fasta_fai.map { meta, bam, bai, roi, fasta, _fai -> + ch_bam_bai_roi_fasta_fai_gtf.map { meta, bam, bai, roi, fasta, _fai, _gtf -> return [meta, bam, bai, roi, fasta] }, - ['NO_COVERAGE', 'LOW_COVERAGE', 'CALLABLE'] + ['NO_COVERAGE', 'LOW_COVERAGE', 'CALLABLE'], ) // full QC // Only run on samples requiring full QC - ch_full_qc = ch_bam_bai_roi_fasta_fai.filter { meta, _bam, _bai, _roi, _fasta, _fai -> + ch_full_qc = ch_bam_bai_roi_fasta_fai_gtf.filter { meta, _bam, _bai, _roi, _fasta, _fai, _gtf -> meta.qc_mode == "full" } - SAMTOOLS_STATS(ch_full_qc.map { meta, bam, bai, _roi, fasta, fai -> - return [meta, bam, bai, fasta, fai] - }) + SAMTOOLS_STATS( + ch_full_qc.map { meta, bam, bai, _roi, fasta, fai, _gtf -> + return [meta, bam, bai, fasta, fai] + } + ) - RIKER_MULTI(ch_full_qc) + + // RIKER_MULTI (meta, bam, bai, error_vcf, error_vcf_idx, error_intervals, gcbias_exclude_intervals, hybcap_baits, hybcap_targets, rna_gene_model, rna_ribosomal_intervals, wgs_intervals, fasta, fai) + RIKER_MULTI( + ch_full_qc.map { meta, bam, bai, roi, fasta, fai, gtf -> + return [ + meta, + bam, + bai, + [], + [], + [], + [], + roi, + roi, + gtf, + [], + [], + fasta, + fai, + ] + } + ) SAMTOOLS_COVERAGE( - ch_full_qc.map { meta, bam, bai, _roi, fasta, fai -> + ch_full_qc.map { meta, bam, bai, _roi, fasta, fai, _gtf -> return [meta, bam, bai, fasta, fai] } ) PANELCOVERAGE( - MOSDEPTH.out.per_base_bed.join(MOSDEPTH.out.per_base_csi) - .combine(ch_genelists) - .filter{ meta, _bed, _index, _genelists -> meta.qc_mode == "full" } - .map { meta, bed, index, genelists -> + MOSDEPTH.out.per_base_bed.join(MOSDEPTH.out.per_base_csi).combine(ch_genelists).filter { meta, _bed, _index, _genelists -> meta.qc_mode == "full" }.map { meta, bed, index, genelists -> // Because groovy typing sucks ass; apparently an array of 1 is automatically converted to a string... if (genelists !instanceof List) { genelists = [genelists] @@ -76,40 +100,43 @@ workflow BAM_QC { } ) - emit: - mosdepth_global = MOSDEPTH.out.global_txt - mosdepth_per_base_bed = MOSDEPTH.out.per_base_bed - mosdepth_per_base_csi = MOSDEPTH.out.per_base_csi - mosdepth_per_base_d4 = MOSDEPTH.out.per_base_d4 - mosdepth_quantized_bed = MOSDEPTH.out.quantized_bed - mosdepth_quantized_csi = MOSDEPTH.out.quantized_csi - mosdepth_regions = MOSDEPTH.out.regions_txt - mosdepth_regions_bed = MOSDEPTH.out.regions_bed - mosdepth_regions_csi = MOSDEPTH.out.regions_csi - mosdepth_summary = MOSDEPTH.out.summary_txt - mosdepth_thresholds_bed = MOSDEPTH.out.thresholds_bed - mosdepth_thresholds_csi = MOSDEPTH.out.thresholds_csi - panelcoverage = PANELCOVERAGE.out.regiondist - riker_alignment_metrics = RIKER_MULTI.out.alignment_metrics - riker_base_dist = RIKER_MULTI.out.base_dist - riker_mean_qual = RIKER_MULTI.out.mean_qual - riker_qual_dist = RIKER_MULTI.out.qual_dist - riker_error_mismatch = RIKER_MULTI.out.error_mismatch - riker_error_overlap = RIKER_MULTI.out.error_overlap - riker_error_indel = RIKER_MULTI.out.error_indel - riker_gcbias_detail = RIKER_MULTI.out.gcbias_detail - riker_gcbias_summary = RIKER_MULTI.out.gcbias_summary - riker_hybcap_metrics = RIKER_MULTI.out.hybcap_metrics - riker_hybcap_per_target = RIKER_MULTI.out.hybcap_per_target - riker_hybcap_per_base = RIKER_MULTI.out.hybcap_per_base - riker_isize_metrics = RIKER_MULTI.out.isize_metrics - riker_isize_histogram = RIKER_MULTI.out.isize_histogram - riker_wgs_metrics = RIKER_MULTI.out.wgs_metrics - riker_wgs_coverage = RIKER_MULTI.out.wgs_coverage - riker_pdf = RIKER_MULTI.out.pdf - samtools_coverage = SAMTOOLS_COVERAGE.out.coverage - samtools_flagstat = SAMTOOLS_FLAGSTAT.out.flagstat - samtools_idxstats = SAMTOOLS_IDXSTATS.out.idxstats - samtools_stats = SAMTOOLS_STATS.out.stats + mosdepth_global = MOSDEPTH.out.global_txt + mosdepth_per_base_bed = MOSDEPTH.out.per_base_bed + mosdepth_per_base_csi = MOSDEPTH.out.per_base_csi + mosdepth_per_base_d4 = MOSDEPTH.out.per_base_d4 + mosdepth_quantized_bed = MOSDEPTH.out.quantized_bed + mosdepth_quantized_csi = MOSDEPTH.out.quantized_csi + mosdepth_regions = MOSDEPTH.out.regions_txt + mosdepth_regions_bed = MOSDEPTH.out.regions_bed + mosdepth_regions_csi = MOSDEPTH.out.regions_csi + mosdepth_summary = MOSDEPTH.out.summary_txt + mosdepth_thresholds_bed = MOSDEPTH.out.thresholds_bed + mosdepth_thresholds_csi = MOSDEPTH.out.thresholds_csi + panelcoverage = PANELCOVERAGE.out.regiondist + riker_alignment_metrics = RIKER_MULTI.out.alignment_metrics + riker_base_dist = RIKER_MULTI.out.base_dist + riker_mean_qual = RIKER_MULTI.out.mean_qual + riker_qual_dist = RIKER_MULTI.out.qual_dist + riker_error_mismatch = RIKER_MULTI.out.error_mismatch + riker_error_overlap = RIKER_MULTI.out.error_overlap + riker_error_indel = RIKER_MULTI.out.error_indel + riker_gcbias_detail = RIKER_MULTI.out.gcbias_detail + riker_gcbias_summary = RIKER_MULTI.out.gcbias_summary + riker_hybcap_metrics = RIKER_MULTI.out.hybcap_metrics + riker_hybcap_per_target = RIKER_MULTI.out.hybcap_per_target + riker_hybcap_per_base = RIKER_MULTI.out.hybcap_per_base + riker_isize_metrics = RIKER_MULTI.out.isize_metrics + riker_isize_histogram = RIKER_MULTI.out.isize_histogram + riker_wgs_metrics = RIKER_MULTI.out.wgs_metrics + riker_wgs_coverage = RIKER_MULTI.out.wgs_coverage + riker_pdf = RIKER_MULTI.out.pdf + riker_rna_biotype = RIKER_MULTI.out.rna_biotype + riker_rna_insert_size_histogram = RIKER_MULTI.out.rna_insert_size_histogram + riker_rna_insert_size = RIKER_MULTI.out.rna_insert_size + riker_rna_metrics = RIKER_MULTI.out.rna_metrics + samtools_coverage = SAMTOOLS_COVERAGE.out.coverage + samtools_flagstat = SAMTOOLS_FLAGSTAT.out.flagstat + samtools_idxstats = SAMTOOLS_IDXSTATS.out.idxstats + samtools_stats = SAMTOOLS_STATS.out.stats } diff --git a/subworkflows/local/fastq_align_rna/main.nf b/subworkflows/local/fastq_align_rna/main.nf index d24c03b1..ef3f5c8c 100644 --- a/subworkflows/local/fastq_align_rna/main.nf +++ b/subworkflows/local/fastq_align_rna/main.nf @@ -41,9 +41,9 @@ workflow FASTQ_ALIGN_RNA { ) // Concatenate splice junction files - SORT_MERGE_SPLICE_JUNCTIONS(group_junctions(STAR_ALIGN.out.spl_junc_tab).map { meta, files -> [meta, files, "tab"]}) + SORT_MERGE_SPLICE_JUNCTIONS(group_junctions(STAR_ALIGN.out.spl_junc_tab).map { meta, files -> [meta, files, "tab"] }) // Concatenate junction files - SORT_MERGE_JUNCTIONS(group_junctions(STAR_ALIGN.out.junction).map { meta, files -> [meta, files, "junction"]}) + SORT_MERGE_JUNCTIONS(group_junctions(STAR_ALIGN.out.junction).map { meta, files -> [meta, files, "junction"] }) emit: bam = ch_bam // channel: [ [meta], bam ] diff --git a/subworkflows/local/fastq_to_aligned_cram/main.nf b/subworkflows/local/fastq_to_aligned_cram/main.nf index 029500da..30a7f2cb 100644 --- a/subworkflows/local/fastq_to_aligned_cram/main.nf +++ b/subworkflows/local/fastq_to_aligned_cram/main.nf @@ -5,10 +5,10 @@ // // MODULES -include { BIOBAMBAM_BAMSORMADUP } from "../../../modules/nf-core/biobambam/bamsormadup/main.nf" -include { SAMTOOLS_CONVERT } from "../../../modules/nf-core/samtools/convert/main" -include { SAMTOOLS_SORMADUP } from "../../../modules/nf-core/samtools/sormadup/main.nf" -include { SAMTOOLS_SORT } from "../../../modules/nf-core/samtools/sort/main" +include { BIOBAMBAM_BAMSORMADUP } from "../../../modules/nf-core/biobambam/bamsormadup/main.nf" +include { SAMTOOLS_CONVERT } from "../../../modules/nf-core/samtools/convert/main" +include { SAMTOOLS_SORMADUP } from "../../../modules/nf-core/samtools/sormadup/main.nf" +include { SAMTOOLS_SORT } from "../../../modules/nf-core/samtools/sort/main" // SUBWORKFLOWS include { FASTQ_ALIGN_DNA } from '../../nf-core/fastq_align_dna/main' @@ -16,7 +16,7 @@ include { FASTQ_ALIGN_RNA } from '../../local/fastq_align_rna/main' include { FASTQ_UMICONSENSUS_FGUMI } from '../fastq_umiconsensus_fgumi/main.nf' // FUNCTIONS -include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' +include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' workflow FASTQ_TO_CRAM { take: @@ -130,7 +130,7 @@ workflow FASTQ_TO_CRAM { */ ch_markdup_index - .mix(FASTQ_UMICONSENSUS_FGUMI.out.bam) // no markdup for FGUMI as this is already solved by the tooling itself + .mix(FASTQ_UMICONSENSUS_FGUMI.out.bam) .branch { meta, reads, index -> bam: reads.getExtension() == "bam" return [meta, reads, index] diff --git a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf index 20cc8779..e2416f9b 100644 --- a/subworkflows/local/fastq_umiconsensus_fgumi/main.nf +++ b/subworkflows/local/fastq_umiconsensus_fgumi/main.nf @@ -1,17 +1,17 @@ #!/usr/bin/env nextflow // MODULES -include { FGUMI_EXTRACT } from "../../../modules/nf-core/fgumi/extract/main.nf" -include { FGUMI_FILTER } from "../../../modules/nf-core/fgumi/filter/main.nf" -include { FGUMI_GROUP } from "../../../modules/nf-core/fgumi/group/main.nf" -include { FGUMI_MERGE } from "../../../modules/nf-core/fgumi/merge/main.nf" -include { FGUMI_SIMPLEX } from "../../../modules/nf-core/fgumi/simplex/main.nf" +include { FGUMI_EXTRACT } from "../../../modules/nf-core/fgumi/extract/main.nf" +include { FGUMI_FILTER } from "../../../modules/nf-core/fgumi/filter/main.nf" +include { FGUMI_GROUP } from "../../../modules/nf-core/fgumi/group/main.nf" +include { FGUMI_MERGE } from "../../../modules/nf-core/fgumi/merge/main.nf" +include { FGUMI_SIMPLEX } from "../../../modules/nf-core/fgumi/simplex/main.nf" include { FGUMI_SNAPZIPSORT as RAW_FGUMI_SNAPZIPSORT } from "../../../modules/local/fgumi/snapzipsort/main.nf" include { FGUMI_SNAPZIPSORT as UMI_FGUMI_SNAPZIPSORT } from "../../../modules/local/fgumi/snapzipsort/main.nf" // FUNCTIONS -include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' +include { getGenomeAttribute } from '../../local/utils_nfcore_preprocessing_pipeline' workflow FASTQ_UMICONSENSUS_FGUMI { take: @@ -74,23 +74,21 @@ workflow FASTQ_UMICONSENSUS_FGUMI { FGUMI_GROUP( FGUMI_MERGE.out.bam, - 'adjacency' + 'adjacency', ) FGUMI_SIMPLEX( - FGUMI_GROUP.out.bam.map { meta, bams -> [ meta, bams, meta.fgumi_simplex_min_reads ] }, - false + FGUMI_GROUP.out.bam.map { meta, bams -> [meta, bams, meta.fgumi_simplex_min_reads] }, + false, ) // Step 7: filter consensus reads, then coordinate-sort/index for downstream CRAM conversion. FGUMI_FILTER( - FGUMI_SIMPLEX.out.bam - .join(ch_meta_fastqs) - .map { meta, simplex_bams, _fastqs -> - [meta, simplex_bams, getGenomeAttribute(meta.genome_data, 'fasta')] - }, + FGUMI_SIMPLEX.out.bam.join(ch_meta_fastqs).map { meta, simplex_bams, _fastqs -> + [meta, simplex_bams, getGenomeAttribute(meta.genome_data, 'fasta')] + }, '1,1,1', - false + false, ) UMI_FGUMI_SNAPZIPSORT( diff --git a/subworkflows/local/utils_nfcore_preprocessing_pipeline/main.nf b/subworkflows/local/utils_nfcore_preprocessing_pipeline/main.nf index 2b44eaa0..efed957d 100644 --- a/subworkflows/local/utils_nfcore_preprocessing_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_preprocessing_pipeline/main.nf @@ -61,7 +61,7 @@ workflow PIPELINE_INITIALISATION { "", "", command, - false + false, ) // diff --git a/tests/subworkflows/local/bam_qc/main.nf.test b/tests/subworkflows/local/bam_qc/main.nf.test index 095530f8..d404fed7 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test +++ b/tests/subworkflows/local/bam_qc/main.nf.test @@ -13,7 +13,7 @@ nextflow_workflow { when { workflow { """ - // [meta, bam, bai, roi, fasta, fai] + // [meta, bam, bai, roi, fasta, fai, gtf] input[0] = Channel.of([ [ id:'test', single_end:false, qc_mode:'basic' ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), @@ -21,6 +21,7 @@ nextflow_workflow { [], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf", checkIfExists: true) ]) // genelists def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" @@ -41,7 +42,7 @@ nextflow_workflow { when { workflow { """ - // [meta, bam, bai, roi, fasta, fai] + // [meta, bam, bai, roi, fasta, fai, gtf] input[0] = Channel.of([ [ id:'test', single_end:false, qc_mode:'full' ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), @@ -49,6 +50,7 @@ nextflow_workflow { [], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf", checkIfExists: true) ]) // genelists def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" @@ -69,7 +71,7 @@ nextflow_workflow { when { workflow { """ - // [meta, bam, bai, roi, fasta, fai] + // [meta, bam, bai, roi, fasta, fai, gtf] input[0] = Channel.of([ [ id:'test', single_end:false, qc_mode:'basic' ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), @@ -77,6 +79,7 @@ nextflow_workflow { file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf", checkIfExists: true) ]) // genelists def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" @@ -97,7 +100,7 @@ nextflow_workflow { when { workflow { """ - // [meta, bam, bai, roi, fasta, fai] + // [meta, bam, bai, roi, fasta, fai, gtf] input[0] = Channel.of([ [ id:'test', single_end:false, qc_mode:'full', tag:'WES' ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), @@ -105,6 +108,7 @@ nextflow_workflow { file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf", checkIfExists: true) ]) // genelists def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" @@ -126,7 +130,7 @@ nextflow_workflow { when { workflow { """ - // [meta, bam, bai, roi, fasta, fai] + // [meta, bam, bai, roi, fasta, fai, gtf] input[0] = Channel.of([ [ id:'test', single_end:false, qc_mode:'full', tag:'seqcap' ], file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/cram/sample1.sorted.cram", checkIfExists: true), @@ -134,6 +138,7 @@ nextflow_workflow { file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/illumina/regions/roi_chr21.bed", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna", checkIfExists: true), file("https://github.com/nf-cmgg/test-datasets/raw/preprocessing/data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.fna.fai", checkIfExists: true), + file("s3://test-data/genomics/homo_sapiens/genome/seq/GCA_000001405.15_GRCh38_full_plus_hs38d1_analysis_set_chr21.gtf", checkIfExists: true) ]) // genelists def genelists_path = "s3://test-data/genomics/homo_sapiens/genome/regions/genelists" diff --git a/tests/subworkflows/local/bam_qc/main.nf.test.snap b/tests/subworkflows/local/bam_qc/main.nf.test.snap index be3e26e3..ed19c822 100644 --- a/tests/subworkflows/local/bam_qc/main.nf.test.snap +++ b/tests/subworkflows/local/bam_qc/main.nf.test.snap @@ -127,6 +127,18 @@ ], "riker_qual_dist": [ + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ @@ -162,7 +174,7 @@ ] } ], - "timestamp": "2026-06-30T14:27:56.863163", + "timestamp": "2026-07-07T11:16:10.062439", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -416,6 +428,18 @@ }, "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ [ @@ -485,7 +509,7 @@ ] } ], - "timestamp": "2026-06-30T14:28:45.159533", + "timestamp": "2026-07-07T11:16:59.089346", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -736,6 +760,18 @@ }, "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ [ @@ -805,7 +841,7 @@ ] } ], - "timestamp": "2026-06-30T14:29:02.372004", + "timestamp": "2026-07-07T11:19:02.438284", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1019,6 +1055,18 @@ }, "test.quality-score-distribution.txt:md5,0187a3f6c5bace7415a19e510c9d7ddc" ] + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ [ @@ -1082,7 +1130,7 @@ ] } ], - "timestamp": "2026-06-30T14:28:14.248686", + "timestamp": "2026-07-07T11:16:29.597141", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1237,6 +1285,18 @@ ], "riker_qual_dist": [ + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ @@ -1272,7 +1332,7 @@ ] } ], - "timestamp": "2026-06-30T14:28:26.674146", + "timestamp": "2026-07-07T11:16:41.798471", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/tests/workflows/preprocessing.nf.test.snap b/tests/workflows/preprocessing.nf.test.snap index 219de652..3c03a636 100644 --- a/tests/workflows/preprocessing.nf.test.snap +++ b/tests/workflows/preprocessing.nf.test.snap @@ -645,6 +645,18 @@ }, "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" ] + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ [ @@ -850,7 +862,7 @@ ] } ], - "timestamp": "2026-06-30T14:25:16.877778", + "timestamp": "2026-07-07T11:21:47.095717", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -1421,6 +1433,18 @@ ], "riker_qual_dist": [ + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ @@ -1529,7 +1553,7 @@ ] } ], - "timestamp": "2026-06-30T14:26:38.2057", + "timestamp": "2026-07-07T11:23:03.818827", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" @@ -2304,6 +2328,18 @@ }, "sample1.quality-score-distribution.txt:md5,89e46bfc59dbc7aed65d9c1e2350dd3a" ] + ], + "riker_rna_biotype": [ + + ], + "riker_rna_insert_size": [ + + ], + "riker_rna_insert_size_histogram": [ + + ], + "riker_rna_metrics": [ + ], "riker_wgs_coverage": [ @@ -2464,7 +2500,7 @@ ] } ], - "timestamp": "2026-07-02T17:01:29.294260704", + "timestamp": "2026-07-07T11:20:32.551532", "meta": { "nf-test": "0.9.5", "nextflow": "26.04.4" diff --git a/workflows/preprocessing.nf b/workflows/preprocessing.nf index c415dfdc..e051f8b3 100644 --- a/workflows/preprocessing.nf +++ b/workflows/preprocessing.nf @@ -272,7 +272,7 @@ workflow PREPROCESSING { ) ch_multiqc_files = ch_multiqc_files.mix( FASTQ_TO_CRAM.out.sormadup_metrics, - FASTQ_TO_CRAM.out.family_size_histogram + FASTQ_TO_CRAM.out.family_size_histogram, ) /* @@ -289,6 +289,7 @@ workflow PREPROCESSING { meta.roi && meta.roi != [] ? file(meta.roi, checkIfExists: true) : [], getGenomeAttribute(meta.genome_data, "fasta"), getGenomeAttribute(meta.genome_data, "fai"), + getGenomeAttribute(meta.genome_data, "gtf"), ] } .set { ch_bam_qc } @@ -403,62 +404,66 @@ workflow PREPROCESSING { MULTIQC(ch_multiqc_input) emit: - demultiplex_reports = BCLCONVERT.out.reports.map { meta, reports -> + demultiplex_reports = BCLCONVERT.out.reports.map { meta, reports -> return [meta, files(reports.resolve("*"))] } - demultiplex_logs = BCLCONVERT.out.logs.map { meta, logs -> + demultiplex_logs = BCLCONVERT.out.logs.map { meta, logs -> return [meta, files(logs.resolve("*"))] } - demultiplex_interop = BCLCONVERT.out.interop - fastq = ch_fastq_per_sample.other - falco_html = FALCO.out.html - falco_txt = FALCO.out.txt - fastp_json = FASTP.out.json - fastp_html = FASTP.out.html - crams = FASTQ_TO_CRAM.out.cram_crai - rna_splice_junctions = FASTQ_TO_CRAM.out.rna_splice_junctions - rna_junctions = FASTQ_TO_CRAM.out.rna_junctions - align_reports = FASTQ_TO_CRAM.out.align_reports - sormadup_metrics = FASTQ_TO_CRAM.out.sormadup_metrics - mosdepth_global = BAM_QC.out.mosdepth_global - mosdepth_summary = BAM_QC.out.mosdepth_summary - mosdepth_regions = BAM_QC.out.mosdepth_regions - mosdepth_per_base_d4 = BAM_QC.out.mosdepth_per_base_d4 - mosdepth_per_base_bed = BAM_QC.out.mosdepth_per_base_bed - mosdepth_per_base_csi = BAM_QC.out.mosdepth_per_base_csi - mosdepth_regions_bed = BAM_QC.out.mosdepth_regions_bed - mosdepth_regions_csi = BAM_QC.out.mosdepth_regions_csi - mosdepth_quantized_bed = BAM_QC.out.mosdepth_quantized_bed - mosdepth_quantized_csi = BAM_QC.out.mosdepth_quantized_csi - mosdepth_thresholds_bed = BAM_QC.out.mosdepth_thresholds_bed - mosdepth_thresholds_csi = BAM_QC.out.mosdepth_thresholds_csi - samtools_coverage = BAM_QC.out.samtools_coverage - panelcoverage = BAM_QC.out.panelcoverage - samtools_stats = BAM_QC.out.samtools_stats - samtools_flagstat = BAM_QC.out.samtools_flagstat - samtools_idxstats = BAM_QC.out.samtools_idxstats - riker_alignment_metrics = BAM_QC.out.riker_alignment_metrics - riker_base_dist = BAM_QC.out.riker_base_dist - riker_mean_qual = BAM_QC.out.riker_mean_qual - riker_qual_dist = BAM_QC.out.riker_qual_dist - riker_error_mismatch = BAM_QC.out.riker_error_mismatch - riker_error_overlap = BAM_QC.out.riker_error_overlap - riker_error_indel = BAM_QC.out.riker_error_indel - riker_gcbias_detail = BAM_QC.out.riker_gcbias_detail - riker_gcbias_summary = BAM_QC.out.riker_gcbias_summary - riker_hybcap_metrics = BAM_QC.out.riker_hybcap_metrics - riker_hybcap_per_target = BAM_QC.out.riker_hybcap_per_target - riker_hybcap_per_base = BAM_QC.out.riker_hybcap_per_base - riker_isize_metrics = BAM_QC.out.riker_isize_metrics - riker_isize_histogram = BAM_QC.out.riker_isize_histogram - riker_wgs_metrics = BAM_QC.out.riker_wgs_metrics - riker_wgs_coverage = BAM_QC.out.riker_wgs_coverage - riker_pdf = BAM_QC.out.riker_pdf - md5sums = MD5SUM.out.checksum - multiqcsav_report = MULTIQCSAV.out.report.toList() - multiqcsav_data = MULTIQCSAV.out.data.toList() - multiqcsav_plots = MULTIQCSAV.out.plots.toList() - multiqc_report = MULTIQC.out.report - multiqc_data = MULTIQC.out.data - multiqc_plots = MULTIQC.out.plots + demultiplex_interop = BCLCONVERT.out.interop + fastq = ch_fastq_per_sample.other + falco_html = FALCO.out.html + falco_txt = FALCO.out.txt + fastp_json = FASTP.out.json + fastp_html = FASTP.out.html + crams = FASTQ_TO_CRAM.out.cram_crai + rna_splice_junctions = FASTQ_TO_CRAM.out.rna_splice_junctions + rna_junctions = FASTQ_TO_CRAM.out.rna_junctions + align_reports = FASTQ_TO_CRAM.out.align_reports + sormadup_metrics = FASTQ_TO_CRAM.out.sormadup_metrics + mosdepth_global = BAM_QC.out.mosdepth_global + mosdepth_summary = BAM_QC.out.mosdepth_summary + mosdepth_regions = BAM_QC.out.mosdepth_regions + mosdepth_per_base_d4 = BAM_QC.out.mosdepth_per_base_d4 + mosdepth_per_base_bed = BAM_QC.out.mosdepth_per_base_bed + mosdepth_per_base_csi = BAM_QC.out.mosdepth_per_base_csi + mosdepth_regions_bed = BAM_QC.out.mosdepth_regions_bed + mosdepth_regions_csi = BAM_QC.out.mosdepth_regions_csi + mosdepth_quantized_bed = BAM_QC.out.mosdepth_quantized_bed + mosdepth_quantized_csi = BAM_QC.out.mosdepth_quantized_csi + mosdepth_thresholds_bed = BAM_QC.out.mosdepth_thresholds_bed + mosdepth_thresholds_csi = BAM_QC.out.mosdepth_thresholds_csi + samtools_coverage = BAM_QC.out.samtools_coverage + panelcoverage = BAM_QC.out.panelcoverage + samtools_stats = BAM_QC.out.samtools_stats + samtools_flagstat = BAM_QC.out.samtools_flagstat + samtools_idxstats = BAM_QC.out.samtools_idxstats + riker_alignment_metrics = BAM_QC.out.riker_alignment_metrics + riker_base_dist = BAM_QC.out.riker_base_dist + riker_mean_qual = BAM_QC.out.riker_mean_qual + riker_qual_dist = BAM_QC.out.riker_qual_dist + riker_error_mismatch = BAM_QC.out.riker_error_mismatch + riker_error_overlap = BAM_QC.out.riker_error_overlap + riker_error_indel = BAM_QC.out.riker_error_indel + riker_gcbias_detail = BAM_QC.out.riker_gcbias_detail + riker_gcbias_summary = BAM_QC.out.riker_gcbias_summary + riker_hybcap_metrics = BAM_QC.out.riker_hybcap_metrics + riker_hybcap_per_target = BAM_QC.out.riker_hybcap_per_target + riker_hybcap_per_base = BAM_QC.out.riker_hybcap_per_base + riker_isize_metrics = BAM_QC.out.riker_isize_metrics + riker_isize_histogram = BAM_QC.out.riker_isize_histogram + riker_wgs_metrics = BAM_QC.out.riker_wgs_metrics + riker_wgs_coverage = BAM_QC.out.riker_wgs_coverage + riker_pdf = BAM_QC.out.riker_pdf + riker_rna_biotype = BAM_QC.out.riker_rna_biotype + riker_rna_insert_size_histogram = BAM_QC.out.riker_rna_insert_size_histogram + riker_rna_insert_size = BAM_QC.out.riker_rna_insert_size + riker_rna_metrics = BAM_QC.out.riker_rna_metrics + md5sums = MD5SUM.out.checksum + multiqcsav_report = MULTIQCSAV.out.report.toList() + multiqcsav_data = MULTIQCSAV.out.data.toList() + multiqcsav_plots = MULTIQCSAV.out.plots.toList() + multiqc_report = MULTIQC.out.report + multiqc_data = MULTIQC.out.data + multiqc_plots = MULTIQC.out.plots } From d554ad8fbab84bbb20f04ffa611eedf1a35d8c3e Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 7 Jul 2026 11:33:28 +0200 Subject: [PATCH 40/62] fix linting --- conf/containers_conda_lock_files_amd64.config | 12 ++---------- conf/containers_conda_lock_files_arm64.config | 12 ++---------- conf/containers_docker_amd64.config | 12 ++---------- conf/containers_docker_arm64.config | 12 ++---------- conf/containers_singularity_https_amd64.config | 12 ++---------- conf/containers_singularity_https_arm64.config | 12 ++---------- conf/containers_singularity_oras_amd64.config | 12 ++---------- conf/containers_singularity_oras_arm64.config | 12 ++---------- 8 files changed, 16 insertions(+), 80 deletions(-) diff --git a/conf/containers_conda_lock_files_amd64.config b/conf/containers_conda_lock_files_amd64.config index 6271f94a..1280a9e1 100644 --- a/conf/containers_conda_lock_files_amd64.config +++ b/conf/containers_conda_lock_files_amd64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' - } -} -process { - withName: MULTIQCSAV { - container = 'modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt' - } -} +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' } } +process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_amd64-bd-9b10d606ce2f36b6_1.txt' } } diff --git a/conf/containers_conda_lock_files_arm64.config b/conf/containers_conda_lock_files_arm64.config index b3dce38a..d08dd327 100644 --- a/conf/containers_conda_lock_files_arm64.config +++ b/conf/containers_conda_lock_files_arm64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' - } -} -process { - withName: MULTIQCSAV { - container = 'modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt' - } -} +process { withName: 'MULTIQC' { container = 'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' } } +process { withName: 'MULTIQCSAV' { container = 'modules/nf-core/multiqcsav/.conda-lock/linux_arm64-bd-077315907ed11315_1.txt' } } diff --git a/conf/containers_docker_amd64.config b/conf/containers_docker_amd64.config index 38771432..00c5e960 100644 --- a/conf/containers_docker_amd64.config +++ b/conf/containers_docker_amd64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc' - } -} -process { - withName: MULTIQCSAV { - container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9b10d606ce2f36b6' - } -} +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc' } } +process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:9b10d606ce2f36b6' } } diff --git a/conf/containers_docker_arm64.config b/conf/containers_docker_arm64.config index f670be39..14270ce7 100644 --- a/conf/containers_docker_arm64.config +++ b/conf/containers_docker_arm64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5' - } -} -process { - withName: MULTIQCSAV { - container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:077315907ed11315' - } -} +process { withName: 'MULTIQC' { container = 'community.wave.seqera.io/library/multiqc:1.35--5c84a5000a226ab5' } } +process { withName: 'MULTIQCSAV' { container = 'community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:077315907ed11315' } } diff --git a/conf/containers_singularity_https_amd64.config b/conf/containers_singularity_https_amd64.config index 2810c5ee..df7923dd 100644 --- a/conf/containers_singularity_https_amd64.config +++ b/conf/containers_singularity_https_amd64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' - } -} -process { - withName: MULTIQCSAV { - container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c1/c1311ac2bfb96d77487985fce321b25bbea85f574f9932b827ed6cafe7f75963/data' - } -} +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' } } +process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/c1/c1311ac2bfb96d77487985fce321b25bbea85f574f9932b827ed6cafe7f75963/data' } } diff --git a/conf/containers_singularity_https_arm64.config b/conf/containers_singularity_https_arm64.config index 015e93de..e486ec26 100644 --- a/conf/containers_singularity_https_arm64.config +++ b/conf/containers_singularity_https_arm64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data' - } -} -process { - withName: MULTIQCSAV { - container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/05/053f6d8c55b57e04b654070a3bd6eaa90685590158019d35c16092d301b80cb1/data' - } -} +process { withName: 'MULTIQC' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e48aa28aebc881254a499b24c3e1ce77b8df1b85a5432699ed6f72eb17ac7fb5/data' } } +process { withName: 'MULTIQCSAV' { container = 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/05/053f6d8c55b57e04b654070a3bd6eaa90685590158019d35c16092d301b80cb1/data' } } diff --git a/conf/containers_singularity_oras_amd64.config b/conf/containers_singularity_oras_amd64.config index 3fa96080..31457ab0 100644 --- a/conf/containers_singularity_oras_amd64.config +++ b/conf/containers_singularity_oras_amd64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2' - } -} -process { - withName: MULTIQCSAV { - container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:a26da1aa4e8d32a6' - } -} +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c680f2aea25ccec2' } } +process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:a26da1aa4e8d32a6' } } diff --git a/conf/containers_singularity_oras_arm64.config b/conf/containers_singularity_oras_arm64.config index 0718e57c..bad6f0f2 100644 --- a/conf/containers_singularity_oras_arm64.config +++ b/conf/containers_singularity_oras_arm64.config @@ -1,10 +1,2 @@ -process { - withName: MULTIQC { - container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81' - } -} -process { - withName: MULTIQCSAV { - container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:d1ed21d66511158d' - } -} +process { withName: 'MULTIQC' { container = 'oras://community.wave.seqera.io/library/multiqc:1.35--c0468833d65b2f81' } } +process { withName: 'MULTIQCSAV' { container = 'oras://community.wave.seqera.io/library/multiqc_multiqc_sav_pip_interop:d1ed21d66511158d' } } From 7a556475cc61d0d62352011cbfb76210c5f76a32 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Thu, 9 Jul 2026 10:34:06 +0200 Subject: [PATCH 41/62] fix MQC container --- conf/modules.config | 1 - modules.json | 3 ++- modules/nf-core/multiqc/main.nf | 4 +--- modules/nf-core/multiqc/multiqc.diff | 25 +++++++++++++++++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 modules/nf-core/multiqc/multiqc.diff diff --git a/conf/modules.config b/conf/modules.config index 841bb789..9da06635 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -362,7 +362,6 @@ process { } } withName: '.*MULTIQC' { - container = "quay.io/cmgg/multiqc_cmgg:0.0.5-multiqc-v1.33" cpus = 1 memory = 4.GB ext.prefix = { params.multiqc_title ? "${params.multiqc_title}_${meta.id}" : "${meta.id}" } diff --git a/modules.json b/modules.json index 73619772..ccf88121 100644 --- a/modules.json +++ b/modules.json @@ -96,7 +96,8 @@ "multiqc": { "branch": "master", "git_sha": "98403d15b0e50edae1f3fec5eae5e24982f1fade", - "installed_by": ["modules"] + "installed_by": ["modules"], + "patch": "modules/nf-core/multiqc/multiqc.diff" }, "multiqcsav": { "branch": "master", diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index c4bc715e..711983ed 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,9 +3,7 @@ process MULTIQC { label 'process_single' 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/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' - : 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc'}" + container "quay.io/cmgg/multiqc_cmgg:0.0.6-multiqc-v1.35" 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/multiqc.diff b/modules/nf-core/multiqc/multiqc.diff new file mode 100644 index 00000000..d20f7de4 --- /dev/null +++ b/modules/nf-core/multiqc/multiqc.diff @@ -0,0 +1,25 @@ +Changes in component 'nf-core/multiqc' +'modules/nf-core/multiqc/environment.yml' is unchanged +'modules/nf-core/multiqc/meta.yml' is unchanged +Changes in 'multiqc/main.nf': +--- modules/nf-core/multiqc/main.nf ++++ modules/nf-core/multiqc/main.nf +@@ -3,9 +3,7 @@ + label 'process_single' + + 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/c8/c8e346f4f6080eadf1253505e6ff09ef004454fc18e8d672006fd7b222cc412e/data' +- : 'community.wave.seqera.io/library/multiqc:1.35--c17fb751507e9dfc'}" ++ container "quay.io/cmgg/multiqc_cmgg:0.0.6-multiqc-v1.35" + + input: + tuple val(meta), path(multiqc_files, stageAs: "?/*"), path(multiqc_config, stageAs: "?/*"), path(multiqc_logo), path(replace_names), path(sample_names) + +'modules/nf-core/multiqc/tests/main.nf.test.snap' is unchanged +'modules/nf-core/multiqc/tests/nextflow.config' is unchanged +'modules/nf-core/multiqc/tests/main.nf.test' is unchanged +'modules/nf-core/multiqc/tests/custom_prefix.config' is unchanged +'modules/nf-core/multiqc/.conda-lock/linux_amd64-bd-c17fb751507e9dfc_1.txt' is unchanged +'modules/nf-core/multiqc/.conda-lock/linux_arm64-bd-5c84a5000a226ab5_1.txt' is unchanged +************************************************************ From 03f59602909ff2bf2d902777b726c9d835c441f4 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Thu, 9 Jul 2026 10:55:17 +0200 Subject: [PATCH 42/62] fix outdir handling for reports --- nextflow.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nextflow.config b/nextflow.config index e374ea64..709c7838 100644 --- a/nextflow.config +++ b/nextflow.config @@ -18,8 +18,14 @@ params { custom_config_version = 'main' custom_config_base = "https://raw.githubusercontent.com/nf-cmgg/configs/${params.custom_config_version}" + + outdir = './results' } +// Backwards compatibility for publishDir syntax +outputDir = params.outdir +workflow.output.mode = params.publish_dir_mode + // Load base.config by default for all pipelines includeConfig 'conf/base.config' From 8f1aaf3d108f8a58c32a1c332b7f6a134a8898b1 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Thu, 9 Jul 2026 10:59:46 +0200 Subject: [PATCH 43/62] remove redundant config --- nextflow.config | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/nextflow.config b/nextflow.config index 709c7838..ce437d8b 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,7 +22,8 @@ params { outdir = './results' } -// Backwards compatibility for publishDir syntax +// Set default output dir and publish mode +// Temporary fix until the nf-core template supports workflow output definitions outputDir = params.outdir workflow.output.mode = params.publish_dir_mode @@ -235,8 +236,3 @@ validation { // Load modules.config for DSL2 module specific options includeConfig 'conf/modules.config' - -// Set default output dir and publish mode -// Temporary fix until the nf-core template supports workflow output definitions -workflow.output.mode = params.publish_dir_mode -outputDir = params.outdir From 5e5e0eeaacb1a6c535e2c6f503869da2719bfbd4 Mon Sep 17 00:00:00 2001 From: Matthias De Smet <11850640+matthdsm@users.noreply.github.com> Date: Tue, 14 Jul 2026 10:09:49 +0200 Subject: [PATCH 44/62] bump cmgg_genelists executable --- bin/cmgg_genelists | Bin 11590142 -> 12671055 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/cmgg_genelists b/bin/cmgg_genelists index 928cf7c3b9fc00b22a7a77c2df4811c90f0f4c3c..d3f325c4743bcf45bbf88a889d9410e82718e8ff 100755 GIT binary patch literal 12671055 zcmeEv3w%`7wf9UOFoD3CKmtKt6CElM(F6fA0y>dI&Ve%!g(?avDn_hUF_}qF0|`tb zIUSBhYpYdzORc@N*S6Z$A|QoKfP{boA-!$pXgjVjgWWekm{gqw3;W$apyQ0RMe# z#8mcf{2J|1IaY^_r<-ggyqx~~)@#$*yYU-cj{0cYTgvnA-O}l|`dbc7+1P$DEJ5$z z&7Zp$vvNH5MW2?7=J@wzpnmqn9|wl;>tqEDJRA6Ak$4z*HQomy5MBOndilTUbg~;6 z_1~`L#~_|y2>0FUTa-g*CQ_AA*l*{|`?!7^UK{hiCNRXDxZDxCh>_;6MhuyuYl(Wr@Tf9*SZ`FD7E z>wwM$x|Y91FCS}U3-cQ<|5g`-cZGjZm-5vg@b;@e;N_PY_3FR2F7H3YJHcAl-rJ?T?TKxyZrc;(?03~%sy*`0 z774PDf+vk71ODpwx3l=__bb@%!K*rVz{X-D58{^S@@v1TV~K0OSU}Le7 z$BPIu2)hpGy}bQJox$gMBgIYs+DrLG4ZQr6kNZXC*4v7T`BN|DU;aZC%aw6oC-A$q zPt@uHA}hBm>BsDMI(tSQUGwfkQcwLKIEa^T`KI&u?OOhmUdqP{gc+0R#J^m)|0jDX zf9m&dvGNZ&JM&-H_RsfH{*IGxv+_Tg!+ye#uI2k7qBDkh*5+w{VS)7;Z$A}p$C1%s z6MCnAgHYb!T^_@quYYeN3wSd~I!FF>ZU2&9%8$Fv&kEVQ6zK9Asrb9lcNq8%1K(lb zI}Ch>f$uQz561v$0dw(3zcU^+nQj|Dvp8@3gz0l0zvqdio;g1#yy@0uS3f@Swq^I- zF+JyRaA29Hc?qp&VG=9$x#LA&OlYs@-DbUW zD;2U(A*=TEW(zB1p+eT+tM9!htBdWeE;J%MwF`aa4Q(qEm2x{Nq*cK_qS7HMd&P<- zq5O6zM49!$STW=m9fy|p7uF?P%G$5=oC@|8>--`76D#VMCyL6U%uwdOV1_W-gnYv4 zhfuSq-fR{fjl!zi=_P%as1}AqrA2J{MD(A(K}bc6ZItOcvI?ue20HVF(dB?1@QdD# zIAK*2;?UqXlG3a<=sg}MtFz3qnw%j!>V;K*Mh+Q>5@po5NK8K@tG9<_AkF4d{wB3F zN&b!-Txo}9t0OEFJ0GCNdIsMlypw3j&tBQ~=p&vdC@Oe4^}+K960Woeqn#!se*0*? z=gymib+RQUyR0qWb2DYk7M}N0I^gT;`Cg9j&WH?T?YQS*&oE(~J0k|2eb_Tl^i4We zS7FMm4txOA=Tyq}(TLiMC{c0Sotf2Dfim=4+dnWK{fmF-amnZ#N8vo01)jJWPRdlZPMXJ>of2y_uZ4GFq zAGDE|xvvW3_Ey`(P>tx=DX5ibpln&H$$dgtH-DJuTWT$Daz9#jy~*6<9*7?)|dt&Z@1FIvsr7EU24NQ1*?y2EfaXgMzm&2qP(5MgQS=**7K`(UMP& zv$%ZrIN9O%)DatH5quf4a#&UxwLcCqnaZm@-_x-T`ZAQu071+F``AazfMJmgkh6l7 z807}~U8)%ouTq3#f8itGoTm{+RXO(2Ih8rr1A$?> z4*4b&(w<3Vcv>xhmZMM|#;-PfD96Gg&MArX3Qqcq!6_X>fU0#=Fj8542P(VqfW-v< zn1UZ|G9I!oML_epm2%85Np+erM!{bUbw5LX*%#lsjZjxzI7U*cIoeV_MpSlfPE4v9 z#Sh}e<=9*B7w!0dRC)xDDy@lv`{~g@kN4sL7?W7%w2*Wb)d3H$6Ty@gg!+BG8X?h&#IbtfEi6&AAvJiG zrDh;igruXQOEyqZ(TU(uo|=c$C3@;?p1KIB+j;6zv963bJ%Jamvq>mkS;pUf&GJ+- zYS)#$jz}`)q44YmYNc{5e=FnJ-lDg zqlfw1Se~t!-s7GiDYHO>_#qV4fd1qP zw}lqVzKLU6F@k(?cF;)nw#EqRUrBuX27FsnfuE5l>BqYjvsg+K1s#V9b1?~R!JG%+ zCas>EYtm{~SwP!GV(dR$?EhD2?KLx zT~3UJ@RxrhLRjN_r~QD{^n=;H#F*K>c`?@6zJ)Qi*}law8MA#4$2e#EN@DV6`sA2J zGm)@VRzA@lM`JFfze|~Gk(5HKOSv!Ar96arT|h^E;}Vhn|{OmZ@fGI1PR8@-=)11YI>Clpa>Cobo zeX=DFv!R7%L(5XAXxdrU$Y6{%HVP%>NsPkj7=^ROVq|7uRA!03=PhMuMfAO5p;5^A ztK&Taj+GPD6sXw%4vnfQV^5MGpNF;q)L4rST^0$Tl-FWNI?e+~YKmFU2Z^6!5siEx z9@5J7d`^Tv`ij>F*`H%sV&ntukhWOQw+P`s>-jJXlv`*R@~q{S7ZGN;uV=aSzNjf) zR^WNoC9y8fPPsHYxTCYM&9Pf5s)h33fE6Hh#r4QlCMt1utqn2VvMTW>4+CCQ2R<-q zANG*PDr`J#5}u16iuMsSBWU5l1O#Jva4>?cU$P9z2%hA@p$LA=gToMfhX;ovxE;ZQ zKAH7cKFk7`dD@fRT8^_*YlR7T#t6^(gE5))<@N3qyv7#_c=lmQeTC<$kyOp(ejcJn z2+wUz+f_MI=8Yv5CK3IiKPCw4;%6h0a#zORh!AO9!ss$|+~jTTE3EnBZbPiIJS3EF1NdkL2#L?(IY%LQ9SyNhA^I$&&|AZha`3?IS@Jsxl?O(By|P58w?ozM0IAIzW(sGSp;<@x*#e$*<9pv4?~qDW-Q-x5bHQE zR5VdC;xP@Cn5`^o2cj^NhXLXebE-27x&ER@VF6!a9;V9=mhv){R}0Ld|2S0Il0Ftp zVxxHdvZGF@c#_p$GRlhhK2{dBgjH5DDwURNeNuC>kZqnGM;3xU!#MoTtQMhS3a>w= zxB7>7ub+qpI6KwmNn%_lbi4T}t-Z{#Sc`l35*$C%HgF&=$>OwEkW2Ml_oR zeg{iMG>5TOCY!EOV573YG6sq}h39LX!n$*!`3y`_rN;qWZ{vfP-L~n|mu?Hf{OmBuxfjF}Co~YSRtqMzB9#=HO*CUV1C2cY>I?{8Hi% zN28?dl?8dLZuu&n$b1&4Wt5rPN32W6yvYeDLnNcVwrVn`}s$Q;BPek@@;rLYTN#~yJq{h z2dY7yP{?!H_7B}(E?KgMXAWqEZ|9OP660 z&WS`(X&03}f#-V6k}nF6RObte^uMLm7=#_xk|(7)(o!IlTk!4_ydTnwnlq|7Xb&5A zY5W331_L&n71r;Q%;2~>$mqJF&qVJr!95<9X)6^@KP1)F5Qj>Q?NZ}W6tw85ZIILU z>1ADtZ7a;l?o3g=$(sM$X2E@RC6y!TfI^b@gc$_~b}gt_w@P)$g5lPCbMmO>9?F$X z+jN9RSH&n$hhalj7mliy)hkDBJGy)sMwV{M?jE52gTh1c_keBtSMEdGKXwN|+D81n zPaVQvJrE+9-y>#`9iOh)D?3iPU9$3NujN2<2v?h!uoLLJ0ljgeR|fJzAs~UUC2~{~ zx=?_A!W8cuD4X^*))8iRd|(13E(u{iU;ik_Zj;p<``AExk9=X&Qa0`F-pZ#^d0SxP z1Kzdn=9FyXlcnBlJ;v6wzobrP1ie zUnBlL$6rgn&{TuJ4q|foQG6A4II9!F`N! zW4asFiWzYP%|_w#dUp3f;Du#9 z8AwIed|$CS-|>l1?v1LYG4L&8lh(N6G`;a}eb=(a7Di?JGO(X#>sx#S0caM}YqEU{ zP2Zpl%N}X0Iq(Lu`rKLHP+LQzD%l@+mRDjazSPA#+9vw0m8oZ^SPBO>7%*_pvi_n zId8>QoW9M!f&+I1!(u2CYTq6>OR!-CEHO$P3*KUYLj`h7hgrEEiu8{Zp($};)?tjY z!x&*->vbj@8EP=Dq`FvYh=y43p|WW={EbQGhah2qgG9kw2sk8lsWrc)wpkF$Z$W~N zP502#5}#@74*WDu|VvDgTRW|Pt9W4c4QPk`Z#T7pzsw<%7?UBqn6c#PJRb|2_Ibtty)+vaK#8pbFNEh@O0;0oWcViGVg?Gb*yI}sPrk!Y zB0SlmgnPH+qr#mMrduRL&8Nzt#-sidR?6`^O2yLmBSyM=QGIw)J=}RhW%9&e86*vD z!rmM7Q_PbknlVLUR^>_k8GCSW!9I;>i$UFv_K?&Q?T8vZ&3LctvaegZKBHAer5mf( zs8tXaMpzt_*u_p}1+CyLxRgw0d=;a!LS*F)#-UYI2JIwfbuL=07j^PQwqBI|kbgiW z_YZgw@{3is@=LZ61Q!7^bZECX$AJUlpZZs93DTBF{$tFjwKv_WQ1^nRO-I+v;iPoeVTr_m%>ITiMS zukk*a8uRISL)D^>H_7Jr)`XJv+Fz(tGfHXwkyZOwyaMD`vG4LO)Dn|6i9l|qSkywj z5>-)zh_MrB1oi|2?1C`Z1!1rY7}!o^E5O70SRRG&us*hkLU>poTSB2FSlM1LDr<~R zy~jFb)rJswNqVQOTHRT^-pioTv%=xR0LU+Z*W z{H-l$LlV^=t{}deFsiPx(;6M10r(_z(MkkKBGOoiAW1|TD-k4#NMl_}RC$c3k{zK+ z`8KM9-q+$+n*#{6nK~^f2KJi;t%&<6ffhv{FNm^%!#AAD+)6}wj54jJG4m{SAqQ~q@Gj%Svl7*mnESyl>m%-m8MD(v{@C+@-RMU}A2(wSzL9jS{Vzk%R zqgploPU{W$89C(Vvw;68opz0xodNJ0?K3kIv?+UP@JEpmLM@|u<&X#m5z!xj_7Fw%O1sQAV8&m7Bon*I}*Ehj{E>R{0y z03u1$mUPj|3-c`}$8SaId*n8A0DhHL09OZzh>~|?UIC(&s ztpgclzIhFlDRvl?(cb%+!48)~w7>UWZ*tebqtCenwt?Pr`NSn;uZFq0=R7=!=6Izi=R4wYYVh zEtq|Xc`=Z@vvdPeSmzwtEz;;beuZ^n@;QGTc%tWAqIa3a)N86y-qvdlHvX0wyan@Z z^0^wTXD)HN1RE~~z<#miBP>0NFUO`~!APtmiH{KFZ->`cBZlNCEEx1rIq)x_ZpArw zg0}5IUw!}gU|;x`;0-+SW+LN>Wj_W_+;^?P6C68a71aLlg3cY0!5X-O@kta)It7Jy z#JK#5dXFWuIZMOTb)ObrQz2|Tt>Gx zs;J(wwn4>1%G#3L{SfkCHR;U2x)G23sDXuJ88Dqp7+)zD%7FAC7fJ_yX-Jsec?f`jH6UQSrFbe_ zZ2Z^DCeW`zRP)3j7UX%(Ak0pAS;295<^{*#xwI-cibbWe=OC7lh-XHyPv$<-x5?Ra zwD3*=nDm^dPv$x7oA&WN0TzbMZLg@DC6+c=yEEtUH#UC9>f_e}VkCR|5i?^zLJVR4 zo`T^65zXJ3G}6T9^-&h|L%#*%_f)YS$LP!WyF2eu7A_x2Mw#7x;Ryxnb^L}b{0Q&l zk^g9Z#XfXvAM~cUD$(qR^|cTZGwu*X|r-gUw;jc>ig=2T|I5GV+ESxZ=uK%o+H_jeLH(Gn?AmO>ohSM#W5;MI>Rgs#ZWrF!={#54rDk%pb?hnro|xW7l9!3zJ>-hnlTfxS=5B0GV8^sx*>UGq=&zmIGukzNxqe7z ztvf@~kAw!)68K1?(|~2-W3;UaSk9Hq%2ryvUz8H_D5q)Pg!T8Fn1)4sJL~U`Dlk&4 zs5)aHpGs0l*94n68Vce$67u(8Qojd}D(&61zz3Hr&CeLRU4D4Z=J3&}MaJpttmkTC zbYxusL}ATKC~;9Rw~6MDK-{Jvh&z+|i4_7TF57jDq45j)%DIX^+j|%U-U$LrjfZst zOKGjLd29ALf0<_sb+`{Y981I+!aL05GnAefklno-J${rPJAZ+-&UQTXUbjDO^x7Kk zwLu;3pMQ|Azk~3EVMJQ_QU^Kh=u2o zJr}R!XJvQs_bJBvbn=#0KFWpcOU(A}EW4?4USh5k@=FSIwT`|})k|q-WT512>sRne z-~g-vzz@9%-tBl{`B6hhF6JQAunRRTOr9czY9yQ>@P|;tG1L%pCraLSs=ex=`t$}9Ft08h*5YW7!aZzEd3 zcRYf>ihALxMluNKrU+r(Jo}tVD=jZ|-4=>0En^^6VXIprt24}!qgfKH;e&&7=8 z9?9n7)7l>9vS64rn2S0}i0W-IWSd{bjxZ>@#q{&AYh-p5t6VQGhcL^7FO}M61ci!PEa2|FDb2J z%cme3W-?s-@LZ_=xUvUmW=JkKe=2-@roVJJU zkM9IFb`mzKkq_Xwt!PhM%o@{Cy>i=Hq+t~P;dRWwzoo}(c+mLNUZ%I7(&Jfrtf9wh zJh0iTj$Gp>KfgVjO>yM@8ehL!G-YqVKr(F@jt48h;MG1R?OX!7248%!&V3tf-)Q63|Sd|SZ3=nvL5B96P*h;PTj zb>E(@ZT%5p({O)bb_v3tjoiz|G9UkRsz2~G zD+InQO~$fR9%uZ1T9k3;?9w{u`id;#=luwWeGB31Vz2x^xiv6QZ*k z?MI~t-i)fsNCyO5k)XL8m2A^9G5s}-6IzMmn4k(7qYE1`=mPAiQ|{mqgkZdT;+W(Pzb!TaWWruwP?gZ_1p+bq zNqMbqKN(&JoudeE5KfPFTu*W-YZdG#mwm6hjL{x>s+&-`nEm7;_9a?TUa0@vzR|mV z3FSEfGkT^J@P9%37s_+KaQ0lD>c0?tp#P!f3()^!_OpxG7tsE&3$@SjV|L$6j2^cC zz{;F*^eV&tgRP3-HQ2Cl2FK%>g)@k%m={dL6ZV5kSX4554rB?~`^6~XqphmTaEma$ z9{OjGZ{UB!$qV5Bf7bY$z1A3iaa;BA_c8+7xf(Y9PPMS{w|)i2->)w1Vf>w>GfkZ* z^?&mC`)?RukAHOm`u-Eg*SP;Bh9mg*~|9{^2 zzIV)beZA1V43+cajBmFnP_1~qW|0ee^zMgh} zH@-TLFVMg3lMB%QpEv%Fj{5Hye?E(&zh@M7@#FFxv*JADi_iz5KAwI!s*97lbl{^W zza|5V%zl}w+uu_+kXyf|z0ZvAosa7dE{JBmV4Yq8%<3XR0Anma8Jz4Bt&Uk%Pon6X zl`1;K)C)sEJFN|xxbge?KQV2un6?wn7ctCTF%ToZdyW22OglslXJ+Pr<`2Y)<_2-2 zp#P&nN`vS>0oR!ZUep>6*|52rgbm;xjAiWHXb!3lv5rxa>qZ*ev|9 zU$>JtyoJ@N$_4!=ltayeKUIwz)=M)Nvrmc_0TA$ESEpI*4MLPhdM}N${vASLKm40| z2JuH1vHw4H5&SjVE}Ws+a^duRod2+!ss#ui}r-kG%+g zfN;@t=0!l4cdj9ig>{y)HmO)HYa8e0{xxN7<2~cW5Ing)(w(xIFUwxUZ=eGOBAuDW zbS~uV+(_@iG*sZ3#nLkO0e?wlZL{5%mbE?TN!26iNGk3bMOi^U3+JkmvbIM&!w?(G zTqh8_3m!s)h1;sh$84+d%kOwxekpdlW7HK}a0GQ&aV%XKpicW^z6j8#4#i~`?t{1# z6nKWn**H8C$Z;TB%MP@lxY| zhP%{qg>`YM*;%db2CDQd-4H5z&&O@1YDD42PsslZV7vQKmxPL22oY-BU^xBNi)_=* zWNHqH{Ni_0bEzn}b}~RX2#i4(=fjC3HNUPbgX)F-tA52eVcp=e_HmxR9H%K|?c+TI zYgq;}kBWiM>$%Jj?!P3LK!%$J;pso1JbXLi2BRl;y90m^fvY^DoaN_)3Lg?>UzrW9 z$VwSqO}Lp+tOj{93X1S_6fdQ)=MvGop0d&XI|Ic~CFR}1^8Qrxv6P7a)5;L#Tz&~0 z$tWOrCn94`Wn7jRVoe1HP?he!wPl$|HnVC1GB8DO=U1@{hn_=I01>y+!cizm^u0wj ziOO5lE}~XEAv|>mSwQ*0-rY8wN50?l0Ns~D_;;LMaSJ>TFEN85#(Cg(RS?55G?LL5 zvE$+Ygjk(ZgYhhx$_*)60m_d;mW+aacsh#XGDATd0cQNcf2qM8M{i7#BTUy)(Mg2m zQ5?S+1(!424F?LWmjf3~vYL3q95qpyrB20WYU$o!Ju=+w-YN=jwu|QVtXs;N;IB|# zn^F$%n8|qHkTi8$y8_{e12D-i;i=>BFVbbClUyzGBKXJ9efn<Wt2fYPkijc^j!x+@nw*n{;;yVA@FUF4Y|732EI0G3+{_SO>H6A1 z_$5cNRQ){}zrjqB1MpYfqwJQHgV}JS^=@;*4>nYjQ(0mkBr6ZwQzhj?bfUyQnEdaC zpo_xO_ks~`#IY*i&gR_wSDasHzshrIE^fW5paam9iE0^?P4`WL zjUTq-=C==n&*!K&?gb4Kgw^CYTGpQ7ndPeZ%5#%`mCR0*Lcdr899h)QWL_6fBeG@5 ziiYZFPR1rv7W2QFjG-VozFuyXg*WT7g>`!+bAuGx7EC}R!cS_l6B?z^c3y?ig$QuT ztT()wz?V1{3eQuk=N|7)8vy~K@yG-d24tBQV z8FquX*cnLXKq>p_CAoZ`P(B1W11cF#WFhwiwa)+=Ao)L!k^G+#>jh&Oap?9AN~f2n z=#wmrQUKhUbwH^2IZ`F{7Bl$|Hm-OazV;;(>^mXCDOl8KC>?WMxNYlX5yo`7}qV#Vt2rI?iIf zCQ!G6eNjIJ+VWWG11F7s9qe}_TW67OQrvxrNLv|IxC(L-AlM#8~q1(*&KyzlxZ)~o+#a~+_=Jtil+jPke8G2bQGsm88Yu<(Turo z>J~WY;?@I*y!RlYav(a&LU(&C*<1vzhX8Do%-`ma4=0YNAU)6yuF@u>4J{K7?nuVG z8a4C1(Mn(73~tNlu7Pp+coYnz%f}33?sDT=rz$3DSGG?Ek%eboCB9hMz78#xB++<; zEXD2Cne~B#l;WFfg@`i8(v!2b_fqO{R09Rn~jFXv7+N9Cc0dfNc z{cU8J0EL}IdeOi_#l96ck)mr89Vt&wEjN|+-AGQV!Sy(FScG@cm%Kmt232ZBrP?uE z@Juz@s75OesCKK7(U1K1`+BY~%bHZ^;I;DueZFZ|piUaU2aJYZ6P_a70A8ehsX00d zlMYATK|vpLmi855@?JrgaIAofatThOr{j>!T`|P*69dp1FcmjHE!)7p(DSU>49n)|$ zduCIEG;VNRs9#EN#x)PPb9y>h!OyuHH{TGs(7G$F#--kf)5YL#xO$i3z!X3aTt-kd zXp;JvImqrE8;i!mlm>|_YCJgON!{{`%9+e_yjT&AHESs)oyW%KcXb*Y=X$-UfsG1Z zO75~!6FkRZ!BXnjeOSbo7=h3>_X-tBL>4%Z_7iTaKO+iP>Lwzj{ay#Bt zxD?@I2qRzIA=KeFlrweK5P&eGZ~`*yq|CHxX~MzMqAYgI+Be{L6r0|Fl1XQTyLO^( zy{z6!R0OR*;3@mk6Oc_mp+^-S5zUOtB3Wvc!scO2y=t%n-7Mu$!2!o$2IIL zSK5g=>Xnzc)E}OwD+Z^67a2)#=3%r;EwRVQkPSEsfy;ClBhmSE35g%j>H{BH_*C@n zGUt}p!&SB;Xq9oItl<<+Oq=C|Jy1&}Rkq{Y1Efo&xRc6zK8(&RCA3jyZ=1O&K~kR# z;exl4Bd7}%;gHv<7)c3%@TgK&XUAatdPA|Et0lG6O!b?&;v~_Tp4wP~QXEzoECzX417pnoOUNXPak<| z78qvIoa<(punwR&rR80)hiNlC=$i&W@(4R{X$*K7=MU7oFi1OGxWG$&B1CTgtZFgg zQ{wl=<8sgz|lE@vM-PW1mRU9gE~@;yfqmXV+)~&p8z}%l3)FRXec$ zzWRyrkVys&X&n@%V~>%tPHh-atbSQxE2l^a6*m`eOazR$tb;D>ScdC7l9t)%0mZ4> z8QSUjyn7NR+b9O4n;%80hz`{d2h-u5iKoEX)ovG0P)EM~SSjD%UvLgL?BEW+s`4f_ zl5w!P68_~Fi-)*hvzoGKGJD4%oi2gll!58^-VU3y!GM-`C`;)Om4@f17fWgMOf4DEG##rJVuvuok;{{+}e zAOBS};&24*b@q!3Q1Gig{Usm&4#tK&lCVgbv?K@zHvZ3p+i3jLXr=K#i_lM5*!Z_n z+3w??>IZffE~W9`M*5C1_Nf{mi~yps|M1;3_RDugGpYziy_ST)WC#JzrCMzZ5p6W| zm-1?EIAYvNTzV~2Dz(=D1>p}gzn>U;G8lWt8DeZ_G-Hdbh*pH$$T70!dXj~=}XWv0It9H+1Er8S7 z9|49da3d1CH!6y)|5)0Yt(9vcY)z1dX`r(;i&IBFLB-So4^eJ|N@2FXlPAuOPK?G? z)mE+jF);Ao@rY*N?ejY6hqv~0H4dA>n0-7)*J7ac(JfFI0vXzUgbP|sVybixC6M8N z2gh_^pn3v+^y`)nlFr=a>SbM|1Z{-beFLCSAgiSADwB0ktO>9=OYb_i8K#}Er{er=ZOs-e7wBq66+R&O#( zEo77euV7)vboW+Tn6w;$B>~6osZMnSu4!0cMnm-K`97}Cp&J;Ba@h6^v_@Ql@&&sM zc)wG4f!z%(<5Z>6vhp}9kGtro++~=bLY|R0`-Re{i;~e3?7hoS>6MybAO1`0OMd`s z@W&EF?`bpBNl(*xO}e5H*Qf3C*rb+fR^1?`6>8{CD3Z^ z(0^jG=s!sZwuKjJL}A8m7?J?VU{PInp1500M)0{1WAyXqF_RVa(d+adohZIb2!s8| zM7!(>YzJM~7`TCJvkf$qYB*7N8H0T9h3SVmG5)^X3)AoU2>rI@{R8N?oP`GFXC+{t#xS;Vo z5E4b(p|~0YcS}TwI@%y=Z!`@P7XjRx7*mQqw3_j4AcS$no*Mtv*SMl=Aex~Qv#De7 z)h+ty@K&V9x*;A~<8Ym|8s8K^t^s;3TYvr2W>lo^6Qq!qvsJ&}>JJ#+on%}m`+508 zY>eKFW7X}K77t=JpHF~xn%@F1qZ(|<2o)K~RF;(?RM2GzwCz(eAD45OVX`c1zn3;1 z@?xO1p3h#7woJhXSdPiCFFzWcM%!M&SuE`m#y@54%c9fCcl_|nhVzhS{^ z5pRveqX7N021mQ-s~@Y;ITXPj1aUV?X6}<(n$agNK-!|LUF_}(DXoJRkA@9Dh?`_F zF}%5qO=Znj8uJ5-{TYvau5+xH$GXF@xEkH11R>W1l@vwnyJ;M&F@b2Z;#%VGwnmXDANE0h|YR;L@tM* z8|tA-cstCV5e(pd9N>~Q%QwxgFB(zb)4fNP{;FEfGmGBJLtXQ_$! zf}b}!vp z_9&HG<{69!3{@LRL~qW(qbg{pZPCqlAsieQ2@Z?|W7+1%N6T^7&QvSgEAB&k#YID) zRSu&oWcFZ3I&@D#3ZD7J0;@K-3kgiV)5fnS(R)6_GkEje)W{#b=kIp++nh$>UqgGt zf5i0aLB{ESE;4?X5Jr|km^byTkD*rK z{vdpRh1oi)pked-G>o!FU1T*EwF#6F3koOXf$$W4CW2T9yGgC%gz`54214V7@>d8T z`l{=p!XXB9w-Iz_1`%{9PY~d?jT^E3@5KJ$R$&zx66kiN^akv2hoqK|B;2{etnhKz zKEVA|ZMdfdY4{!pR>kQJE=LV+@CP0j5#;mv%_Jdc@GvGcYSI$Uk&8IA5JK~5Yb~!f z&N?oLkB8v{x73(Am+t?O91VrzSS^qavQoc=SPKY!ZPWGKzA%NrRz9K2GvNdv59$F}(w;x731~0BvdF!;&^k ze)JELIhYKWgT%@a*v4Yfh$8(L7eS7sGJDs%r%c#3vyos>( zZ}j*z9?aBF_#s&k#7A!?#^{@zP}gxEU(sHY47iGeHdbJ4!TtC6APCz5k}8@#Q`qESF zGVhzCCO-#v6D+|>2`t>p#PuVi{cH911#ctJfE&KCQo#5d5hJJ7Noi-Km2C{+zYmby z5Y1TGO?{5dFBPGp3G{`I##6|N&oJvbmkWg+T!x)-W93u}8Vh2f7AmUKoqU3uWrY!~ zsz-9+<^j5Uw~Wz4r`m`x)%JiTI*|` zcMt>$yhdAadSx}pSjFzggT41-T*yvx2~!EWuO=^mnb%Ko+}%m`#qBp7oL1A94T$bljMR%i^ZO{#v(}!~}Q=8yM;>n1G3yn&h-kaWy6lVVR(U<#Ou$flt+bvZ-HR$H)_4S_E+`sD&sOn&IBUotr8lB#ANg* zo7sr`2lK}%+7;Ewdn_t^AS%2IVXYPqzLUr2*X8I>SQ6^KZ*F|2oUCCLO{KS#!1BUB zF9yl_?o{N~j^W-UE@-`5r!o~43dpvSk7>KQ4r#&nnfA^z|CH1zCY8Ngw;7qImVTUH zr9FwH;4dR$Uh9{QPC!C)F&Z*bXq&Iez!?;T%B8O>2TeuwVbws28Q|?4}L-jNdTmtyaaL*|`6{@L(fsAGz zCPsq0YfYIt_kgpJpK(v{9fR2C78>;If*$z4vS|ZDDY=yH32h2qibAx=#VTUraQv;q z*o(o?!yXJgSVmmS)V-a{M|6^(rTg&FES7%+6Dy9LCCyyE18(fkaZKPwtm!oT;h{Lm zbG4{GZifFuyC==S@@44d3ISL)>sW?=Y=7XnFBRa3hAaVM4~E@_X@6lEpym6EZ^!F= zy7EgC4RNS*R{TO6w0Tl!yCYv%QG@ThPM%+C3JxdvO^TvWu^8p5U}R&74kU`W2X8H5 z5<3*BsKMpC2VWjfpQBE_60UvNhb9Trc!IK3Bb%%Qq{bljbi?inNLbGkj3|lu!C>Qe z6H^!^?>7)$pUJ*WETb#!3zzzUF4C|Q9(1K0lhaPf>JRW`Z?0;((!Ql2wFmJ;dmf~C z$`$P{$1$N|8^Un8b6dHSu$r>vIuZUQ!O_Uz9=IWnN~tNHX`(5ZXuLgyH`wO-L*FZ$ zPFK&p$m)LHzJn^J-BVm>I;rhX*W;x@d)7h&k0$~Na5bdw1h67LjwLzV>vE=F6aHJN zN;3p%qh=*B1AUoAp$MBwQN?=7vT_?y?9Q!pwRs|7W-eBMKS4@(AFr}<2;P2DtVBzU zdxdh^SIbtu;fsr9LOJaimrZ*sm+jqLg%?@fWZ#R5bA_ZE@KR!4{rwq;L*VSHsB`|*cJ0lXgShZ%R=KiIZq*ZC0c2ZSA}neHn@X<4ZaUWN)D z@DP-;a*De#!ifHNNx{8+Ex~xM?|VaoglFmixUPQ)PnY3E)YmkkI?sMLwAAbHhkJ}c z5yAq#g=;^E-&8$(SPx5Z>cOf&!Ez;-s~pz8x&nDYA{sTcZFLvz^w0o^tW`K;LpS2s zGw>`a$8rVhwZQT<_$?-M7vfMq+Z_ZVYDEqai`k+RG;^&^P|5uf;}Ru>k1YS6ftHDIDEbAX{5Gk}a{;Feb<@ zYnxF#2+v$MJ!iP{g7XQ#2;UFG4pw~{RR@QZigU~z5pMWrg41AsYs;t8cY6A`x9!c8 zFFI2y@;pGdLi0T2KgW9^Do16N!wf{>3mHih@Jk=aNGc%I72xBKNd<6O1on`*6>Dr2}EgXm)x_`aTt>=#2dAxa1{_$h+H%Y&R}a%VwT6jBCoKHKuZzU@O1kYSIJ!jx5@rovV{i&iUupN{o{=FajD>U1q743a$0+S431zK^WHN86c zSp`&-L$Q4KEzpkbOfR02Xqvdo>RiqZ(j8&gxvF*9pUb(F3DSTK5O9Be*6J z64<`4c^4}W{paEkb-@LM!XlCdgeH=EYw=4;8HHar!kEX(C=U7FqF=nTcJaO*?}5=I z^H>jn+E$hW-^3xB06WABS`58l`0CVP@|LLaM5?H|34*sT0s*e0We~j0ATajt$pl3Z zbf)0tz;mvfo-;fHWdKVAa#ifB3NDCx3*Lnc_j_QQSOKjeoGCaH(fJ;moL&n#kga=D z%V(mp(DY(Qt_M7D$qN^x*yz?|?6&FDV-9ym@m-r9KJLTC7RejYrwl8!-6$7g| z0~(eehJ4`boA*I&eSI^ZRDdeL#PwUkcySV*xo&#SaNira3YihS-!q*IU`u2lu0f`A z2FnO@Whg0wWh&`ciL=w84GT;k^l_HMnBBBDXzF7hsTRn81Qq4u({{Yd2ZRb*h8Xow z|6Go}D+JlWuOTjt$9kAHviIQ6|Wt3m7!xg1AJ zoe0aq9F$m0;66;?;;v#zT?RY&RC_iqEGAhCFlFVqOVM1U-tN=PVMwD3%JyY0$3d#j zm3|O=W7%8KEZUVZxy0FxDyaM~u?@$2Dtfo#hUP?|#fV5aLug|};3Z|Y2j?uP(8>9EUQI1~i>PU;=BiR1vqsQPGCv{IGK9XoE z$s?l7*ZdPW=fLPk`M@Mt;vgT*rxML1d4LKT0|%KU(BPQPzcjzle8bltFG42h^Gg-5 z$Lt4i|NS!w6R_1AsF8Bp=+t#?ZY#0*agXd(FmVJHY zbiepe{bDRjOA|1mQvEbuphi0Q1S{ z4$KO?F+P98u`QB2Nn~al!xl#t8hF6c=NwQW0~CH4P=z3M0X4p9tcPg!M)%K*`aL2O(<@<`#@Lj88rb6t)nTss?X0;VoTHK5NdA9J2ZPeChxp0*m zfIVW*jTk?8@$|=wP`(Pb$soQd$37E)y$y~(?0gGrevPIjLORp}SvE6SD*4MvSBgW51l5&_2O1Sq@)2hidyQyqoJL)AA{#=+;? ziKe{@w9C&!2%y*(^!lFFeeJ z+iely_9B2FfkqOW6rF?kCB@}1`-Q5bek8*IoO#OKl)js30SS20ZtYVC`*KB~=$35{o7&7yY`Yrur>10Z-9 zrEr|>b>N6}DFO*Yh1h>RvA?L^ftC*yj-Zo=HyJgLq?*^aun7p!NW;VfnM9@u#=qpw z^)$03@jbT@M#*Epqzx>S_9O}$C1~gEDpC-eQJi+*WJjGO%xNVLveJG`CIuvcb9Pa;Gz5i%gSjTNqmGe0Eh}ctqjCho97Q|t*Ag)YKucLagZwcLl2(t)Vd`2TD zet||R^hSUvmRif&x#qlj8=AWYYE^UKHw2S+Yb<@#xreqOpKEd-tbPe_W&5>6m${m? ztR@12L`7WR|G=-7PV0BzSLCJC@6&40hc6jIibtGT?I#`GS`0qQNGc{sl1I#$bx#v0#mMA9iDD z{4BsPlTE3_<2GW^t~)d8GEw*DUE=WMLYo5@6M?o42I#i=^@Ak;XqiFgZ%& z@2bBowrgCzZ2}h=${QgABZnac@@)s+Nxto6zxvq3Qt>c*$J!ge7m;uD{nFm#+Y3Jj zk|vx5;iBc6Atf*amEuZrF22I!?>>|v{B@k^OGmid0}OaBh$Kgw zuxd9A1zp+|KPvo~SU@CBQyL5| zDtZM7N+L*z2XPPrIf8GK6`Znlko;Xs@Z${U6*?OZGs<2^Wj{Pkz2Lc+l*T#M9AbM` zESl|yM6o^Lw<$J?^GO=sxs}fnp<0rk&{NgZ5omxJt@Gf) z8(%+vh+gUIXHX8TK!c?Wku+Nof6(B-VIJnT0t zLr|d_;C?A$%@ELgDSqBl-xAFXG7GQE3zH@Zp~zrJ=MRwI7li1G2J{ z&P%!y-jnp}Sxgp}<49p28K3teubu|9Ea7{v(+U%%h5#;@!1*%7Vta1B2kW%~JKpcG;!$ROa|FM@#WUy%Z$Hv#gKu0aT&PprEL5|z*vW~Z?7sNNAv<5zMt6*{O& zeGW~eDt~jqDm&E|`z^eH+_C3@I>{fHO6bc~vvDl}xQQK=pxGKMxO^6oWIFheTFi{< z#7i%r#Yt$9#3fv&c~2Pdom&cB6*vPZQQ3;wdOZwsh;y3#Z=rg=`m#$sG$1%efQ+v7 z;fj*La8#+Bp=)EZ&UpH6SW0M)-;hUjhH(E3K|2QKlAEF+)_#hXylBY)lFTGGksgvU$%j(cN>^`$Gdz5BYT&c{)K9C^i-3vzQgy;77HqN^+=b(0pNY)x<-dcqEspz z4mm-GL-5sTIUQHH7)l%jG^1}Oo7b3t#X68WqU(#JsrijTjMKhu=@pI2{% zqSQYW_*bA9-Xj`NC8%$4SfJNM0U>b(vI|s9sbtPV$aTom**{Acd;w78nd>ga5FC!~H?zu?;qc?DU_Qim!LW5hICuwTq?! zu@WjaO$C_s!lG&0k9GgX1pyLI$YG4^$cRMIh@grZn}Nq5nHf0#!+@m*l0zt;Z@{oO z3I;wtKVaGyhawEXbOr$Q7p+VCG$V1@7}aEuX%80C9-uCmZ zk=^Dzq7_sK%y~>hNvE!1<_lZh2Sx45Mbrq=ABx84x`Pe3huJ)dT3tL1ck-@=|14u) z3U}EXh|I-W%ZP5!L}uXNE0NZ^hq(SS2o35mfGKIE%r;4I{)2hFRgg;}R2ZS600HsA zhJ;rWV9TjFV*Um~z8&_9KQYg_mQSkSP;{OS%N1Gh673}=DO9NNn2x}Hnakx@? z>tS*Nxh#|A&3Tn!nMs!wkFda?zCyDXmc=V-B{28qoClKf~a+ z@e6ZdJQn`gG;-89h3D8oJ(A4i{@JMQwV)a=tok4&6iQLqn-BX_Dk8xud7_#K7b1Kk z7V8hN=o0Ohk?apPa3_j(I8prRRdP}UszvpQ^I>%N!(5hmjy|0^H4Hn`&kgKbs1Lxt z{9qkn9|wnk{Q-X+w$e1)mpoANxijIXS&gqYy5Pi5S1!P4iwh4z*BU3(@UcWj2eM@n z{7Y$^EF+nXfq`vjrdHE98A~EOl|;BrRO4V;4{~gNWsdWDP*az@wlmQ470Mgkd_Yxe6c;trMyo&M9$5u5v4Kk zcN&DsUTxq|-b6+>Vtq~aa7J69;`fvr<(I;v{05klVa_sY#tDfLAo3RIn`i{*j0hc^tTfr0D>4bzx<>jb!`fX}lxTo02BZXzRP zZ%p<>4U5sm;oP@4E-A-R<0-}{x*@8U$a_lX=u}vls;a7RRP6`kA(T%iPcV8K(Z?OE zkNjQ^c1{*lV~)~t8eJeEr&Wsyt1A`?zMpt&2Ol3HpQD#Wk;)_XGL%{YW0UIq}hx904n^L0W z>t2jIUA#i~I)vL>+K1z`E}hgRDMg2Phtbzl)8QIl4lc&>irDcTCjVg1G(;~v*}3RV z?N#*3X}fdG$02%i6u_*@qs5T4kl(aC@@o$eyxwhNaXJaew$UlO zdE|xzVnHNz60=$C{2kAXi7iUZ{wgA7u`j_VwZ2Ts1}BEeNAj1?Zp%sfbd#@lCNu00 z>?&H}z3L4O?A)L-ku0gDnDnJb>3Kts{ve7G57+5X)TU z85M*Iy1_FCq9Pa45YhpenGDQT_EkYb>}NzD2Z&tIoEvcq(p2=i^iv7n5av6mQrb=z z$@m!LA@9@1FS&pSxzfG?Gmz-Zt@zAy72C#xabkydU$1aU)N=+`cEeXW>8Enk+v2k~ z=^T1g@_z{qz0y8IefamLTyy;lSfgjCQxkI?A9^05E<}M}RRz4CAz`+JMor_%IcgjL zcLMN(96mVbe?lg)>9{iq@(#?&6cytdFx+pN)q)K~oVpj#jW0}v7POU?tCogxVAdo5 zv6q244z0HLGDxXi^r)qW9}nmc6kLagF4VMs8FW4c5o~;EFGnSvy4sLxVLg{=k=iyNbW7}jAiIw+di{NNPLr@hnq<*qiF+{vPk zpO4m_9B08)2`kJ3Xzwv7kI8hV4H$#QO!HsIRYsp9%Dq;b)J=#7CScLgT|XuT#IM<4 zMiKo%{M2H!ZG|c$ym<)6A`yk{3Ge{EtV?4PL0Tf&X43Zq%yiKLMx-BbLlNpvqc-ff zZM4Mn|C=JXs})<0(F_5MVQf}0`|d8S2(Xd#g6=fJLVG^K3w~i8PK?nFe>4rU?sl24 zIQ^Tf-MSk5koDM$3HjG9L`)U#vS^g*{Air+vcLhknSRU~IC_FBEy%3I zG?8PN(BasRP4fr$k@%EW){t{A>=bbB?U2(C$m$CVFywHh7#zOq<+NR4=?VJ4tibQq zI0)H?7cNZ6K*0?G>YNbv$5SNSx*@CM2MQ}qb9^N!NW|SmtrFCSmSYfFLyRe4R;)V( zNAPMG-e4CwCgG^kuzi@&(EPQ@UC$Y3CJ=*m4}47(V|aG3(LoHr(`z8n>dxCOM&r z{L85zsoiIAzA_)a*S^PWq&+W!F(3GGIkpQGCrJiDJHSFG;Uk>!Vpn{h!K;M-j(wg> zB=!5WDGBJFMb=rqd4X0jlx;(KvijYDI^kpR_u@xMEI>LxOvYh!ILJ=N9ncQY(N8FL z?3@ge*cu``H3*x{?EoknBIIW9IXrJ12aDh{W5yOhOlWF`8ziGEF|{EO0yrJHXBG3U zZS9ZKk>1~9-B05m-$K{U;Sp`sF)TRHUa|g5eohL#FFOtZF*QKUJ~^Qg-7aPKL&96W zbO1YK_n1w0NCy=P2h8$K450Mnz-Lesw4YKV&(h<{Q4q(gsX4A=YEM#Fji1Ota}j9T z?_lFma2M(n*+16Gn+$3V0_m-3ND}DkH}{% zxjOm@6=d^a>qBqr;=*fiXGXu}P^Je=_&GjUZ{~L%1|e-yQcGt7*2EiWT!IH6nRfu^ zv@@VWhGS2U``Obf7RgxV*3mkt4;FA3*jPxt+A?V`pu5i0Z<)44eta zv5F_gVuOiQiL1+~_$N@ZauwX^h-E(PAEeddDh7qFKSjIR71;fZLY3CuKN>B8{+-1* z?|(eTj4t2w{#WPi63smxYK>$EoWasyu>Fi_ z_~^TVwt9v$Z7iw3(I{)V9GrOuk7&Hr^y`GT#-4U(`20|`P{*BZvuNmi}?vgK0ZQhWTd3NM4Zvi z@2P;#R{Z~=?p?s6s;VAox{1a{r& zuPeK58F3NoMi$#8`CMVyJ^UAJ2l zXDq|SfqsSgr>%H}*!EdYZp1Ny&NhIf)_}^OrG%kn9mnE}-bXS9#LGg=G0G1&$b1Os zO4ZPt?nx0C+#B`wV(yJ1el>lHsZM7-Z?rO&Hu*{#1a4&EG@`{r= ziVoZK6Kp^wRyM8!7^?5aP`GVlsFsWX5fj<6VF8ZPe1;txmWo{@C( zB~!)lUyIx)d)?^)Ub(av_ZF@%L?gkkK!NLc6*_lf!<_!ZT~wH{kK_>YuP&G%8V%H) zJtGkebCjkrZ585FnmNAVY|ZmCe9bs$s7RH+a59c^=m?=FC9c&ZF6n;XRI44Yk`!6>0JCLQIcKcd6+i zT%yK|vQTf=W!K7A41NajRC0!Z8;$_wQogUhh$C*kgqeaG@Fr~|@N94#F<}7X0+@Cu zz1)VUjv&YU(l|Pxv&~|o!b7cZ5r5s>ScqDT=LVu3^ZHLQ*N?7`A2%UhfA~ zVfy*(Q&rl;hUxt|W(blB7SUc|0@yhQkdp%dxIgu|AB%4EX(wnKw>|NV+6F_!M-sn} zq?}j^OtEu#RR6AX7C-SXAe1v>=-Wp_|s5Ev5fM%*cFV!Jk54qE%sh2xAelDf?6JR^W{7!pwie`7-9P!-hz~ zdFf2oP<5JBVH?7i^UncPFcY=%d==z3hiWJ%Fq-k#RHZjB%6PCkrW5N1w!bzzOlNB z2PJtd8#mB~!SYV>dAqsipJTxC& z{(#A6gdR8bQ%AJ^*#76D|I&HyYa@@sx#(mr7A#SK-ByDlE7I?1Q&EM&_+6MXDbCU_ znrFxtGXT=R_S;X2Y2U&)TVDgqq)p{dMX<%0bzsE5bpVB|`k?p^km8yJhOu5m$y<^|^{kzRb1_vp; zQUBYo^uGmB{qHe=LVbmiL(~JGk-sam8|80eud|G6f7qtiGZ74c`HQ}2D?cMyBLqu6 zhw*M%C+dr4&}n&dQMUWen}NOsHB@AzE&rlyw;Uq|vNiTkCr*%sk!l`ap<06_H8$d? z&FDa?whRU+6h5jN8M2W&J_J={k-&{a8#(UC7^x4CgyGT>Y^#={E5kY61_N6f1iPi z#08CU(W$lsdrjNL3#KXQ_en*+|APgeOwxNlZ9&%=f@+s>cu{4Xz_PIw&$04&P!QVA zT7@)8Tw5gJ!Z%M!U21~^>wJvm*hbqe25 z3&JS<d}*_F?Q8IG3m9dpAs&z~t|2assFR3(?~;TC`et=Cj%o zagA_|GXw&Z9N1ro8D4}q3aG7o;)tE(EkgSem2NGf$hrhZ$av21(Z(a!w}B6=D>^>p zUyAQADm{O@wjx{LL+A@6zk|mgtmq-|)5bI89omj7oJ00wA$ZzMP|NJdz8228m~DbS7xJJo2=f!BS^dj4;<=_0bs(W*6Dn;9AG0u}#alan*W3@Sw zoAFw3NgmZ>(^|5Nf>-c|r`cIW-2dC7L6vzE%2;%#D!QwkqH9#qv^GVee8o0`ia1YU zfbWMYyQ=THC4RRagB%aG)B&VmioU31lGP!j9;qT_e2j&-GUoGVE`R3m=QjK#^1P@K zhpT*q6am?cA#xZO$OfpkdYEWHBsUdb&QLo?@Y94S45h!M0Oe5~5fceZQJz@}<@ifV z=sJ!A=>u~aIb}I);9H4ueyDNRwQVK~gds4u2-Yip&G}0gh&6vPqxZ~P!s&_>Ry63E z$tJgPCX=3YMEoFawN^g|?6dsd{97uu`kQfC`{Pb-@(-?g7}DGs~A=BO>0`@5;vD-koj zTSUZAv~X)jAaZHW zr!4ta?d0Koj(IPmhI^%Mn5qxN(SCf#|0tRc;xFJ2Bkc?Xld8GJNaYR(jB*(z9wnTf zpE`9lq)QfNKnX4k57xfG4;aA&PLDFSYrd%S#f$LbRebRVyhth3fRy%eZ))QIpeULt zMG6**qCsRJ3V5}bN~F*ik^ogD)It_ANFjNJB=uTM5f?3-!blX2e97R!kP5H`Lfc~o zV)&2YGdK+u?@JnRA7j^&u)duHre(@@Y#`yHKsFhf8-Rd`5{6GM#w4*cfJAYYWmJL` z6Lfn;{o2YW=-UvDltFz^M?JHEbKozi5%e~)G0Pa#ab=I2juLQqjLQaX*=9TH03z$| zmJ-#i+AFXD8}nmEr0JPTKrMTKucJ$)#0n%vfJnf6L)RL3iL=*8UA1yO4cCM@PC53c zz>r^;Z4){p8;I44vy9ttl5YoyUg29we03tMg6W`I z+6!ZGbYGLue>sl*9j4V6lNwepO74X0Wm#JN6}Tk@R!GRl^9or1L}dA*F5_v!h1x3< z&oeO$m2gJ(VreT!&)XecBJV=KM4!nrwwJWmA5zcC*JNze#;AyWo6D8Ss((1I50kRmAkPk0ASrm5IJ^=n4EskFh)0lPUEil&fK+&18jBD>Q`au0x{SH zp}COamE0)E>L&Qodlue%QgGF8g7(7no+;(HcUQW5z&JX+XJ?+zdvSGEN3D?mbVfrg ze@vi>c+$kt3}2OTicLcWsQ;rV`PfmSR=EO%Onisy5J#feOaY-oOusz`A?v1)-FjNf&3dhHLVaN75oQlQ7W4` zH8{Q(p-5Tvpzqwf$qxKcq0SutS6P1-;ZJn-jyrnHG047Xr*5n;S-r~ffLgw_oRg8T}*h=OcfQOHYR)$bsS>(x1MM!MjtLa;`$1Y1x=hA2R=ysFNs0jF0m%paq}UUJ=3i&~6d5)y>m58~v8 zMvN0h@5ggugZ#y`oT!nD$Kzk05(KZppO}J}OAPdn)H`>?zk`CQs^FS71$n9% z+W%FY3&S(ajluUZdZ-9j>k-RhtmehFU19~Q0T&kFu5 z!w>Ceyq?dWx%`>KpWFB|3qL5Ifj^>`XK}D{C>62(Sj6=Q7Q9>w>6~*VTnm+wxtAGs zY^fsC0N>*mm{1rFe!&Gf7eunHs)P$7Y;?jG!OL)TWYne`dnKzP5+2*kkxb^8_e>66 zhmK*8@^@a@hSmE_7;Blb{{Wvgq@*F6lgnS26k3B{9Ok`w z$<45SGaq?323H|64#91WU_i->zc&Rb_nB{JioZW{h3wUqGfo(9O&^29<~Ou}{%{<3 zm-)@1VkDOiqipGQXlnkgMGf7}W>SJvs7v@VtNtRSQq4c!7GVKp>e0=SN8T3Fnv@l( zvI&tgU*<^l=wj=UIsWi}8c2GB@#oJ|_=$CasrBVDfEHO_g0(^<@vNemYru)cvHTju zC8Q0~cN;%4uoxN3an1|0S3U{ls({0rN4Ip$*F#Zi`V9Q32kjOCx_xaux(faSI3<9@ zVrOk>B$kZeRX~|Z1PcECfYXG(j6A6_5E*}LP)JLHnjN5xhef)7jV%qc+kdYOzJ&F> z#_6j`zz=l>MDN%4HD7gL{IIHkHY5q`3;3$GLK2!%%Ikh4%m{N*;4x9lXdAx&j#+Cere|foz zb#Ga3v)M5kM#YEJJxuzh=ok5fnsrr^=R~h{?;K)|3pH)^c4Px0R@&s&!#dGCD$*A zdqe2L8gNXYPCYKzqQ2Og_=VC>PC9iVmrN*EXOht`S60#=FpMgGG-T7`zcfPNH8=43l7gQ>ASULofFgv6=jpYrf z+U&Y4?iPSJ+7swXE5G0%h7tG z-Naaq^;_bk`dfS94`zOdy{OKdU*rtn4-xtUpU~=`Ksi?Q#$PEZJ!-QjCMqA1t5SI0 zK`YaBoPn6cu-qCOP@w!D7l8fE{)4c;Tk%J^8&oYA!L&0wKjgir2gCdYNm7T#{C_gPA#p+G6H-)SMJ6dgNO1pFk8puxUf6!7wxi{}wWiY9ZsO7Ur&X5EFFe z8Y>RTbaLmT|2*iX-vaD*+o)df!?kEkd|$X^h2&4n)SnRCIPnLngNKKz0Ausi)2i5~ z%}s2?XhudxHRjlV@t)bCAQs9N*Nk>U!T%7xGROC9;BS6U!9O+v|Kxc1%j4j0_`SgI z#UE>IRToyNf@cy6%w8l#dSUE6Xm!Gs&=%T_9nwduliUYqOJ{m*ZrXmE?cMDG@fpOYjWBgZpcR$MA~hpThcL z{A;9efo_*tJfdzad4zJM8s}dwrKQI$9#M|cHS8DmH-Re{M=!xo&x_@)p$p^q!zmA{ ze@IpT)F`X^!BRaWfU#b2m9LLkb$6AziB91^kFfrSSpT!Ck{$QN)&B_UPvk!dwsPax zJ8dSNL@H1msthc_^bY1A{fEbuahJvhMFg8_Y5h{zUzz=wjHv01#o#|(C1&mp1|*)8=);)UE7f$&D}G=Cp*ss`~)nDEguNh5mq=NGtx#$R%eH!1A{g#mcOT~$!zV-DO_!wtt!65um!6rR{(sOpmhYxx&235l5;g77JWtU3C;Ndx8d{F|bjM)~MP z=`1ZMEx0G;5F%2}LHUa$&+_+C>5-BCv9RRol8BYqw76Nc@Mv}|-j63G>KBjvlhhP3 zkXe*#W{HFU4kKN2rb>+KQG=)}=0cc*CladV*TVOA;g2kNBL%mqf{OS8BW;*4sEcw< zE+qW%5%Mn$3xByRT%f65LTs}P)remyY_i4-0)ruxB_BI9@9gzB-Re;gre8&r~`e_ux$IjjwF z$(9)b^cPMap93r<#d7mwW~jKV=kwdOD9OsnTbN7xxc?Zs!2~8F&?)p&+H%|VW=9Tt zivFM}fS}Ywomr=hgGpLj4i%k z^q&Z#WVJRmM^A!x27j2{MQnS%>(LK{J8+_M6mqfk%j`_7|D~((ao!m_!*nwvkT(}A zvudo>>W@}mf&MM-$qwZfBbc)v@;(g*|CD7`FdJ8O>4rtr>)wfCr?GK)!Aj9g3HfY zfg`56aCjUc1pY0$*ls+5v~=>In0tE{+A#+&hQQpfd$$Dkla|J5Wh9rWD_)NO**?x?)H?DevO~l(|E>ZH_8dvMD8eawwwl}_upuj+>*0B72 z?z0KVk98wX+@W(AHg@B8^{OKd-OC-6R9c9vFE~KaX?m@DyMkw#jV+SjpVqC!bC%{TQ@%9j+5_iwP%v10~`Kk-4$q|xp4a|`1(~M^IuG+Is7Kh!fRxgZ6$OWl*L4tm0 zq;Zo~JlTkvAKXVy(f)smenv#)8&XtF>zr4TrPU7uQ4x!ve%Kj>W~e^vkSEw0*8My_ z!A0t?h7j@Fjb|Ta^TeKyhw?1S&KS8h5K3_}XAw{3_6wEtKgZ=8mli1YrEHP;mw!t0 zP%!c2LZlY+6gX3X%IaP&Upgiz?CVJBhKW<`orXD{V#jXWb7&E^rsSrm&w~QjAGKHM;)aY&og_qZ925U%3nZ@!K@=o_vG2MI_B?8Anw|lfwt;FAn3=6 zpmz?y3&j7zD%B-Wb#$<&VG>*{64$#0stZa`JU4@?!~}#dCb{XeMBX1TCQ<;yZjfk- zmI<)IR&ICKed+j4=9QQ(95fk!aiR1M*p3hto|~N0n5+7ZQfT|$jS}e2R}+Ls*Vo#N zLGWn%!UHTp&HuOB;Ky2W$4veRerm_Z;Ah6X|9kjZm31ckOqC(sFMB2gNm#-wb7caC zj91%Y=&KGer0|mp)SL7p2+_$1p{rDa6TpO``!4gmw-o0i-UY{4S>s`?veCx7o#k3J zp6qLNXseGRV?P7~b_P!j2V4U-bA&-ftOiHu)zL!8x>+tVl-O{SKx{-qmhsCS zZScu9vdG_q>pMWKDUOKW`IlMqo00|yMrt*+|3yiYYao0uBRKsqNxpY2T5FF5C}6sE z08HrT?Fv9Oz75gwMH^h-0gzG(xH6&oEOLcc;QZ~4VKOT2R{bp@Oh6}J^(C+bR06WV zN=92fccABJlA~enK;84>G@BdVlr8d&vhVey5(KQPxA97b4Z9pX`Sz-5X3dMxMuZ7; zCldf#N^0*J$Y?~glLz3EBfxFHO97WBZ)vM14fK4O)G!H+tIhPPZ6iCb*${Sf$AZw7 zfi=f4u;VVQyPUrC76l+eWvKjeY(9s7rS3rW-=ycYKOSfcC=hc2V%a7Oe>o})NKpJW6lMut!I@{Pyj1)&!Crm4yM4(Des_MC1+sxD04 z+1Z@EhcJ7u_RY3q_RgmA5I=k0=j_$$n8BQbSfLhWwkm{xjRVd^-GI&9q@QU-4|h&+ zeS<>i$g8&N=9G@+#?34#JbmQu?q?Wafn6+7xCa z>~ay7MTg)x5tV8opegEOk0O`5*-@1wdpu!`z9!N^#mLw}VPvxYE5Z^rfH;B97EH-i zC4>enTAIT0bIl}z^yNttBnGwu76Hk+M&n)W#?=-`%oSDC6(B9j&J}1x^n(jGq$8x3 zlRk{}G%bQcWI9RBY=K0)l)S-pM;GNpD(Qe(-qGBKoP}8iFK$;w68?Cd$sZwYxEk?| zcLZdU0QHkGz&An4s!Q?|^k5&UvQAAimK`+lOQp0hEugQhHUHDS*s8iIEfzrI_06$h zg&Hhospi)WQT`Y=zxJ<(;SNU6kzu1MopV5pGSh({-#h?|a1*GU$y7HzC$J0`GcBkA z;&AM_m_kLcj~#8Ub-zOlRJeRsm4d*UihNgB1VCl5j+s}e`H4_oO(Foa#zL?xxgrvC zNEl_o$((uq)W-f3ZGva6Dfiq@B6{k0gs#y?%!trnZv5p}vQ8*|muSRur}q-BJe=O~ zX;{W#v5>2Kv2JJ{mjP7THjm4~zX1-DfPgl14&2QsekFDoFuuWs5msjnN!(vGJ~v0l z2lg`XjtlXCif%xwOXnq8fDoNY2?~;r$g~|VSv>i{3e_-BBXfeUCdxFF(i2)cyV(5?<*k4SM(OBJ$?dEMR9F!E2XxKc2Fk{331Q%8j@%J=2E#HKM zw7Ju;{ytDmz$NCQ&`y!V)cC1K{$X`&{cUEswz_a2;wl>oDQ9wS+z1X0Mw~RSGmUg1 zEZxUrh_)NP&S(K!UAo9y++X9c8`s{_cEw}-Ze#3N5r&N5or$BR#)r-ka}J~TQT+l` zZ^*H) zU73k!1ki!u?>az+G)8X*v&S&nLfAnC%d)4&ZmUKpE9~{gxl`0&p+7VQLZX7#V`)oM zAXsscuaMHL|7aXpM)`9vIZ!pgQ*b`puI_q|bJ0qk@q96BW`&&f zfxzaJ+**vV15D6VjI22*8iMGOVqah1)Mk_kOIC2847D2HuF>)3{HreG+;exXtr=vi zo*tciGVhSzH+A}YlRUA1`&Lyyum*C+>Rt3T9s4`<49tI;Q@aUBIDGzSXu7eTnCq-a zn0>*iA&wm5jkyYOnB+0D;InnsEcp9uvpiuIfWBdw%ip$m42<(2nX&s|aXVf8iSn6I zyT^LMcwqo%9or(2b6oMNOimy)^bft6!)e>>7-S3HPSzRWXPBQ08)NYo+>tOrh`;$( zegd#bQ6rcSQYd&lX3KWtxGCb&0s(zpREYH?G&y=Ra1ZbjRs=?JT)UxP#Bt5&jT*no zcJ)UYE@VARt-KQAeIQyf?gS&igYx|_rZ!zgV=A!XDfszeQedXJOew<~MR-H#XUx@j zOW_VeBG${v*p*8Bq|IXhOC=~1E)qIBwy;0csz?JQfSK50fnKg5LF>of(`x^YI}U@+ zjA;z%eu58xGuq?M=`#`6+l>KUzzX;r=0s%XOPK&NhG45Bncwd=Vi8=Z(9|i6PsXXw zzzt>51t^M;ZTvYnKq3FWG^e=`18jYq#B!~t8EH7Gnr%V&^`h|8z333NOb{7Pw%M-v z#f<|o1Sy{KuCgE3A6QZZmHFM{$g%DojWj1nud-QNj=j6I@9#g305r`5S1^R{2sX|$ z8oTc|o`4%f%z~4_u2S}gehnuQX|lqYG@Q6GWjP#1yQ+TdDfp_DaCadGaHxeiurhWh z=yL`tim0I}NQ2O-&;>JsVi#iABX7T)q>V_o!JdLYusZ5llhTa7Rt4-ZO@l4LE_l;; z9Ii;z{|NpV5Ao-x{Bixev(2~)KY{2hF|PXu5l04u9;5{;Vl+WTpDh?(OMZYwq#td9 zE%S3B6EJ@~IluNqPi^^M@TB%cdi8f}Ph_YBOtAf3pw+98KONJz#6iN!fp@1bDaKRd zurZ}0(q?b1#zBzN>>>ER#BM^)=<5dgzO~u~j}3OmL679>w0anHfON;v%~{nwxs=6* z+3ScI#YTO7@ywWLJph04ryl%QD$&(jH?iSPq%8nM)(S5-1W)KmgTh z__aX1Ic9Awi-mD#u|^;+2@(n83*rVcggt>fLw_|M`5t$(xSu0LrK|u`u)i#)bJhGe zTYsQU7tl-8NUiU>^>O2GkKvJLG>(Fe3I7~w(ngNq|4SF!T85mflz*_@_%n~-tRbU% zS1OSRy+`QI_+XvcWauAJX4uY^qQ5x#Mm9wq0*l78uzJ}e%V=nd!?~suqt;HQVVdA` zrP&MfPq-0lGr7!#Ot>m#J5tyRs928f0tN1N7ZPZtz(OXK2&XFt3{>@gx4~L_wcM!s zgyF(`#daW+Q%pfzgGQ7#lm!{0y|}wjf&ra8iyhf{$9WfZ#@wr-JM%CM>1F&3HlI<* zLO0(Y2sB_zSr{m7jlrOdoB%>8X*{?#b_fLkY6*d}v43gHY1OgDP{hE02fxTkn}(dU z-;Ce!QT$T#iAS)b$wKhm*r;l<`#1zsAv!aLC;cB`ShO)?_!qQFonv4b%< z4`PSSWVN;9ZZkbDEzI8y(KC*|7Ii?>o9KGPJ}WY4H)PO;t9>)=X=00Y<{xptN*v^f z4T;NUtet5Mp-bg`=7GFR6SNE>aX?4_gow&e!BE0lv_Zn#rRG@U0A;3*=%Ls=IOd<>RER<3iPTTZQLH>`6TCVQ*x z=*90p6m~P&SDj=x&Ij;dH%@PreX@6v9dO5sQb60DDDA*RN?Ob@#{aE-x*^_jg0EOA zvZ9|S0H7&9p|H^i3B5{9W*%Um0|$F9#**#a(Oitl6h|}wvQp{|dS^a>8hFAkJVw{X zZPV{P!Pt}q2p1+Z@lS=dMf=A#y?FyB6XRL7LG@e*nzg|LPyC_1UB+DA1Gk(S^vn8F zZ@NfwYCiemB%9G|YFiVMI$YuUXWR5tPK=TH6YPf;6NOsLz3P83+J8)CuA$NY+;R|a zp7sLbDuT&08nYv$?=-FslP_hfvdRX<<4lAMPr=UjqsyA{aJ$I5NG)ry6CJrkypuYW zV?l6xIk2^$Gm;AhLcOp({ekQSqxJm{;m1f=_>o_qrr z@GnId@Rvv&!laCID(e6$mf0_-5>2NY*^FvGau znOOW0(2U@RmQ>PSIE(m#N$t^&toux_-t}njxUwOGs>EThO9unS7>>F(;&qM!7iEOT zf>p5)66+ZvKSKAK{&((xHDM@W4Q1?J1-U5rUZrqnEUJG2gT!IO^)s?KLl{>Y&8Y8Z0VQR&`bNFr-%>i6d_=QtcgWSpEsEVZF^n&W^SRt15(_n9$nXMQ3Zh`NsSbGuY zrOv@&S=y>Ma9~Sc9N0pe-3Q|OTGR{6_C;h_@m9uD%Js$bEJC9Qiw-!Q5u*)7RueY6pmH@H&N<=p{`GXC&%`y(10Y7w3}N7elF zMaNg?_?B{fG02S1``;N~$Jvf=sY#CJ_?D5s%J^1B#`l`I@r7^mtj4#4p=CZwHM9ir z?1uIPhZeLV-gade=FpmkVVHD$PTGaXVmY`JUQWcTrc%M-q*eYKiT^Vf{t^jjagdlv zy8C}R7}ETNA&ud_D!-n&KjzJ3YZ7m&)g$|3tbH*nvmX;qVeXIdIWoj9k385&ble46 zN;A&J#jM86g;K}=4}{XOOLYwTgagi+onahSb*R|;2_4EgN>9dIucWS`yL`8Bu7B)G zE|a+)4MU-WxuV#Yoy}RZ!Iom(wE`R`Ggq|p{Vk&_=tt^WQ zaN%2|j6BXxFd1nb5aH0M>X~c}EaVO_f<-u;SRz=Q+KW4gX8QJmll?^nVCoL#J+4Zf z>?<09VG=eI!wF!dXbtb8{e+J2ACP1OSoCD5^yHOtuq*@X51hZ@?pEx514pU`cVeK( zcRoY%=CMPSf3dJOeA>Mb+EB4J;S-lO;ZX2NyhXk2m*}eHS%;8Po^_DF+B#%xyoBVS zUQ@1h?nKsB?NqMyYPjXawLTUMm_)}A8X#w64AEhO5A0tE)`y)8TuFPOBqh9|+*^_o zLO3JF5h`1`rzXYb9$~!EnRrjce?00V2v=XJ{%Omnfw#a_R|=O7GS3Lw$1}F4|M{kW z^kAo|8wmg;i^!AlxyB#APiN-42dIg{^Tjf%qx891*Qlxw&R;UdY>2Us7GX{$5QLM9 zAUf+0P(k)z9E&x@g&h_bCfR@};IEJM?j~1F=S-+kOAsIY^>%@-kkADP9@mS6i@Jn$ z4S2gseCQ+a&xoGF@W&$Mvv-(2d#JUR&t7d9(_WaG65dwsotmP((34{UAA(8j;?Os_ z1$Sl{k7J9sVj0%vFEjw9Bg!(AqWbWk+UFahs0M-ukew%vW5nOIkq@~-5?bAC8P<{v zQ|#*lb}>c5xlVs~93)O@zsnhJg3RT--{nd!Nh3Yw6#M#eqHpB%ko_UW*j0{vVDJJE z$yp>6H7zku4v>{FuxwAUKl?l@HU*Jo-}Mx1e3Po+`LH0J2TA>=F$(S!)1rWbonTZr z&mOv%_|S=kGDQMdBb_jQlB@9HpkfRy38ftPEb0c(BZN?~j+usU7BMq4qTG;iX0+w( zPiE^ARO=Y-(P;gEvHE4UZhF)~Xw{?bB!=;M=7FGntTv-9X)ow0;jQIf9YbvoHN+w7%Q0d8qp!MypzF7#)<(mO! zKb!eSW@m%6?og`VNzv}0`n^jU%R^F+{y6T6T>nGS|6GGGu3TEj>VK^+?{=mCF~ec# zaso);o$IYNgQ9J-FI!0DyVw^V*;V&0kRRk3fn*YuoZpz}nBNa(*8;bC7#5@H*)`S% zm(iYrgL_T(hj4w;Vkv!D)-?#}a^Wxi;G2P?3I60Olt1}Gkrm>##-1OLxKTQSL?N3+ z(Sj9k8OQcYgzZi8_lJ|k3R;2Z`bL6K-D8q(I*fMDzDOePHL1A>nIrIDs25twGfobV z)Gi9MFzCL~b(9L+!nz;lrd4mj+W$?Q-Nj@Q>2Pw7t`(LCPB%3L&qAquc3OLoW}Pxo zbmcE;vR&?m^8+701I5F>)X!Rp$MZGoPSOA5h-&m{srEu;C+KSP@o!0a(-+A_SfUjT zX~rK%3jXRz2)!BmayibuK%^uD2B!+<3mLy3@v(4~ULjUJWtZ|_i_HZk8QQYPIPzqH zFg|d-2|Iozcy%>J+hvj9wqtuG6c-udwkTQR1*JlORfFCchI^W%;$MOjc~u}E#*Kk| zSacmzDi^dFXcb;5pK{4JNg0121h9nw?)zq~?)#{)*r!t( zY;h$!(@gchiF0I2fUC3tPApuTj8ts$Nzpvd0bNDD>2+xnwEx*wburr^-4%Wd`H>MlogZH?^u;Y#z#yd4h@;gp0a!pRIS`bg^Tm#%t&ngr ze>!YA-KUnraHPGERt{TY_wsx_#m%^rJYWIy5^{fLb_p#oeRR*l(yRqt^`=8OUZW&q z9ydQ!;a@TFpOJ`?95F>PKH++gi_sv z1k{=fW3CtH!($?#@plsEKL-5@{n$R|8jGHt^~bAmjGTx#7{$Ctj9&~<__JCwrC&+( zo6tkBLkTY&=ZOZ@QFWlv3j(Zk4EBA%+MJ3{yKJ4g7exc2VjzFeEx+_nd6gI z2hDs!3*`c6yd=$72j>em06DP%O7~)iFo*7C&KE?$l_S3IIk|>o9_J7u?h~gqfR4i< z_%yI*4ZXxy{j)sUdy4(B6rQjR^bf8FJV%&YkLbNe&1La^8`Z& z4S?I58m2;IrejOsREMYF7p&Ti;0he|z-??(ON>(6hs+4R*)HNt0fP{RG@JJG#*X~tXf&gvGFI_T`;Qp@cc$;v_-%@gUj{LX zeu`0;hGp)S6E9bbYydi9+`b)71f;>L5Yt0rbR^J{Y4Sb|N#z&k;t)`_vNbWp&q zTnoFpwz>v!q?3fc9C;_Imkc?f@A=5w9d|*Po7ud0-B*%B^ZJ03h$BKbA>>zIlhsg? z7n*{JH<%$=7XgFDTbzj!9)kF1uym|iBqX;4>YD@mx1Qtl0j*E7Lv?_ipD};9s?o7= zy%ZH-3`)>gB}QpUhK|kn_sxK|0=m*|Zn){Ny&wC~u^E2=oMzVo)#)dJa`;^kCf8LT za?Cjd&LKyRr{JeM*fw6M)Q!&4D1x9k!Af+r0M;_86F21hDiNx(Q(NJ}l7JiHc_KH& zf%ll_qb`)Gh&!z*vAIXWDwNC(fyF)tg*t|H9NaELtwu^pjNidSB3p{NGtyC_Cb6#s zJ5I*-k+A9?Fs9Fps@}|~>bTH-393%ByL_d()3eYX*6Pm#NaliSFtj@HKafyAhoB(c zU=+zG!j4if_heGD)tRO8Mu(jlZFUBBDjgkivO}*GLx_6{W^6aHR#RfMz!6f+q2hLK zy+qolA8Q`)hqj~6tz)~P^b=XV8CK-|Qu3ef`IzVD4LFHVUPw{!B8k7@_t3s-kn0&) z%@$xdDocZfpx*!_@JS~!1>t!zioN)k|E{)TFqvm()QfZu=pV*&2~8`<0XmeyYk|Z5 z`KDpzP^a>M?84H3#WG-VQ8v-YWOiI^gA-tWV);rJ^6M}I5SN1mQ=GT{d7$*e65cY% z#4bn!>yQk6$Y~^T7Eq-h!JmQy65hj+Vi}DjzK?ze=b~Iq5S(mHT3dZh%>GYni|AoJ zsRZ0QxD^=J>P|pE;JfH!iE%AlC=#?+We*-if!I$l;P6i(;`nNY<}mISegC0s>A4UWK3t|{FT96{unD7e81slPXHXfA^h*f9|0rWO9B2Q$5Bo2lGk2ME&0=8m(Rs?$1 zeG>tZ4*03rU?U;a(=u?g5}%_2!-^2s8ITbN#e&IE1-A1LeaE&#gQ33((s3v!Or5eL zL%lhDB(S?#k^t|~!xMqn`N!^qzRB6RxOX=_(VT>?e!31_?5BD@R9edOAGOJD8*yw$jw32HD8!(Ke0l;8| zBHL{8r(iX8RG@>G+guRB1vn**)Kvzb0$zjeb;@4VLQ75=%qQs=6dv7B>;BkDE~%|L zHNjWH9aa5tK)IS?AX;oS)iByH)}Ba;}4gbS`m(7F;Ph?49Tt{y5r-(C!}AlH}Hvr6pYTx7C04d zVPPPcO+rWh2fPMZ*lbzTjlM6l0@DiAJkE~S7_3^UmNC*PFefOQM$1pzP(dJg>TK*A zG5$SBk~pJ<_5$<<1{>6X==U>P*7+_0f1-_WO%aQJo@K%Xy4E)Pd7ucaAjJ&=c7gGYT0y`C zNh@Ob5pO#NUd$4}l(Cg5ZposQIzmkH)f_=#kS7TwOz(1ZCd)W{f1Ao9IVLMAMF$HVMoBO90PO%7vO>cYf-pdK6zUoZ z4f8mHtsE%?YIVPy7Y=avE3m|7et{Ph=CHbM)Gj0w1N{JzRWGteopqpYS-$892YI=P zy`bbsGe$j0GD-~VN6Tsg84unUi{0QW)|xFQf8eVTBjBdmHvUme5%!v~?3gE*!ZcIx z0*bSgIA|YaSMv=0U^3U)tB)(b zLg$!jnEa_9zSmZx*ci$0S-;$lt*yQcSAU16fzVJR zAAgN%w#)iM{fr#-dRMC%;|0DxkFWJmMaPer5MX}>%dX|)2r6_)7$|zeQ_R#(H83|q z0YZSmHFnyyWd6ZDuB`@51{GVRX zzsX7n;dhj+_Qj3?NbL8m5}BjJmPJgT*z@ z#k!Asy3J%Q7|pp%*0SV>*k};V)-o5_TDI{FShaN(XPU`L&Um=k6Qa1N==LD2%AF2=>`F`a@pP@F?Y zEET6<=>%Ve=?|nU5K&+_%6uv0J`@RY1!Dc&1p&B&?2L#w<@9mpiPa0M3dv%^^Be0b zA<`K#q@eA<8z`O*@ob7W@N)>D5Fiz=+|)7z2yrlU1fup*3GH;>D0qQdBLgrEt~m1s z#1>1|Yge=(>)-@SD^&WyGl}%ujq5{2zsM4NCi=bPYm0t+BJ6=u?Cj~cy8M5WeuaMp z?<47oCYDIYioYFLBg70XcE1&C1tJEGc6wvEO?HyS(6riXoo14>tk3#wRbL2u()ZXt7JVZeE*k%)#^kO& zF$hi|^WAlA$Q=0pCjTz=yDcg|^rBRgiQoI_GawojpCsIT97?G1H3}Ov&*=jrZ^6AV z@*x;}#}Z70-gsiz$;}`l<#n)AzDCVvi~Nmc=j8ze8V<+C_8Jpr@r1Yl36t5==< zXZ-a=r2t3XmmQ5-{hwJga_-E7Mj?`jim{FLaV#lAajjNf?G3PLnsd-yC=;_@*_*uR)zDE~H>NNO;n z;dkcIjY_*gPbhaFdkHf?PVwzv9bUn^)#=vp zgxU+&O6=gZDG1@fo9~u;mZVUB)|T&wC<@(3Ts5L5E20r5LPj(`nq7;BoE;okhSPgb`u;2xv4X6T*-J!Lblu9AP~Yx&^9N7?sGaY=jxY3?!x> zU=q<|v#D&B>B#Z@q_jOg*SIX1@rHLlhxH^+Ei)5#qvbM&amCz1t3alR=3kjM!$@i% zMF7@dJH4CCfHQ2XGA@Yg)Vwm^Jr$&niYfl?owaozCs!45n9C%X=IKrZM$91WvjX~z1h{is6WR^cQ`Niv+7 z(Hn>je`@KEO(vlDOTR%J5=HPNR=$PAfo4i9T2~{?z}Mr4(>#(90>k9ABL(rbyhnh; z>hHw4o|QVDw3Ibdm%-csJD@MMIN|tP)Bn5&gKX;G(2Jpe?08b7i;mnzZ4^pM_n`rhe+YPQ-A8A!=^%|@VkD1nUIMN zQyfnM2O88o+<>=XIH)hT;Jhi9?`rZdGj^t@*)c1ZUtIKDfFWlgyQLgc?H!1$MA+Ai ziFpW$?mw^c&F+RwrTx2!#Vh|S_nuHrB7*i*|)DK-C%fUEQtPy7z5WpTGc62Hl?lDyoa#=m!xI&o!XYx+s<)NDuH2oRxj^ z<3##+JxU*2+o6waMIX_mV#oG^K59xG$b%>Z!i=q^5cyvqkj+s7`DiIX1gh{uVUS3kxNo z5li7#fd3R;wMajbPJ&cE$NB(X(o7J`=ZFEYRT&ns#D95R?3Zyg1N+%Mi9{1Lti=yJ zBx?Or5;5(4s@Crp(uIzi)S?~Cuhygz=&1hGA5@zxupIesz`A7B1K!7%$gFBWt{|Z} zZjlXcfeJC#$#D~tD&p9!EwV~6w*O73OX@{azw@$U>US{7n(qyIF8009kL2sbB@W;_ z^%CDhTxT@lVkx@tK$Y1ANHjno$%CQ$=_wcUZZ-8H=(%?OFYg6$EPP@!;834!9- zV*L3HViQzAgga#11WpShR0R=5k1s_(Vgj|$d076A9{Ak;wNfLWspz>cY7e zS&Z*TvM`~9L+|>5o+C*O*AGMwz^S<$^YyrYa=bWS!F!1FkNd=lb79_>EJ&P(BHw}w z;jTAhaoYRC`5Dcxikk8$J}#tehkwG)d#+yg(=qkTvp}qpBI-Ae6&TOXPlO=!J9GYT zOOy}o>JLxIEIb?iLH4wub)`R0odKA#S2d0&AphHcMTej|hq-Ag5u-4Uzy8D&62`&{ z;`E21@UAHw{WtZ8e)0MPwxf4L-j1)_u>TD?qvD`6hq*K$oI9CXgCECxSc*XHMhjMi zDOj3AZynO$3sD_{x_=zK@Jf7K6MZ`}?n;qdBPsUc70DFLD$<+c|L-P_f4lm@?<3>? zjrsx3DTvVzIwpYsc>Lp31P*;fN1zV*8^aua;LcR2mRyq1EGQP zfHVJV_nT*PeU*A=oS3tSX6R6TFEhITNlgXyqN%?BByn<<8MEWw3*Etn z0RlJFTh>^${y+71H9ae$`a2c1-M3i-@o-Po0iBZ=pv5Fim;Bh!IDheGB2fR0`Dvo7 z>_1fA5#9C8%DYTX?9FbYyvyVSeQCFG&>+$iG@$>Lq-g~zQ{g3I^&Rkr6hoUJv$r39$ zn%*90S5X)J{PKwHO=eDq3cB`3&|$j@x?%xZ+h#+*X>U~!eWv7ddDMRi(YjIsOJe*t zc4}i-F{u4<${2V+<|LGP?Y=+o5;k)&aN-n6T8C-=eN6tU+6Z7Ny%3nBaXNe{HF(ps z`Yi+>7mI3jOkZ@&64`Rbvr+6Ls{%t@-jK0*(`hE9ypu);aMEZ# z2jGk_V!h)avjlrk!$x09UT`7iGOq~WH)iHg^dYHN{>Ay7VG00Q2uE^+DU2Om9l>k7 z8YyuT#&u@$@tEl%(2>8)Xsc63sn=S6RGpcAdq(KD3$7IX9wKpi{(nWkKZ?@tAD)S! z-)@%Hu8{5hyQ%G~+ua8&GJXb*64TVFif)Q~^S?;SIHF6DGS;VOL(45^pyiWILd&;( zOIp6?+t9L5@kvrKwqJ={j-lds?0*0G80@x3%s;uc4eu9X4o+>4lIcHhRQ~fTqyFo1Fj}SN&S)OOe-2J??3?MKdg{U|Z;%l(&DC z_;#?K@0rDPvI`mzN`8>fE%nZ5TE$kB%UYB>akW3mcl@b`Z!~dWtm~o>AO+^@F~nR2 z{3+^!Rozzi)AX^!DvOLWq%V#Uw$gL+ivH4R2v=@z8@w)&@(-ezj7$IIzK*XkNEbHB;nTx!~zAH=(~H>VS^ zzeH>8sjTi%M0W{kV$92=35B!-_~St5W@xcFFK2*cP&^L!>>26%gXXALb8$5NTtw;L z@*rK%@P#Vs4qbq{N7{{7#oMBuNk&C(`dxG`1fvxaq0(PfBFx)Nf2H)RfbQ>(eLV0A zV_&)nF7?wOhrzOIQ`)o30jkje;+>xnh#pY2=~?FphG2zq@g$Y~#yEgtJ;rt}ZXlTA zg<{UiB*|_ck-`~jp;)~TuZTw`sjtV3QSrL? zG~Q!P{9HILr@AP_O1n65Q~L~AY^>fD3bZkZc(Ze8^j+Jx; z)2$uA6uLjYd9km~A8ocTXG?q+Tb7MKOlh0vyW73U^S#oY3Kq*e-$oMHXn;J#ZXErg ziGt9og!-js=)j%uK?`Ula&WNuo~%zUiu9j*a`UI<$S$<5YqLQy#trLETm6lQL!;hm zP!>R;wF#|8ZxP*Jp5M(qUa}J8PwwQ-XX2jn{K+Zq5!?%qH@UO>B6uy4rgpL&XQy#@ zME>M7H}<;YY=r#D8QOz5igx5y?-pe3YiFaj!0(KK-vRg??hzDmoFBN;-3XS!2Gjg$ zC2njTM&x(?v{HAEwfUSW#=^Cy!)Tz<9MWhPAHOk{tU?b(`xJYn)>jmKQ5bZ4B>e^U z-%Lg-e(z{aLX^aXdhNvP%0PMwFNiHMZemDDROaMZNU|CfkYmuqjAM%8d4|!WI0lE%J|GS zaRc`r1C6{X2*X3}0M6kw&X)`Z@MIY!J#DrL+I8XCF5jrZ#{q|0-EilMw|lk_`kiTQ zU!g;UiJl@u7v&ACH^vsUY(v2mG{Bd1BnbU5L1)|aRCyY2E@lGG0UNlEIp zne#}s`m!#D)abfW@*-}!;5wQrddb+t?z8I%{qLi?tgvOk?%yK6 zyJMSC^{#$Pms>e>NrQRu@o29wZ=4NSgBbvEU_kT3&$lLnP_i^(B z-T(QlBX8(C58!68?%u(2_nsI4RQs1jT9{*9^?uyC%G__Yn)RRd@1aOtJFKh0owiv0 z%d@U}{MBly_XpP1f2DtYA}zSAtKQ43tIRc4TmNzY=11!K)VdlxYpdD69>28e?;RPx z9Kqx(GHR&{@D0WX1oHN*BOmHJGe1%fFq9w4P!9e9>QW=Po$t9{kBp!izxh^MnV(u$ zgJ*3!>-JUcG3~1dG3}$SGq!KF)%#QHDs$F$v;D#Qt*ajQS(q5M$-27qq;-`iIB8Zm zxka^z8MIGkQ19L90f2m0A*m3x0ww_Yu|m=_>H)}no4zKzG2D9P*IIbfd#4`2w7YYw zJEX6%LC0xKZnc>Yi??E~e))zTYKfpTfjjKjq44`qqz5~!tKOY{I7KA3>N)+D46yztxOuMesgOlGdMt_FA7Y4s}4>Ot?jtgE>BaX!9Lpquk!xq1+# z&wr^082a|-M<1)L-Yc!E%ucVF?GLW8u6hi&+8;LCy1MjX>naYv$*2b~Me#dNJ&5A> zJ@p`p-x4$v#c#MVd}V7`i>FW9m9|FB*7~jK^D?Ukz2{h0nU7mngZEok!=|)YI8U*9 zb?Ip9s-Tirb0H6Hvvx1m{f#mcH{b@H+AouCH*U}&b(8rr>cs;HnS*Ku4oCGdJ%of0 zhu@9%@Cat0`Y+3TI6-FMt7n*jYX0@H;O@QBy2|XdD>8o8RgcdOt?PtgFm{yRH8H(z@!g zGt$3y#xJgagA}mQ{ym@`MEjS7TG5?o|0>l3lYfSnLPJ{-GkWBow%RT>Ta7h(XU{*c zwR+Hdhjo=XZjaT!HP%&+zef7^fpv9h-*(4uyaG1bzrU#m(f$oUt#SPes0UX6x-^Ev zNzX*7Q~G!ON}KKU)!%yl&5!ipDeJ2DA?qshmsVf0{!{s|H&U1Dbqi}7tg9Y1R{gyr z_>1G8`|vd|0o0iMb0R)fs4?}6zpDow^3T0iTfJRxnC)k7u&xH@?KPkExXXfM*b~;( zrEghRarC)SwHO`0i&32d(vz={~D}Q>?xWtFx{yU1wdz_3wQJeYAhqDCnc~*`yvs`USwH_i43*H~9QhFg#fn{8cP`ml8shu>t>17t<`Mb=e^>l-fFAX?R8Ztxz|p@5Iq zaFl#JYPHaN&RZr{GY?r;gG&!sBOPgfSfu?+@3A0>!|(g5y(oUKL3IEiir*&nAd25y zG!u{CaMEwv;@5V%>|5ivPoxJf>#FxM>nihj$n0O%x96|4quYz%GfFdU`Q9B9hP+eX!|lxMPV#qlb}~}}rAaFC= zb@`{E1y~739_1+%ck0bhb;PJGpW^E+O!R*96Q{%2pI@yG31d<0d)n%AB2b~yG-KYM z+kuBk*zu*9SMk^7{oIwmSM$FQB&zrVJ^!$_oX3NSLk2Kr=T6Amq+C|C-@5X5Ys+{% zDouF~eaI1}B|LUOZ#s3Q&fL%g_UK9b6(BB5R3I?TFxtZm_PsS~D<$q2c2Nfs1*Bnz zXc9@kfg^}XLDvZ#juPJjQ(+~&H;>^Vz$(fn0*O4DSLwkjarw)W0%nEd2P8w+975CC&|IpDw5F{8y|HYt>73ayj7&})|i%AwA zJVqa@oR3of>Nk-_#}FanQNW_NRVc&%qn^&De_!cr`m6wA=X=HeJ9(d6od34wcY``y zLw18Yuv;WT9k08R4n}5r)MRfQ`h7cy%>q6bA=RHEk)#+BiKB}MytrNNktnQ)7A=`gJva+V5BI4*C@cjsfTHNciKq_+Rdb_Kl6# zA8=boGNb8eFR@JsNu{?M#>UQI14Trg1d~A)8PhRMDPZ8L*+9}@2b6zp&jQBRu@5cx z#<^(K_|4#PcHUxITIz*YD^gb8562-IU55&sp4W!fF;RdoA?pC#Fnz*@U^8ShU| z;yKRwo0l5Molv-jC54jUICS9z@3slZgM)vKNbc#xM%rVWQ7>Fd6L37|JJ=Di^q-V? zjiFu>Zf`N`?0?Bs{uG@4yIId~UD6fV_7=P!oPw_e0FpwP2@hi6i*TC(&eOjre}mg) z$*(Qi3hFsUKv)*j&2z8SDI@#W*8FwDp^J}6i)G+3aB;GKAR`==gHNbi0;!ury+uem zxN&)WZ2tTv?Y_UT7q>T>Ag3o!NNPa_SLcw!;4S@op~G)Z7_y&0RUw4dH3Ws5^ke&V zkfJlZ!8M=-BGQ%rkvMfHlC9(c^`BPi?RLBV*gEoq?p{}Hk z?oHv0M47Cpi*x{>WlutnpdVj`YyoM!MouptwD2BM2&8v|#)4Buy_cSL@~y_|6r`m> z_=tso&`Yc<+4u!IVS-21h~>Nms-}~0`MPHlLZyx2rO8l(c}Yklf6u}z%%PJk#chTO z?rEIvtFP!N$+{}JBA<@-b8$k}}4HHYg_cib-^F$ziYX&bR$x0T#qf1}+K1B3+UgB%r z-CdiPbM*VOID%2Tv0;owxOs6HjVEE%za98CDxa8-$d5BDfX&hPcTXBpwqll5??6U9 zB&9x)vbcnjBQMmaJYXE4%8h|5Ay>{F!NrELzQ8#77zH zM_XvXA=qu%tl8_db+^`3-ps5SIDNRX(YEfc*;$wH7Kct%Zndquc-X8T^L96GciYxg z-%h!nngRSj7Zo0%0lgm8SD{J8!q*wk(6Uuk&^{ZY%op_HEuCunDD< zyR^GL;m=_}vGh5T-#RRIppu{71i|seLA-nS*X4!UyklwneLW2izW5kFC@*9=fLG<+ z%Tb)phv-C`ukG@6Mu%T_;nx?)*GIIaw>VJ6s{|lO0RGL76##Dt0ACP*SNV330H|^T z@P+{JMLS;$0B;BY?S4%F-Vgx3;DD?rDp1W{0&y5E-Te_>_)3tlH;oU!A`E*8!{KtX zlo0GqFK1bsFQxsx86AAd*7sgue)%q6I>k1DNwdv;(&pD}^If)i3T;X$+uX-Czebx0 zUrL+%q|J7|WSjfgCcoq{lV2R~u+4pJ^AoiBAt5p`t$p!n+b zCmVl{jeo%EElR_~57^;t+Y$U?Zei-JZF4K*sD z#RNnXF*QLh&*DadT1ByKyiuxF5fVhX7}x~Zu3KYk{o2xtt+iKc>!rxWOM;dlUdp9a zl(yofI_p|RTjgfW@BNv1p3Mcc{eJ&{UN5rGGtbPKGiT16IdkUBnS+#6<&Mbzj9hP7 z>_t`lHg$Xoi~T`0?;+Fm?L5ud?Gu~Cc3R%Ow5`1pi*+yU6WlNT7uEew)%}Tu9k3ST zYqwhcyy|{cbsubebuVq}hP^(mwCeW9SNo<&(@`AJVx0Bl|JhOgoL|JB871nJds^Up zJ^XsJ|M1XG9%dqt+7LP|_K6F!5HJ!%n|a!5pI+i=M@SOpHPAqe=`pLvf7nM27$lfd z|EKL z_8(UMjt5zhLNk$Udz>QV^rymLZeDW|Q;1p7d=QV$hfeY50j*D>**1R~bn~CW`S>sj zf=&8e1Vs&3T!E^Z3g7weQpNxJsyqc*{SWxz*hcR6uJ)sRoz3JJPLV{;g*NA;T+W5c z`ACgLAa$cgGy1yuQYk7Ez%jwyi@6QZsFH_Ddy5v00;ZSrx9y!|qva7go#Vg;+er8#kBasJ1sn7BKJ z=ZaFqry>F(Z(nq8Kg7e9w{!KDc&Y%!^`x=ALz(6144vpduPB&>0dP(BOyCT=^7B&( ze^MDTE4Q-fHXm{?Yj#^#)y2N4|K@e{KmADj#k1+^4oyf4+^Bg72+~vBI=xH(cPfvv z7&05D9;E!-|Ehdc(s*rBL=wJXh8=*0yh0E>|jQeTmTvU$5<=?zu)j zU)rUS>jV8Y0a^i!e@3`)>Y}G3qg(6qXEraG8X4VE-(vwWYFPG~=U(jvm2^u^=|*qO z@Sk0H^^dQs580O|uDEU8HSe7l!gn4eP@22$LJFDh#d6eI-BDn>x8}eCRxNXw7I(ok zqbrgR(z^lvjh*oSz~Mhr4d~gt;A|c`HK70hssRORz)Rl$r2$v?SGM|g9~lb{)&Sdo zqjUU?URuOJn`xD11=CKn=37O7qtOL}PN;Q|3H^Hi$z8g%yZ`&a;cw^!AK`>PywN;( zaQG|#GyKT1XFBLV!h;7ne^SpKT?Aj@3YfaNkyUdBRerRgs19?$?1IjG^AbxK-B9

|NR&(AQ4&FI(%anR5hCT-%rEoU>W@K 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